初步制定方案,使用过度动画实现
This commit is contained in:
@@ -6,6 +6,9 @@ import android.os.Bundle;
|
||||
import android.os.Handler;
|
||||
import android.os.Looper;
|
||||
import android.os.Message;
|
||||
import android.transition.AutoTransition;
|
||||
import android.transition.Transition;
|
||||
import android.transition.TransitionManager;
|
||||
import android.util.Log;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
@@ -14,6 +17,11 @@ import android.widget.TextView;
|
||||
import androidx.annotation.DrawableRes;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.constraintlayout.motion.widget.MotionLayout;
|
||||
import androidx.constraintlayout.motion.widget.MotionScene;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
import androidx.constraintlayout.widget.ConstraintSet;
|
||||
import androidx.constraintlayout.widget.Group;
|
||||
|
||||
import com.alibaba.android.arouter.launcher.ARouter;
|
||||
import com.mogo.commons.mvp.MvpFragment;
|
||||
@@ -37,6 +45,7 @@ import com.mogo.module.common.map.Scene;
|
||||
import com.mogo.module.extensions.ExtensionsModuleConst;
|
||||
import com.mogo.module.extensions.R;
|
||||
import com.mogo.module.extensions.navi.NaviInfoView;
|
||||
import com.mogo.module.extensions.navi.NaviInfoView2;
|
||||
import com.mogo.module.share.ShareControl;
|
||||
import com.mogo.service.IMogoServiceApis;
|
||||
import com.mogo.service.MogoServicePaths;
|
||||
@@ -79,7 +88,7 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent
|
||||
|
||||
private View mMove2CurrentLocation;
|
||||
|
||||
private NaviInfoView mNaviInfo;
|
||||
// private NaviInfoView mNaviInfo;
|
||||
private TextView mExitNavi;
|
||||
|
||||
|
||||
@@ -101,6 +110,8 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent
|
||||
private EntrancePresenter mEntrancePresenter;
|
||||
private IMogoAuthorizeModuleManager mIMogoAuthorizeModuleManager;
|
||||
private IMogoStatusManager mStatusManager;
|
||||
private ConstraintLayout topMotionLayout;
|
||||
private NaviInfoView2 naviInfoView;
|
||||
|
||||
/**
|
||||
* 搜索莫模块
|
||||
@@ -162,6 +173,8 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent
|
||||
|
||||
private Rect mDisplayOverviewBounds;
|
||||
|
||||
private boolean toggle = false;
|
||||
|
||||
@Override
|
||||
protected int getLayoutId() {
|
||||
return R.layout.module_ext_layout_entrance;
|
||||
@@ -182,15 +195,50 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent
|
||||
mUpload = findViewById( R.id.module_entrance_id_upload );
|
||||
mUploading = findViewById( R.id.module_entrance_id_uploading );
|
||||
mUploadRoadCondition.setOnClickListener( view -> {
|
||||
isClickShare = true;
|
||||
if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) {
|
||||
mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE );
|
||||
} else {
|
||||
ShareControl.getInstance( getActivity() ).showDialog();
|
||||
traceData( "1" );
|
||||
// todo 测试动画
|
||||
naviInfoView.setVisibility(View.VISIBLE);
|
||||
|
||||
ConstraintSet beginSet = new ConstraintSet();
|
||||
beginSet.clone(topMotionLayout);
|
||||
ConstraintSet endSet = new ConstraintSet();
|
||||
endSet.clone(topMotionLayout);
|
||||
|
||||
beginSet.getConstraint(R.id.module_entrance_id_top_container).layout.bottomToTop =
|
||||
R.id.module_entrance_id_top_motion_layout;
|
||||
beginSet.getConstraint(R.id.module_entrance_id_top_container).layout.topToTop = -1;
|
||||
|
||||
endSet.getConstraint(R.id.module_entrance_id_top_container).layout.bottomToTop = -1;
|
||||
endSet.getConstraint(R.id.module_entrance_id_top_container).layout.topToTop =
|
||||
R.id.module_entrance_id_top_motion_layout;
|
||||
// topMotionLayout.setScene(hasNaviScene);
|
||||
Transition transition = new AutoTransition();
|
||||
transition.setDuration(500);
|
||||
TransitionManager.beginDelayedTransition(topMotionLayout,transition);
|
||||
if(!toggle) {
|
||||
endSet.applyTo(topMotionLayout);
|
||||
naviInfoView.getLayoutParams().height =
|
||||
(int) getResources().getDimension(R.dimen.module_ext_navi_info_panel_small_height);
|
||||
// naviInfoView.transitionToEnd();
|
||||
}else{
|
||||
beginSet.applyTo(topMotionLayout);
|
||||
naviInfoView.getLayoutParams().height =
|
||||
(int) getResources().getDimension(R.dimen.module_ext_navi_info_panel_height);
|
||||
// naviInfoView.transitionToStart();
|
||||
}
|
||||
toggle = !toggle;
|
||||
// 原始逻辑
|
||||
// isClickShare = true;
|
||||
// if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) {
|
||||
// mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE );
|
||||
// } else {
|
||||
// ShareControl.getInstance( getActivity() ).showDialog();
|
||||
// traceData( "1" );
|
||||
// }
|
||||
} );
|
||||
|
||||
topMotionLayout = findViewById(R.id.module_entrance_id_top_motion_layout);
|
||||
naviInfoView = findViewById(R.id.mlNaviInfo);
|
||||
|
||||
mDisplayOverview = findViewById( R.id.module_ext_id_display_overview );
|
||||
mDisplayOverviewText = findViewById( R.id.module_ext_id_display_overview_text );
|
||||
mDisplayOverviewIcon = findViewById( R.id.module_ext_id_display_overview_icon );
|
||||
@@ -205,19 +253,43 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent
|
||||
|
||||
mMove2CurrentLocation = findViewById( R.id.module_entrance_id_move2_current_location );
|
||||
mMove2CurrentLocation.setOnClickListener( view -> {
|
||||
final MogoLocation location = mMogoLocationClient.getLastKnowLocation();
|
||||
if ( location != null ) {
|
||||
if ( !mMogoStatusManager.isV2XShow() ) {
|
||||
mMogoStatusManager.setUserInteractionStatus( TAG, true, false );
|
||||
mMApUIController.setLockZoom( 16 );
|
||||
mMApUIController.changeZoom( 16.0f );
|
||||
}
|
||||
mMogoStatusManager.setUserInteractionStatus( TAG, true, false );
|
||||
mMApUIController.recoverLockMode();
|
||||
// todo 测试动画
|
||||
naviInfoView.setVisibility(View.GONE);
|
||||
|
||||
ConstraintSet beginSet = new ConstraintSet();
|
||||
beginSet.clone(topMotionLayout);
|
||||
ConstraintSet endSet = new ConstraintSet();
|
||||
endSet.clone(topMotionLayout);
|
||||
|
||||
beginSet.getConstraint(R.id.module_entrance_id_top_container).layout.bottomToTop =
|
||||
R.id.module_entrance_id_top_motion_layout;
|
||||
beginSet.getConstraint(R.id.module_entrance_id_top_container).layout.topToTop = -1;
|
||||
|
||||
endSet.getConstraint(R.id.module_entrance_id_top_container).layout.bottomToTop = -1;
|
||||
endSet.getConstraint(R.id.module_entrance_id_top_container).layout.topToTop =
|
||||
R.id.module_entrance_id_top_motion_layout;
|
||||
// topMotionLayout.setScene(hasNaviScene);
|
||||
TransitionManager.beginDelayedTransition(topMotionLayout);
|
||||
if(!toggle) {
|
||||
endSet.applyTo(topMotionLayout);
|
||||
}else{
|
||||
beginSet.applyTo(topMotionLayout);
|
||||
}
|
||||
toggle = !toggle;
|
||||
// 原始逻辑
|
||||
// final MogoLocation location = mMogoLocationClient.getLastKnowLocation();
|
||||
// if ( location != null ) {
|
||||
// if ( !mMogoStatusManager.isV2XShow() ) {
|
||||
// mMogoStatusManager.setUserInteractionStatus( TAG, true, false );
|
||||
// mMApUIController.setLockZoom( 16 );
|
||||
// mMApUIController.changeZoom( 16.0f );
|
||||
// }
|
||||
// mMogoStatusManager.setUserInteractionStatus( TAG, true, false );
|
||||
// mMApUIController.recoverLockMode();
|
||||
// }
|
||||
} );
|
||||
|
||||
mNaviInfo = findViewById( R.id.module_entrance_id_navi_info_panel );
|
||||
// mNaviInfo = findViewById( R.id.module_entrance_id_navi_info_panel );
|
||||
mExitNavi = findViewById( R.id.module_entrance_id_exit_navi );
|
||||
mExitNavi.setOnClickListener( view -> {
|
||||
if ( mMogoNavi != null ) {
|
||||
@@ -347,12 +419,12 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent
|
||||
if ( naviinfo == null ) {
|
||||
return;
|
||||
}
|
||||
mNaviInfo.notifyChanged( naviinfo );
|
||||
// mNaviInfo.notifyChanged( naviinfo );
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onStartNavi() {
|
||||
mNaviInfo.setVisibility( View.VISIBLE );
|
||||
// mNaviInfo.setVisibility( View.VISIBLE );
|
||||
mExitNavi.setVisibility( View.VISIBLE );
|
||||
mMApUIController.changeMapMode( mCameraMode.isSelected() ? EnumMapUI.NorthUP_2D : EnumMapUI.CarUp_2D );
|
||||
MapCenterPointStrategy.setMapCenterPointBySceneAndDelay( mMApUIController, Scene.NAVI, 500, () -> {
|
||||
@@ -364,7 +436,7 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent
|
||||
|
||||
@Override
|
||||
public void onStopNavi() {
|
||||
mNaviInfo.setVisibility( View.GONE );
|
||||
// mNaviInfo.setVisibility( View.GONE );
|
||||
mExitNavi.setVisibility( View.GONE );
|
||||
mMApUIController.changeMapMode( EnumMapUI.NorthUP_2D );
|
||||
mDisplayOverview.setVisibility( View.GONE );
|
||||
|
||||
@@ -0,0 +1,170 @@
|
||||
package com.mogo.module.extensions.navi;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.constraintlayout.motion.widget.MotionLayout;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
|
||||
import com.mogo.map.impl.amap.utils.IconTypeUtils;
|
||||
import com.mogo.map.navi.MogoNaviInfo;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
|
||||
/**
|
||||
* @author congtaowang
|
||||
* @since 2019-10-03
|
||||
* <p>
|
||||
* 描述
|
||||
*/
|
||||
public abstract class BaseNaviInfoView2 extends ConstraintLayout {
|
||||
|
||||
public BaseNaviInfoView2(Context context ) {
|
||||
this( context, null );
|
||||
}
|
||||
|
||||
public BaseNaviInfoView2(Context context, @Nullable AttributeSet attrs ) {
|
||||
this( context, attrs, 0 );
|
||||
}
|
||||
|
||||
public BaseNaviInfoView2(Context context, @Nullable AttributeSet attrs, int defStyleAttr ) {
|
||||
super( context, attrs, defStyleAttr );
|
||||
}
|
||||
|
||||
public void notifyChanged( MogoNaviInfo naviInfo ) {
|
||||
|
||||
}
|
||||
|
||||
protected void fillNextCrossTurning( TextView target, int nextIconType ) {
|
||||
target.setText( "后" + IconTypeUtils.getNameByIconType( nextIconType ) );
|
||||
}
|
||||
|
||||
protected void fillNextCrossIconType( ImageView target, int iconId ) {
|
||||
if ( iconId > 0 ) {
|
||||
target.setImageResource( iconId );
|
||||
}
|
||||
}
|
||||
|
||||
protected void fillNextCrossDistance( TextView target, TextView unit, int distance ) {
|
||||
if ( distance >= 1000 ) {
|
||||
target.setText( String.format( "%.1f", distance / 1000f ) );
|
||||
unit.setText( "km" );
|
||||
} else {
|
||||
target.setText( distance + "" );
|
||||
unit.setText( "m" );
|
||||
}
|
||||
}
|
||||
|
||||
protected void fillFormatSurplusDistance( int m, StringBuilder builder ) {
|
||||
if ( m >= 1000 ) {
|
||||
builder.append( String.format( "%.1fkm", m / 1000f ) );
|
||||
} else {
|
||||
builder.append( m ).append( "m" );
|
||||
}
|
||||
}
|
||||
|
||||
protected String getFormatSurplusDistance( int m ) {
|
||||
if ( m >= 1000 ) {
|
||||
mFormatSurplusDistanceUnit = "km";
|
||||
return String.format( "%.1f", m / 1000f );
|
||||
} else {
|
||||
mFormatSurplusDistanceUnit = "m";
|
||||
return String.format( "%d", m );
|
||||
}
|
||||
}
|
||||
|
||||
private String mFormatSurplusDistanceUnit = "";
|
||||
|
||||
protected String getFormatSurplusDistanceUnit() {
|
||||
return mFormatSurplusDistanceUnit;
|
||||
}
|
||||
|
||||
protected String getFormatSurplusTime( int seconds ) {
|
||||
if ( seconds > 60 * 60 ) {
|
||||
mFormatSurplusDistanceUnit = "h";
|
||||
return String.format( "%.1f", ( ( float ) seconds ) / 60 * 60 );
|
||||
}
|
||||
|
||||
if ( seconds > 60 ) {
|
||||
mFormatSurplusTimeUnit = "min";
|
||||
return String.format( "%.1f", ( ( float ) seconds ) / 60 );
|
||||
}
|
||||
|
||||
mFormatSurplusTimeUnit = "s";
|
||||
return String.format( "%d", seconds );
|
||||
}
|
||||
|
||||
private String mFormatSurplusTimeUnit = "";
|
||||
|
||||
protected String getFormatSurplusTimeUnit() {
|
||||
return mFormatSurplusTimeUnit;
|
||||
}
|
||||
|
||||
protected void fillFormatTime( int seconds, StringBuilder builder ) {
|
||||
int days = seconds / ( 24 * 60 * 60 );
|
||||
if ( days > 0 ) {
|
||||
builder.append( days ).append( "天" );
|
||||
}
|
||||
seconds -= days * 24 * 60 * 60;
|
||||
int hours = seconds / ( 60 * 60 );
|
||||
if ( hours > 0 ) {
|
||||
builder.append( hours ).append( "小时" );
|
||||
}
|
||||
seconds -= hours * 60 * 60;
|
||||
int min = seconds / 60;
|
||||
builder.append( min > 1 ? min : 1 ).append( "分钟" );
|
||||
}
|
||||
|
||||
protected String getArriveTime( int seconds ) {
|
||||
int days = seconds / ( 24 * 60 * 60 );
|
||||
if ( days > 0 ) {
|
||||
return String.format( "%d天后", days );
|
||||
} else {
|
||||
seconds -= days * 24 * 60 * 60;
|
||||
int hours = seconds / ( 60 * 60 );
|
||||
seconds -= hours * 60 * 60;
|
||||
int min = seconds / 60;
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
int curHour = calendar.get( Calendar.HOUR_OF_DAY );
|
||||
int curMin = calendar.get( Calendar.MINUTE );
|
||||
if ( curHour + hours + ( curMin + min ) / 60 > 24 ) {
|
||||
return "一天后";
|
||||
} else {
|
||||
calendar.add( Calendar.HOUR_OF_DAY, hours );
|
||||
calendar.add( Calendar.MINUTE, min );
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat( "HH:mm" );
|
||||
return dateFormat.format( calendar.getTime() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected void fillArriveTime( int seconds, StringBuilder builder ) {
|
||||
|
||||
int days = seconds / ( 24 * 60 * 60 );
|
||||
if ( days > 0 ) {
|
||||
builder.append( days ).append( "天后" );
|
||||
} else {
|
||||
seconds -= days * 24 * 60 * 60;
|
||||
int hours = seconds / ( 60 * 60 );
|
||||
seconds -= hours * 60 * 60;
|
||||
int min = seconds / 60;
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
int curHour = calendar.get( Calendar.HOUR_OF_DAY );
|
||||
int curMin = calendar.get( Calendar.MINUTE );
|
||||
if ( curHour + hours + ( curMin + min ) / 60 > 24 ) {
|
||||
builder.append( "一天后" );
|
||||
} else {
|
||||
calendar.add( Calendar.HOUR_OF_DAY, hours );
|
||||
calendar.add( Calendar.MINUTE, min );
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat( "HH:mm" );
|
||||
builder.append( dateFormat.format( calendar.getTime() ) );
|
||||
}
|
||||
}
|
||||
builder.append( "到达" );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
package com.mogo.module.extensions.navi;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.constraintlayout.widget.Group;
|
||||
|
||||
import com.mogo.module.extensions.R;
|
||||
|
||||
/**
|
||||
* 改变实现方式,使用MotionLayout来实现,方便增加动画
|
||||
*
|
||||
* @author tongchenfei
|
||||
*/
|
||||
public class NaviInfoView2 extends BaseNaviInfoView2 {
|
||||
private ImageView ivTurnIcon;
|
||||
private View vBg;
|
||||
private TextView tvNextDistance;
|
||||
private TextView tvNextDistanceUnit;
|
||||
private TextView tvNextTurnInfo;
|
||||
private TextView tvNextRoad;
|
||||
private Group remainDistanceGroup,remainTimeGroup, arriveTimeGroup;
|
||||
|
||||
public NaviInfoView2(Context context) {
|
||||
this(context,null);
|
||||
}
|
||||
|
||||
public NaviInfoView2(Context context, AttributeSet attrs) {
|
||||
this(context, attrs, 0);
|
||||
}
|
||||
|
||||
public NaviInfoView2(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
ivTurnIcon = findViewById(R.id.module_map_id_navi_next_info_road_turn_icon);
|
||||
vBg = findViewById(R.id.module_map_id_navi_bg);
|
||||
tvNextDistance = findViewById(R.id.module_map_id_navi_next_info_distance);
|
||||
tvNextRoad = findViewById(R.id.module_map_id_navi_next_info_road);
|
||||
remainDistanceGroup = findViewById(R.id.remainDistanceGroup);
|
||||
remainTimeGroup = findViewById(R.id.remainTimeGroup);
|
||||
arriveTimeGroup = findViewById(R.id.arriveTimeGroup);
|
||||
}
|
||||
|
||||
/**
|
||||
* 布局约束转成小的
|
||||
*/
|
||||
public void setToSmall(){
|
||||
ivTurnIcon.getLayoutParams().width =
|
||||
(int) getResources().getDimension(R.dimen.module_ext_navi_info_panel_turn_icon_small_width);
|
||||
ivTurnIcon.getLayoutParams().height =
|
||||
(int) getResources().getDimension(R.dimen.module_ext_navi_info_panel_turn_icon_small_width);
|
||||
vBg.getLayoutParams().height =
|
||||
(int) getResources().getDimension(R.dimen.module_ext_navi_info_panel_small_height);
|
||||
|
||||
}
|
||||
|
||||
public void setToBig(){
|
||||
ivTurnIcon.getLayoutParams().width =
|
||||
(int) getResources().getDimension(R.dimen.module_ext_navi_info_panel_turn_icon_width);
|
||||
ivTurnIcon.getLayoutParams().height =
|
||||
(int) getResources().getDimension(R.dimen.module_ext_navi_info_panel_turn_icon_width);
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user