动画基本完成,准备向外提供相关接口

This commit is contained in:
tongchenfei
2020-05-26 09:59:01 +08:00
parent 5e8bb902a8
commit 9f61c81ba7
2 changed files with 167 additions and 17 deletions

View File

@@ -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();
}
}