优化顶部view接口及实现
This commit is contained in:
@@ -7,7 +7,9 @@ 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;
|
||||
|
||||
@@ -54,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;
|
||||
@@ -181,6 +185,8 @@ public class EntranceFragment extends MvpFragment< EntranceView, EntrancePresent
|
||||
return R.layout.module_ext_layout_entrance;
|
||||
}
|
||||
|
||||
private List<View> demoCache = new ArrayList<>();
|
||||
|
||||
@Override
|
||||
protected void initViews() {
|
||||
mApis = ( IMogoServiceApis ) ARouter.getInstance().build( MogoServicePaths.PATH_SERVICE_APIS ).navigation( getContext() );
|
||||
@@ -196,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 );
|
||||
@@ -222,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() ) {
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
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;
|
||||
@@ -13,9 +15,15 @@ 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;
|
||||
|
||||
|
||||
/**
|
||||
* 顶部动画帮助类
|
||||
@@ -23,6 +31,7 @@ import com.mogo.utils.logger.Logger;
|
||||
* @author tongchenfei
|
||||
*/
|
||||
public class TopViewAnimHelper {
|
||||
private static final String TAG = "TopViewAnimHelper";
|
||||
|
||||
private ConstraintLayout topMotionLayout;
|
||||
private Group naviGroup, remainTimeGroup, remainDistanceGroup, arriveTimeGroup;
|
||||
@@ -53,6 +62,12 @@ public class TopViewAnimHelper {
|
||||
return instance;
|
||||
}
|
||||
|
||||
private IMogoMapUIController mogoMapUIController;
|
||||
|
||||
public void setIMogoMapUIController(IMogoMapUIController mogoMapUIController) {
|
||||
this.mogoMapUIController = mogoMapUIController;
|
||||
}
|
||||
|
||||
public void init(ConstraintLayout rootView) {
|
||||
init(rootView, null);
|
||||
}
|
||||
@@ -109,96 +124,156 @@ public class TopViewAnimHelper {
|
||||
}
|
||||
|
||||
private boolean isTopViewOut = true;
|
||||
private List<View> viewCaches = new ArrayList<>();
|
||||
|
||||
public void startTopInAnim(View view, ViewGroup.LayoutParams params) {
|
||||
Logger.d("TopViewAnimHelper", "startTopInAnim=====");
|
||||
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 (isTopViewOut) {
|
||||
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);
|
||||
|
||||
topContainer.addView(view, params);
|
||||
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;
|
||||
|
||||
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));
|
||||
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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
public void startTopOutAnim() {
|
||||
public void startTopOutAnim(View view) {
|
||||
Logger.d("TopViewAnimHelper", "startTopOutAnim=====");
|
||||
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(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) {
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
public void showNaviView() {
|
||||
Logger.d("TopViewAnimHelper", "showNaviView=====");
|
||||
naviGroup.setVisibility(View.VISIBLE);
|
||||
int scene = 0;
|
||||
if (isTopViewOut) {
|
||||
remainDistanceGroup.setVisibility(View.VISIBLE);
|
||||
remainTimeGroup.setVisibility(View.VISIBLE);
|
||||
@@ -220,6 +295,7 @@ public class TopViewAnimHelper {
|
||||
// (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);
|
||||
@@ -242,8 +318,10 @@ public class TopViewAnimHelper {
|
||||
// (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);
|
||||
}
|
||||
|
||||
@@ -253,6 +331,14 @@ public class TopViewAnimHelper {
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -289,4 +375,8 @@ public class TopViewAnimHelper {
|
||||
|
||||
void onAnimEnd();
|
||||
}
|
||||
|
||||
public boolean isViewAdded(View view) {
|
||||
return viewCaches.contains(view);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ 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;
|
||||
|
||||
@@ -16,19 +17,40 @@ import com.mogo.service.windowview.IMogoTopViewManager;
|
||||
@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 addTopView(View view, ViewGroup.LayoutParams params) {
|
||||
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 removeTopView() {
|
||||
TopViewAnimHelper.getInstance().startTopOutAnim();
|
||||
public void removeView(View view) {
|
||||
TopViewAnimHelper.getInstance().startTopOutAnim(view);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void init(Context context) {
|
||||
|
||||
public boolean isViewAdded(View view) {
|
||||
return TopViewAnimHelper.getInstance().isViewAdded(view);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user