@Nullable @Override public Transition getSharedElementTransition(@NonNull ViewGroup container, @Nullable final View from, @Nullable View to, boolean isPush) { Transition transition = new TransitionSet().addTransition(new ChangeBounds()).addTransition(new ChangeClipBounds()).addTransition(new ChangeTransform()); transition.setPathMotion(new ArcMotion()); // The framework doesn't totally fade out the "from" shared element, so we'll hide it manually once it's safe. transition.addListener(new TransitionListener() { @Override public void onTransitionStart(Transition transition) { if (from != null) { for (String name : sharedElementNames) { View namedView = TransitionUtils.findNamedView(from, name); if (namedView != null) { namedView.setVisibility(View.INVISIBLE); } } } } @Override public void onTransitionEnd(Transition transition) { } @Override public void onTransitionCancel(Transition transition) { } @Override public void onTransitionPause(Transition transition) { } @Override public void onTransitionResume(Transition transition) { } }); return transition; }
public void setupSharedElementTransitionsFab(@NonNull Activity activity, @Nullable View target, int dialogCornerRadius) { ArcMotion arcMotion = new ArcMotion(); arcMotion.setMinimumHorizontalAngle(50f); arcMotion.setMinimumVerticalAngle(50f); int color = ContextCompat.getColor(activity, R.color.accent); Interpolator easeInOut = AnimationUtils.loadInterpolator(activity, android.R.interpolator.fast_out_slow_in); MorphFabToDialog sharedEnter = new MorphFabToDialog(color, dialogCornerRadius); sharedEnter.setPathMotion(arcMotion); sharedEnter.setInterpolator(easeInOut); MorphDialogToFab sharedReturn = new MorphDialogToFab(color); sharedReturn.setPathMotion(arcMotion); sharedReturn.setInterpolator(easeInOut); if (target != null) { sharedEnter.addTarget(target); sharedReturn.addTarget(target); } activity.getWindow().setSharedElementEnterTransition(sharedEnter); activity.getWindow().setSharedElementReturnTransition(sharedReturn); }
public void setupSharedElementTransitionsButton(@NonNull Activity activity, @Nullable View target) { ArcMotion arcMotion = new ArcMotion(); arcMotion.setMinimumHorizontalAngle(50f); arcMotion.setMinimumVerticalAngle(50f); int color = ContextCompat.getColor(activity, R.color.accent); Interpolator easeInOut = AnimationUtils.loadInterpolator(activity, android.R.interpolator.fast_out_slow_in); MorphButtonToDialog sharedEnter = new MorphButtonToDialog(color); sharedEnter.setPathMotion(arcMotion); sharedEnter.setInterpolator(easeInOut); MorphDialogToButton sharedReturn = new MorphDialogToButton(color); sharedReturn.setPathMotion(arcMotion); sharedReturn.setInterpolator(easeInOut); if (target != null) { sharedEnter.addTarget(target); sharedReturn.addTarget(target); } activity.getWindow().setSharedElementEnterTransition(sharedEnter); activity.getWindow().setSharedElementReturnTransition(sharedReturn); }
private void setPathMotion() { ChangeBounds changeBounds = new ChangeBounds(); //或者使用PathMotion 重写Path 调用Path.cubicTo划一个弧度 ArcMotion arcMotion = new ArcMotion(); // arcMotion.setMaximumAngle(90f); // arcMotion.setMinimumVerticalAngle(90f); arcMotion.setMinimumHorizontalAngle(90F); changeBounds.setPathMotion(arcMotion); changeBounds.setDuration(1000); TransitionManager.beginDelayedTransition(flPathLayout, changeBounds); FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) btnPathMotion.getLayoutParams(); params.gravity = isPath ? Gravity.TOP | Gravity.LEFT : Gravity.BOTTOM | Gravity.RIGHT; btnPathMotion.setLayoutParams(params); isPath = !isPath; } }
.getIntExtra(EXTRA_SHARED_ELEMENT_START_CORNER_RADIUS, -1); ArcMotion arcMotion = new ArcMotion(); arcMotion.setMinimumHorizontalAngle(5f); arcMotion.setMinimumVerticalAngle(10f);
/** * 设置自定义 Shared Element切换动画 */ private void setMotion() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //定义ArcMotion ArcMotion arcMotion = new ArcMotion(); arcMotion.setMinimumHorizontalAngle(50f); arcMotion.setMinimumVerticalAngle(50f); //插值器,控制速度 Interpolator interpolator = AnimationUtils.loadInterpolator(this, android.R.interpolator.fast_out_slow_in); //实例化自定义的ChangeBounds CustomChangeBounds changeBounds = new CustomChangeBounds(); changeBounds.setPathMotion(arcMotion); changeBounds.setInterpolator(interpolator); changeBounds.addTarget(binding.include.ivOnePhoto); //将切换动画应用到当前的Activity的进入和返回 getWindow().setSharedElementEnterTransition(changeBounds); getWindow().setSharedElementReturnTransition(changeBounds); } }
public void setupSharedEelementTransitions() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return; //Show dialog normally if below Lollipop ArcMotion arcMotion = new ArcMotion(); arcMotion.setMinimumHorizontalAngle(50f); arcMotion.setMinimumVerticalAngle(50f); Interpolator easeInOut = AnimationUtils.loadInterpolator(this, android.R.interpolator.fast_out_slow_in); MorphFabToDialog sharedEnter = new MorphFabToDialog(getBackgroundColor()); sharedEnter.setPathMotion(arcMotion); sharedEnter.setInterpolator(easeInOut); MorphDialogToFab sharedReturn = new MorphDialogToFab(getBackgroundColor()); sharedReturn.setPathMotion(arcMotion); sharedReturn.setInterpolator(easeInOut); if (ui.container != null) { sharedEnter.addTarget(ui.container); sharedReturn.addTarget(ui.container); } getWindow().setSharedElementEnterTransition(sharedEnter); getWindow().setSharedElementReturnTransition(sharedReturn); }