diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewAnimHelper.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewAnimHelper.java index 1242013112..93ef407b60 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewAnimHelper.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewAnimHelper.java @@ -5,6 +5,8 @@ import android.transition.AutoTransition; import android.transition.Transition; import android.transition.TransitionManager; import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintSet; @@ -22,27 +24,74 @@ import com.mogo.utils.logger.Logger; public class TopViewAnimHelper { private ConstraintLayout topMotionLayout; - private Group naviGroup,remainTimeGroup,remainDistanceGroup, arriveTimeGroup; + private Group naviGroup, remainTimeGroup, remainDistanceGroup, arriveTimeGroup; private View naviBg; + private ImageView ivTurnIcon; + private TextView tvNextDistance; + private TextView tvNextRoad; + private ConstraintSet constraintSet = new ConstraintSet(); private Transition transition = new AutoTransition(); + private TextView cameraMode; public TopViewAnimHelper(ConstraintLayout rootView) { + this(rootView, null); + } + + public TopViewAnimHelper(ConstraintLayout rootView, OnTopViewAnimSimpleListener listener) { topMotionLayout = rootView; naviBg = rootView.findViewById(R.id.module_map_id_navi_bg); naviGroup = rootView.findViewById(R.id.naviGroup); remainTimeGroup = rootView.findViewById(R.id.remainTimeGroup); remainDistanceGroup = rootView.findViewById(R.id.remainDistanceGroup); arriveTimeGroup = rootView.findViewById(R.id.arriveTimeGroup); - transition.setDuration(2000); + + ivTurnIcon = rootView.findViewById(R.id.module_map_id_navi_next_info_road_turn_icon); + tvNextDistance = rootView.findViewById(R.id.module_map_id_navi_next_info_distance); + tvNextRoad = rootView.findViewById(R.id.module_map_id_navi_next_info_road); + transition.setDuration(200); + + transition.addListener(new Transition.TransitionListener() { + @Override + public void onTransitionStart(Transition transition) { + if (listener != null) { + listener.onAnimStart(); + } + } + + @Override + public void onTransitionEnd(Transition transition) { + if (listener != null) { + listener.onAnimEnd(); + } + } + + @Override + public void onTransitionCancel(Transition transition) { + + } + + @Override + public void onTransitionPause(Transition transition) { + + } + + @Override + public void onTransitionResume(Transition transition) { + + } + }); + + cameraMode = rootView.findViewById(R.id.module_ext_id_north); } private boolean isTopViewOut = true; - public void startTopInAnim(){ + public void startTopInAnim() { Logger.d("TopViewAnimHelper", "startTopInAnim====="); - if(isTopViewOut) { + if (isTopViewOut) { + isTopViewOut = false; constraintSet.clone(topMotionLayout); constraintSet.getConstraint(R.id.module_entrance_id_top_container).layout.bottomToTop = -1; @@ -50,58 +99,160 @@ public class TopViewAnimHelper { R.id.module_entrance_id_top_motion_layout; TransitionManager.beginDelayedTransition(topMotionLayout, transition); + checkCameraModePosition(false); + if (naviGroup.getVisibility() == View.VISIBLE) { + // 约束设置需要在applyTo()方法之前执行,visiable设置需要在applyTo() + // 方法之后执行才能生效,所以分开了两个判断,至于为什么这么做才能生效,不得而知 + constraintSet.connect(tvNextDistance.getId(), ConstraintSet.BOTTOM, + ivTurnIcon.getId(), ConstraintSet.BOTTOM); + constraintSet.clear(tvNextRoad.getId(), ConstraintSet.BOTTOM); + constraintSet.connect(tvNextRoad.getId(), ConstraintSet.BASELINE, + tvNextDistance.getId(), ConstraintSet.BASELINE); + constraintSet.connect(tvNextRoad.getId(), ConstraintSet.LEFT, + R.id.module_map_id_navi_next_info_turn_info, ConstraintSet.RIGHT, + (int) topMotionLayout.getContext().getResources().getDimension(R.dimen.dp_46)); + } constraintSet.applyTo(topMotionLayout); - if(naviGroup.getVisibility() == View.VISIBLE) { + if (naviGroup.getVisibility() == View.VISIBLE) { remainDistanceGroup.setVisibility(View.GONE); remainTimeGroup.setVisibility(View.GONE); arriveTimeGroup.setVisibility(View.GONE); } + ivTurnIcon.getLayoutParams().height = + (int) getDimen(R.dimen.module_ext_navi_info_panel_turn_icon_small_height); + ivTurnIcon.getLayoutParams().width = + (int) getDimen(R.dimen.module_ext_navi_info_panel_turn_icon_small_width); naviBg.getLayoutParams().height = (int) topMotionLayout.getContext().getResources().getDimension(R.dimen.module_ext_navi_info_panel_small_height); - isTopViewOut = false; } } - public void startTopOutAnim(){ + public void startTopOutAnim() { Logger.d("TopViewAnimHelper", "startTopOutAnim====="); - if(!isTopViewOut) { + if (!isTopViewOut) { + isTopViewOut = true; constraintSet.clone(topMotionLayout); constraintSet.getConstraint(R.id.module_entrance_id_top_container).layout.bottomToTop = R.id.module_entrance_id_top_motion_layout; constraintSet.getConstraint(R.id.module_entrance_id_top_container).layout.topToTop = -1; TransitionManager.beginDelayedTransition(topMotionLayout, transition); + checkCameraModePosition(false); + + if (naviGroup.getVisibility() == View.VISIBLE) { + // 约束设置需要在applyTo()方法之前执行,visiable设置需要在applyTo() + // 方法之后执行才能生效,所以分开了两个判断,至于为什么这么做才能生效,不得而知 + constraintSet.clear(tvNextDistance.getId(), ConstraintSet.BOTTOM); + constraintSet.clear(tvNextRoad.getId(), ConstraintSet.BASELINE); + constraintSet.connect(tvNextRoad.getId(), ConstraintSet.BOTTOM, + ivTurnIcon.getId(), ConstraintSet.BOTTOM); + constraintSet.connect(tvNextRoad.getId(), ConstraintSet.LEFT, + tvNextDistance.getId(), ConstraintSet.LEFT, + 0); + } constraintSet.applyTo(topMotionLayout); - if(naviGroup.getVisibility() == View.VISIBLE) { + if (naviGroup.getVisibility() == View.VISIBLE) { remainDistanceGroup.setVisibility(View.VISIBLE); remainTimeGroup.setVisibility(View.VISIBLE); arriveTimeGroup.setVisibility(View.VISIBLE); } + ivTurnIcon.getLayoutParams().height = + (int) getDimen(R.dimen.module_ext_navi_info_panel_turn_icon_height); + ivTurnIcon.getLayoutParams().width = + (int) getDimen(R.dimen.module_ext_navi_info_panel_turn_icon_width); naviBg.getLayoutParams().height = (int) topMotionLayout.getContext().getResources().getDimension(R.dimen.module_ext_navi_info_panel_height); - isTopViewOut = true; } } - public void showNaviView(){ + public void showNaviView() { Logger.d("TopViewAnimHelper", "showNaviView====="); naviGroup.setVisibility(View.VISIBLE); if (isTopViewOut) { remainDistanceGroup.setVisibility(View.VISIBLE); remainTimeGroup.setVisibility(View.VISIBLE); arriveTimeGroup.setVisibility(View.VISIBLE); - }else{ + // 调整约束 + constraintSet.clone(topMotionLayout); + constraintSet.clear(tvNextDistance.getId(), ConstraintSet.BOTTOM); + constraintSet.clear(tvNextRoad.getId(), ConstraintSet.BASELINE); + constraintSet.connect(tvNextRoad.getId(), ConstraintSet.BOTTOM, ivTurnIcon.getId(), + ConstraintSet.BOTTOM); + constraintSet.connect(tvNextRoad.getId(), ConstraintSet.LEFT, + tvNextDistance.getId(), ConstraintSet.LEFT, + 0); +// ivTurnIcon.getLayoutParams().height = +// (int) getDimen(R.dimen.module_ext_navi_info_panel_turn_icon_height); +// ivTurnIcon.getLayoutParams().width = +// (int) getDimen(R.dimen.module_ext_navi_info_panel_turn_icon_width); +// naviBg.getLayoutParams().height = +// (int) topMotionLayout.getContext().getResources().getDimension(R.dimen.module_ext_navi_info_panel_height); + constraintSet.applyTo(topMotionLayout); + } else { remainDistanceGroup.setVisibility(View.GONE); remainTimeGroup.setVisibility(View.GONE); arriveTimeGroup.setVisibility(View.GONE); + // 调整约束 + constraintSet.clone(topMotionLayout); + constraintSet.connect(tvNextDistance.getId(), ConstraintSet.BOTTOM, + ivTurnIcon.getId(), ConstraintSet.BOTTOM); + constraintSet.clear(tvNextRoad.getId(), ConstraintSet.BOTTOM); + constraintSet.connect(tvNextRoad.getId(), ConstraintSet.BASELINE, + tvNextDistance.getId(), ConstraintSet.BASELINE); + constraintSet.connect(tvNextRoad.getId(), ConstraintSet.LEFT, + R.id.module_map_id_navi_next_info_turn_info, ConstraintSet.RIGHT, + (int) topMotionLayout.getContext().getResources().getDimension(R.dimen.dp_46)); +// ivTurnIcon.getLayoutParams().height = +// (int) getDimen(R.dimen.module_ext_navi_info_panel_turn_icon_small_height); +// ivTurnIcon.getLayoutParams().width = +// (int) getDimen(R.dimen.module_ext_navi_info_panel_turn_icon_small_width); +// naviBg.getLayoutParams().height = +// (int) topMotionLayout.getContext().getResources().getDimension(R.dimen.module_ext_navi_info_panel_small_height); + constraintSet.applyTo(topMotionLayout); } + + checkCameraModePosition(true); } - public void hideNaviView(){ + public void hideNaviView() { Logger.d("TopViewAnimHelper", "hideNaviView====="); naviGroup.setVisibility(View.GONE); remainDistanceGroup.setVisibility(View.GONE); remainTimeGroup.setVisibility(View.GONE); arriveTimeGroup.setVisibility(View.GONE); + checkCameraModePosition(true); + } + + private void checkCameraModePosition(boolean isNeedClone) { + if (isNeedClone) { + constraintSet.clone(topMotionLayout); + } + if (naviGroup.getVisibility() == View.VISIBLE) { + constraintSet.connect(cameraMode.getId(), ConstraintSet.TOP, naviBg.getId(), + ConstraintSet.BOTTOM, (int) getDimen(R.dimen.dp_30)); + } else { + if (isTopViewOut) { + constraintSet.connect(cameraMode.getId(), ConstraintSet.TOP, naviBg.getId(), + ConstraintSet.BOTTOM, (int) getDimen(R.dimen.module_ext_north_goneMarginTop)); + } else { + constraintSet.connect(cameraMode.getId(), ConstraintSet.TOP, + R.id.module_entrance_id_top_container, + ConstraintSet.BOTTOM, + (int) getDimen(R.dimen.dp_30)); + } + } + if (isNeedClone) { + constraintSet.applyTo(topMotionLayout); + } + } + + private float getDimen(int resId) { + return (int) topMotionLayout.getContext().getResources().getDimension(resId); + } + + interface OnTopViewAnimSimpleListener { + void onAnimStart(); + + void onAnimEnd(); } } diff --git a/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml b/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml index ad52d3abdd..e985dd586c 100644 --- a/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml +++ b/modules/mogo-module-extensions/src/main/res/layout/module_ext_layout_entrance.xml @@ -238,7 +238,7 @@ android:id="@+id/module_ext_id_north" android:layout_width="@dimen/dp_120" android:layout_height="@dimen/dp_120" - android:layout_marginTop="@dimen/dp_30" + android:layout_marginTop="@dimen/module_ext_north_goneMarginTop" android:background="@drawable/module_ext_dw_common_corner_bkg" android:drawableTop="@drawable/selector_icon_north_up" android:gravity="center_horizontal" @@ -246,9 +246,8 @@ android:text="@string/mode_north_up" android:textColor="@color/white" android:textSize="@dimen/dp_28" - app:layout_constraintRight_toRightOf="@+id/module_map_id_navi_bg" - app:layout_constraintTop_toBottomOf="@+id/module_map_id_navi_bg" - app:layout_goneMarginTop="@dimen/module_ext_north_goneMarginTop" /> + app:layout_constraintRight_toRightOf="@+id/module_entrance_id_top_container" + app:layout_constraintTop_toTopOf="parent"/>