diff --git a/.idea/misc.xml b/.idea/misc.xml index 2dc54c489f..707ee6e613 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/config.gradle b/config.gradle index d9f8af0fd0..e12bbcd7bf 100644 --- a/config.gradle +++ b/config.gradle @@ -12,7 +12,7 @@ ext { // androidx androidxappcompat : "androidx.appcompat:appcompat:1.0.2", androidxccorektx : "androidx.core:core-ktx:1.2.0", - androidxconstraintlayout : "androidx.constraintlayout:constraintlayout:2.0.0-alpha5", + androidxconstraintlayout : "androidx.constraintlayout:constraintlayout:2.0.0-beta6", androidxmultidex : "androidx.multidex:multidex:2.0.1", androidxviewpager2 : "androidx.viewpager2:viewpager2:1.0.0", androidxrecyclerview : "androidx.recyclerview:recyclerview:1.1.0", diff --git a/gradle.properties b/gradle.properties index 75c867a601..a8b8b32956 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,34 +27,34 @@ PASSWORD=xintai2018 RELEASE=false # 模块版本 ## 工程内模块 -MOGO_COMMONS_VERSION=1.1.0.7 -MOGO_UTILS_VERSION=1.1.0.7 -MAP_AMAP_VERSION=1.1.0.7 -MOGO_MAP_VERSION=1.1.0.7 -MOGO_MAP_API_VERSION=1.1.0.7 -MOGO_SERVICE_VERSION=1.1.0.7 -MOGO_SERVICE_API_VERSION=1.1.0.7 -MOGO_CONNECTION_VERSION=1.1.0.7 -MOGO_MODULE_APPS_VERSION=1.1.0.7 -MOGO_MODULE_NAVI_VERSION=1.1.0.7 -MOGO_MODULE_SHARE_VERSION=1.1.0.7 -MOGO_MODULE_COMMON_VERSION=1.1.0.7 -MOGO_MODULE_MAIN_VERSION=1.1.0.7 -MOGO_MODULE_MAP_VERSION=1.1.0.7 -MOGO_MODULE_SERVICE_VERSION=1.1.0.7 -MOGO_MODULE_EXTENSIONS_VERSION=1.1.0.7 -MOGO_MODULE_SEARCH_VERSION=1.1.0.7 -MOGO_MODULE_BACK_VERSION=1.1.0.7 -MOGO_MODULE_GPS_SIMULATOR_VERSION=1.1.0.7 -MOGO_MODULE_GPS_SIMULATOR_DEBUG_VERSION=1.1.0.7 -MOGO_MODULE_GPS_SIMULATOR_NOOP_VERSION=1.1.0.7 -MOGO_MODULE_AUTHORIZE_VERSION=1.1.0.7 -MOGO_MODULE_GUIDE_VERSION=1.1.0.7 +MOGO_COMMONS_VERSION=1.1.0.8 +MOGO_UTILS_VERSION=1.1.0.8 +MAP_AMAP_VERSION=1.1.0.8 +MOGO_MAP_VERSION=1.1.0.8 +MOGO_MAP_API_VERSION=1.1.0.8 +MOGO_SERVICE_VERSION=1.1.0.8 +MOGO_SERVICE_API_VERSION=1.1.0.8 +MOGO_CONNECTION_VERSION=1.1.0.8 +MOGO_MODULE_APPS_VERSION=1.1.0.8 +MOGO_MODULE_NAVI_VERSION=1.1.0.8 +MOGO_MODULE_SHARE_VERSION=1.1.0.8 +MOGO_MODULE_COMMON_VERSION=1.1.0.8 +MOGO_MODULE_MAIN_VERSION=1.1.0.8 +MOGO_MODULE_MAP_VERSION=1.1.0.8 +MOGO_MODULE_SERVICE_VERSION=1.1.0.8 +MOGO_MODULE_EXTENSIONS_VERSION=1.1.0.8 +MOGO_MODULE_SEARCH_VERSION=1.1.0.8 +MOGO_MODULE_BACK_VERSION=1.1.0.8 +MOGO_MODULE_GPS_SIMULATOR_VERSION=1.1.0.8 +MOGO_MODULE_GPS_SIMULATOR_DEBUG_VERSION=1.1.0.8 +MOGO_MODULE_GPS_SIMULATOR_NOOP_VERSION=1.1.0.8 +MOGO_MODULE_AUTHORIZE_VERSION=1.1.0.8 +MOGO_MODULE_GUIDE_VERSION=1.1.0.8 ## 工程外部模块 # 探路 -MOGO_MODULE_TANLU_VERSION=1.0.6-SNAPSHOT +MOGO_MODULE_TANLU_VERSION=1.0.5-SNAPSHOT # 车聊聊 CARCHATTING_VERSION=1.0.4-SNAPSHOT # 车聊聊接口 diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java index 34867b8492..fd6377a2e2 100644 --- a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/entrance/EntranceFragment.java @@ -7,13 +7,16 @@ import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.constraintlayout.widget.ConstraintLayout; import com.alibaba.android.arouter.launcher.ARouter; import com.mogo.commons.mvp.MvpFragment; @@ -36,7 +39,7 @@ import com.mogo.module.common.map.MapCenterPointStrategy; 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.utils.TopViewAnimHelper; import com.mogo.module.share.ShareControl; import com.mogo.service.IMogoServiceApis; import com.mogo.service.MogoServicePaths; @@ -53,7 +56,9 @@ import com.mogo.utils.ResourcesHelper; import com.mogo.utils.UiThreadHandler; import com.mogo.utils.logger.Logger; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import static com.mogo.module.authorize.authprovider.invoke.AuthorizeInvokerConstant.AUTHORIZE_TYPE_LAUNCHER_SHARE; @@ -80,7 +85,7 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent private View mMove2CurrentLocation; - private NaviInfoView mNaviInfo; +// private NaviInfoView mNaviInfo; private TextView mExitNavi; @@ -103,6 +108,7 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent private IMogoAuthorizeModuleManager mIMogoAuthorizeModuleManager; private IMogoStatusManager mStatusManager; + /** * 搜索莫模块 */ @@ -179,6 +185,8 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent return R.layout.module_ext_layout_entrance; } + private List demoCache = new ArrayList<>(); + @Override protected void initViews() { mApis = ( IMogoServiceApis ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICE_APIS ).navigation( getContext() ); @@ -194,6 +202,13 @@ 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 -> { +// // todo 测试动画 +// View v = LayoutInflater.from(getContext()).inflate(R.layout.demo_top, null); +// TextView tv = v.findViewById(R.id.tvIndex); +// tv.setText(demoCache.size() + ""); +// demoCache.add(v); +// mApis.getTopViewManager().addView(v); + // 原始逻辑 isClickShare = true; if ( mIMogoAuthorizeModuleManager.needAuthorize( AUTHORIZE_TYPE_LAUNCHER_SHARE ) ) { mIMogoAuthorizeModuleManager.invokeAuthorization( AUTHORIZE_TYPE_LAUNCHER_SHARE ); @@ -220,6 +235,14 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent mMove2CurrentLocation = findViewById( R.id.module_entrance_id_move2_current_location ); mMove2CurrentLocation.setOnClickListener( view -> { +// // todo 测试动画 +// if(demoCache.size()>0) { +// View v = demoCache.remove(demoCache.size() - 1); +// boolean isViewAdded = mApis.getTopViewManager().isViewAdded(v); +// Logger.d(TAG, "isViewAdded===" + isViewAdded); +// mApis.getTopViewManager().removeView(v); +// } + // 原始逻辑 final MogoLocation location = mMogoLocationClient.getLastKnowLocation(); if ( location != null ) { if ( !mMogoStatusManager.isV2XShow() ) { @@ -236,7 +259,12 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent } } ); - mNaviInfo = findViewById( R.id.module_entrance_id_navi_info_panel ); +// mNaviInfo = findViewById( R.id.module_entrance_id_navi_info_panel ); + ConstraintLayout rootView = findViewById(R.id.module_entrance_id_top_motion_layout); + if(rootView!=null) { + TopViewAnimHelper.getInstance().init(rootView); + } + mExitNavi = findViewById( R.id.module_entrance_id_exit_navi ); mExitNavi.setOnClickListener( view -> { if ( mMogoNavi != null ) { @@ -366,12 +394,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, () -> { @@ -383,7 +411,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 ); 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 new file mode 100644 index 0000000000..4c75e753e0 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewAnimHelper.java @@ -0,0 +1,382 @@ +package com.mogo.module.extensions.utils; + +import android.animation.Animator; +import android.animation.ObjectAnimator; +import android.transition.AutoTransition; +import android.transition.Transition; +import android.transition.TransitionManager; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.constraintlayout.widget.ConstraintSet; +import androidx.constraintlayout.widget.Group; + +import com.mogo.map.uicontroller.IMogoMapUIController; +import com.mogo.module.common.map.MapCenterPointStrategy; +import com.mogo.module.common.map.Scene; +import com.mogo.module.extensions.R; +import com.mogo.utils.logger.Logger; + +import java.util.ArrayList; +import java.util.List; + + +/** + * 顶部动画帮助类 + * + * @author tongchenfei + */ +public class TopViewAnimHelper { + private static final String TAG = "TopViewAnimHelper"; + + private ConstraintLayout topMotionLayout; + private Group naviGroup, remainTimeGroup, remainDistanceGroup, arriveTimeGroup; + private View naviBg; + + private ImageView ivTurnIcon; + private TextView tvNextDistance; + private TextView tvNextRoad; + private FrameLayout topContainer; + + private ConstraintSet constraintSet = new ConstraintSet(); + private Transition transition = new AutoTransition(); + private TextView cameraMode; + + private TopViewAnimHelper() { + } + + private volatile static TopViewAnimHelper instance = null; + + public static TopViewAnimHelper getInstance() { + if (instance == null) { + synchronized (TopViewAnimHelper.class) { + if (instance == null) { + instance = new TopViewAnimHelper(); + } + } + } + return instance; + } + + private IMogoMapUIController mogoMapUIController; + + public void setIMogoMapUIController(IMogoMapUIController mogoMapUIController) { + this.mogoMapUIController = mogoMapUIController; + } + + public void init(ConstraintLayout rootView) { + init(rootView, null); + } + + public void init(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); + topContainer = rootView.findViewById(R.id.module_entrance_id_top_container); + + 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 (isTopViewOut) { + topContainer.removeAllViews(); + } + 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; + private List viewCaches = new ArrayList<>(); + + public void startTopInAnim(View view, ViewGroup.LayoutParams params) { + Logger.d(TAG, "startTopInAnim====="+isTopViewOut); + if (view == null) { + throw new IllegalArgumentException("method addTopView params view is null"); + } + if (params == null) { + throw new IllegalArgumentException("method addTopView params LayoutParams is null"); + } + if (!viewCaches.contains(view)) { + // 判断此view是否已经增加到了顶部view,如果增加过就不增加了 + Logger.d(TAG, "开始执行"); + isTopViewOut = false; + if (topContainer.getChildCount() > 0) { + // 顶部view已经有了内容,新增内容无需整体布局变化,只是新增布局加个动画 + viewCaches.add(view); + view.setTranslationY(-(params.height)); + topContainer.addView(view, params); + Logger.d(TAG, "顶部view已经有布局了,增加新增view滑入动画: " + view.getTranslationY() + " height:" + + " " + view.getHeight() + " paramsHeight: " + params.height); + view.animate().translationY(0).setDuration(500).start(); + } else { + // 顶部view还没有内容,需要整体下移 + viewCaches.add(view); + topContainer.addView(view, params); + constraintSet.clone(topMotionLayout); + + constraintSet.getConstraint(R.id.module_entrance_id_top_container).layout.bottomToTop = -1; + constraintSet.getConstraint(R.id.module_entrance_id_top_container).layout.topToTop = + 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) { + 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); + int scene = 0; + if(naviGroup.getVisibility() == View.VISIBLE){ + scene = Scene.NAVI_WITH_ROAD_EVENT; + }else{ + scene = Scene.AIMLESS_WITH_ROAD_EVENT; + } + Logger.d(TAG, "show top setMapCenterPointByScene: " + scene); + MapCenterPointStrategy.setMapCenterPointByScene(mogoMapUIController, scene); + } + } + } + + public void startTopOutAnim(View view) { + Logger.d("TopViewAnimHelper", "startTopOutAnim====="); + if (!isTopViewOut) { + + if(topContainer.getChildCount() >1){ + // 顶部view包含多个view,只推出当前view,不进行整体上移 + Logger.d(TAG, "小view退出: " + view.getTranslationY() + " height: " + view.getHeight()); + view.animate().translationY(-(view.getHeight())).setDuration(500).setListener(new Animator.AnimatorListener() { + @Override + public void onAnimationStart(Animator animation) { + + } + + @Override + public void onAnimationEnd(Animator animation) { + viewCaches.remove(view); + topContainer.removeView(view); + } + + @Override + public void onAnimationCancel(Animator animation) { + viewCaches.remove(view); + topContainer.removeView(view); + } + + @Override + public void onAnimationRepeat(Animator animation) { + + } + }).start(); + }else { + // 顶部view仅剩一个view,需要整体上移 + 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) { + 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); + int scene = 0; + if(naviGroup.getVisibility() == View.VISIBLE){ + scene = Scene.NAVI; + }else{ + scene = Scene.AIMLESS; + } + Logger.d(TAG, "hide top setMapCenterPointByScene: " + scene); + MapCenterPointStrategy.setMapCenterPointByScene(mogoMapUIController, scene); + } + } + } + + public void showNaviView() { + Logger.d("TopViewAnimHelper", "showNaviView====="); + naviGroup.setVisibility(View.VISIBLE); + int scene = 0; + if (isTopViewOut) { + remainDistanceGroup.setVisibility(View.VISIBLE); + remainTimeGroup.setVisibility(View.VISIBLE); + arriveTimeGroup.setVisibility(View.VISIBLE); + // 调整约束 + 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); + scene = Scene.NAVI_WITH_ROAD_EVENT; + } 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); + scene = Scene.NAVI; + } + Logger.d(TAG, "navi show setMapCenterPointByScene: " + scene); + MapCenterPointStrategy.setMapCenterPointByScene(mogoMapUIController, scene); + checkCameraModePosition(true); + } + + public void hideNaviView() { + Logger.d("TopViewAnimHelper", "hideNaviView====="); + naviGroup.setVisibility(View.GONE); + remainDistanceGroup.setVisibility(View.GONE); + remainTimeGroup.setVisibility(View.GONE); + arriveTimeGroup.setVisibility(View.GONE); + int scene = 0; + if(isTopViewOut){ + scene = Scene.AIMLESS_WITH_ROAD_EVENT; + }else{ + scene = Scene.AIMLESS; + } + Logger.d(TAG, "hide navi setMapCenterPointByScene: " + scene); + MapCenterPointStrategy.setMapCenterPointByScene(mogoMapUIController, scene); + 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(); + } + + public boolean isViewAdded(View view) { + return viewCaches.contains(view); + } +} diff --git a/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewManager.java b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewManager.java new file mode 100644 index 0000000000..bab6447d35 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/java/com/mogo/module/extensions/utils/TopViewManager.java @@ -0,0 +1,56 @@ +package com.mogo.module.extensions.utils; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.mogo.module.extensions.R; +import com.mogo.service.MogoServicePaths; +import com.mogo.service.windowview.IMogoTopViewManager; + +/** + * 顶部1/2界面管理 + * + * @author tongchenfei + */ +@Route(path = MogoServicePaths.PATH_EXTENSIONS_TOP_VIEW_MANAGER) +public class TopViewManager implements IMogoTopViewManager { + +// @Override +// public void addTopView(View view, ViewGroup.LayoutParams params) { +// TopViewAnimHelper.getInstance().startTopInAnim(view, params); +// } +// +// @Override +// public void removeTopView() { +// TopViewAnimHelper.getInstance().startTopOutAnim(); +// } + + private Context context; + @Override + public void init(Context context) { + this.context = context; + } + + @Override + public void addView(View view) { + addView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + (int) context.getResources().getDimension(R.dimen.dp_350))); + } + + @Override + public void addView(View view, ViewGroup.LayoutParams params) { + TopViewAnimHelper.getInstance().startTopInAnim(view, params); + } + + @Override + public void removeView(View view) { + TopViewAnimHelper.getInstance().startTopOutAnim(view); + } + + @Override + public boolean isViewAdded(View view) { + return TopViewAnimHelper.getInstance().isViewAdded(view); + } +} diff --git a/modules/mogo-module-extensions/src/main/res/layout/demo_top.xml b/modules/mogo-module-extensions/src/main/res/layout/demo_top.xml new file mode 100644 index 0000000000..31de59022d --- /dev/null +++ b/modules/mogo-module-extensions/src/main/res/layout/demo_top.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + \ No newline at end of file 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 61a9d338d0..fc61c6281f 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 @@ -1,17 +1,229 @@ - + + + app:constraint_referenced_ids="module_map_id_navi_next_info_road,module_map_id_navi_next_info_turn_info,module_map_id_navi_bg,module_map_id_navi_next_info_road_turn_icon,module_map_id_navi_next_info_distance,module_map_id_navi_next_info_distance_unit,remainDistanceGroup,remainTimeGroup,arriveTimeGroup" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -38,11 +250,9 @@ android:background="@drawable/module_ext_dw_common_corner_bkg" android:gravity="center" android:orientation="vertical" - android:visibility="gone" - app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintTop_toBottomOf="@+id/module_entrance_id_navi_info_panel" - app:layout_goneMarginTop="@dimen/module_ext_north_goneMarginTop" - tools:visibility="visible"> + android:visibility="visible" + app:layout_constraintLeft_toLeftOf="@+id/module_map_id_navi_bg" + app:layout_constraintTop_toBottomOf="@+id/module_map_id_navi_bg"> + android:visibility="visible" /> + android:visibility="visible" /> + android:visibility="visible" /> + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/layout/module_map_layout_navi_info_panel_2.xml b/modules/mogo-module-extensions/src/main/res/layout/module_map_layout_navi_info_panel_2.xml new file mode 100644 index 0000000000..729703ad4e --- /dev/null +++ b/modules/mogo-module-extensions/src/main/res/layout/module_map_layout_navi_info_panel_2.xml @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/values-ldpi/dimens.xml b/modules/mogo-module-extensions/src/main/res/values-ldpi/dimens.xml index 31fec5ee59..6ee10cc338 100644 --- a/modules/mogo-module-extensions/src/main/res/values-ldpi/dimens.xml +++ b/modules/mogo-module-extensions/src/main/res/values-ldpi/dimens.xml @@ -79,8 +79,11 @@ 544px 117px + 60px 85px 85px + 52px + 52px 13px 13px 20px diff --git a/modules/mogo-module-extensions/src/main/res/values-xhdpi/dimens.xml b/modules/mogo-module-extensions/src/main/res/values-xhdpi/dimens.xml index fc372e59cf..b936d0a5eb 100644 --- a/modules/mogo-module-extensions/src/main/res/values-xhdpi/dimens.xml +++ b/modules/mogo-module-extensions/src/main/res/values-xhdpi/dimens.xml @@ -76,9 +76,13 @@ 1058px 210px + 144px 159px 159px + 96px + 96px 24px + 83px 24px 40px 60px @@ -121,7 +125,7 @@ 120px 120px 30px - 122px + 22px 28px \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/xml/module_ext_top_motion.xml b/modules/mogo-module-extensions/src/main/res/xml/module_ext_top_motion.xml new file mode 100644 index 0000000000..99a7f0e15c --- /dev/null +++ b/modules/mogo-module-extensions/src/main/res/xml/module_ext_top_motion.xml @@ -0,0 +1,442 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-extensions/src/main/res/xml/module_ext_top_no_navi_motion.xml b/modules/mogo-module-extensions/src/main/res/xml/module_ext_top_no_navi_motion.xml new file mode 100644 index 0000000000..8fda6c7123 --- /dev/null +++ b/modules/mogo-module-extensions/src/main/res/xml/module_ext_top_no_navi_motion.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/MogoWindowManager.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/MogoWindowManager.java index f7b69a8dd2..cc87d1dbc5 100644 --- a/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/MogoWindowManager.java +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/MogoWindowManager.java @@ -56,4 +56,9 @@ public class MogoWindowManager implements IMogoWindowManager { public void init( Context context ) { } + + @Override + public void addTopView(View view) { + + } } diff --git a/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/TopViewHolder.java b/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/TopViewHolder.java new file mode 100644 index 0000000000..12bc772e07 --- /dev/null +++ b/modules/mogo-module-main/src/main/java/com/mogo/module/main/windowview/TopViewHolder.java @@ -0,0 +1,15 @@ +package com.mogo.module.main.windowview; + +import android.view.View; + +/** + * 用来处理主屏上方1/2屏的view + */ +public class TopViewHolder { + public void init(){ + + } + public void addView(View view) { + + } +} diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java index 346667562f..ba87481b25 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/IMogoServiceApis.java @@ -23,6 +23,7 @@ import com.mogo.service.network.IMogoNetwork; import com.mogo.service.statusmanager.IMogoMsgCenter; import com.mogo.service.statusmanager.IMogoStatusManager; import com.mogo.service.strategy.IMogoRefreshStrategyController; +import com.mogo.service.windowview.IMogoTopViewManager; import com.mogo.service.windowview.IMogoWindowManager; /** @@ -180,4 +181,10 @@ public interface IMogoServiceApis extends IProvider { * @return */ IMogoEntranceButtonController getEntranceButtonController(); + + /** + * 获取顶部1/2屏界面管理类 + * @return + */ + IMogoTopViewManager getTopViewManager(); } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java index ca78173ea3..59bfa910b0 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/MogoServicePaths.java @@ -166,4 +166,9 @@ public class MogoServicePaths { */ @Deprecated public static final String PATH_ENTRANCE_BUTTON_API = "/entrancebutton/api"; + + /** + * 顶部1/2屏管理 + */ + public static final String PATH_EXTENSIONS_TOP_VIEW_MANAGER = "/topview/api"; } diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/windowview/IMogoTopViewManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/windowview/IMogoTopViewManager.java new file mode 100644 index 0000000000..fcccddf435 --- /dev/null +++ b/services/mogo-service-api/src/main/java/com/mogo/service/windowview/IMogoTopViewManager.java @@ -0,0 +1,37 @@ +package com.mogo.service.windowview; + +import android.view.View; +import android.view.ViewGroup; + +import com.alibaba.android.arouter.facade.template.IProvider; + +/** + * 管理1/2屏界面的增添,为了配合导航展示新增接口 + */ +public interface IMogoTopViewManager extends IProvider { + /** + * 在1/2屏添加一个view,如果没显示,会有动画 + * 给了一个默认的LayoutParams + */ + void addView(View view); + + /** + * 在1/2屏添加一个view,如果没显示,会有动画 + * @param view + * @param params + */ + void addView(View view, ViewGroup.LayoutParams params); + + /** + * 移除view,如果是最后一个view,会有移除动画 + * @param view + */ + void removeView(View view); + + /** + * 这个view是否已经被添加进了顶部布局 + * @param view + * @return + */ + boolean isViewAdded(View view); +} diff --git a/services/mogo-service-api/src/main/java/com/mogo/service/windowview/IMogoWindowManager.java b/services/mogo-service-api/src/main/java/com/mogo/service/windowview/IMogoWindowManager.java index 6ef9929854..591f113706 100644 --- a/services/mogo-service-api/src/main/java/com/mogo/service/windowview/IMogoWindowManager.java +++ b/services/mogo-service-api/src/main/java/com/mogo/service/windowview/IMogoWindowManager.java @@ -71,4 +71,10 @@ public interface IMogoWindowManager extends IProvider { * 显示所有 */ void showAll(); + + /** + * 为了配合导航动画,主屏上方1/2屏的view通过此方法添加 + * @param view 主屏上方1/2屏的view + */ + void addTopView(View view); } diff --git a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java index 462e799b7a..91363abc52 100644 --- a/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java +++ b/services/mogo-service/src/main/java/com/mogo/service/impl/MogoServiceApis.java @@ -32,6 +32,7 @@ import com.mogo.service.network.IMogoNetwork; import com.mogo.service.statusmanager.IMogoMsgCenter; import com.mogo.service.statusmanager.IMogoStatusManager; import com.mogo.service.strategy.IMogoRefreshStrategyController; +import com.mogo.service.windowview.IMogoTopViewManager; import com.mogo.service.windowview.IMogoWindowManager; import com.mogo.utils.logger.Logger; @@ -159,7 +160,12 @@ public class MogoServiceApis implements IMogoServiceApis { return getApiInstance( IMogoEntranceButtonController.class, MogoServicePaths.PATH_ENTRANCE_BUTTON_API ); } - private static < T extends IProvider > T getApiInstance( Class< T > clazz, String path ) { + @Override + public IMogoTopViewManager getTopViewManager() { + return getApiInstance(IMogoTopViewManager.class,MogoServicePaths.PATH_EXTENSIONS_TOP_VIEW_MANAGER); + } + + private static < T extends IProvider > T getApiInstance(Class< T > clazz, String path ) { T inst = SingletonsHolder.get( clazz ); if ( inst == null ) { synchronized ( sLock ) {