继承Visibility,覆盖两个方法:
onAppear() :创建并返回一个进入场景的Animator对象。
onDisappear():创建并返回一个退出场景的Animator对象。
public class FABTransition extends Visibility {
private View fab;
private Context context;
private static final String BOTTOM_TRANSITION_Y = "FABTransition:change_transY:transitionY";
public FABTransition(View fab, Context context) {
this.fab = fab;
this.context = context;
}
/**
* 收集动画的开始信息
* @param transitionValues 只有两个成员变量view和values, view指的是我们要从哪个view上收集信息, values是用来存放我们收集到的信息的
* 比如: 在captureStartValues里, transitionValues.view指的就是我们在开始动画的界面上的那个view,
* 在captureEndValues指的就是在目标界面上的那个view
*/
@Override
public void captureStartValues(TransitionValues transitionValues) {
super.captureStartValues(transitionValues);
int transY= (int) (context.getResources().getDisplayMetrics().density*56*2);
transitionValues.values.put(BOTTOM_TRANSITION_Y,transY);
}
/**
* 收集动画结束的信息
*/
@Override
public void captureEndValues(TransitionValues transitionValues) {
super.captureEndValues(transitionValues);
transitionValues.values.put(BOTTOM_TRANSITION_Y, 0);
}
/**
* 创建一个Animator
*/
@Override
public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) {
return super.createAnimator(sceneRoot, startValues, endValues);
}
@Override
public Animator onAppear(ViewGroup sceneRoot, final View view, TransitionValues startValues, TransitionValues endValues) {
if (null == startValues || null == endValues) {
return null;
}
int startY= (int) startValues.values.get(BOTTOM_TRANSITION_Y);
int endY= (int) endValues.values.get(BOTTOM_TRANSITION_Y);
if(view==fab && startY!=endY){
ValueAnimator valueAnimator=ValueAnimator.ofInt(startY,endY);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Object transY= animation.getAnimatedValue();
if(transY!=null){
view.setTranslationY((Integer) transY);
}
}
});
return valueAnimator;
}
return null;
}
@Override
public Animator onDisappear(ViewGroup sceneRoot, final View view, TransitionValues startValues, TransitionValues endValues) {
if (null == startValues || null == endValues) {
return null;
}
int startY= (int) endValues.values.get(BOTTOM_TRANSITION_Y);
int endY= (int) startValues.values.get(BOTTOM_TRANSITION_Y);
if(view==fab && startY!=endY){
ValueAnimator valueAnimator=ValueAnimator.ofInt(startY,endY);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Object transY= animation.getAnimatedValue();
if(transY!=null){
view.setTranslationY((Integer) transY);
}
}
});
return valueAnimator;
}
return null;
}
}
使用自定义的FABTransition ,为它添加一个Target:
TransitionSet cotentTransition=new TransitionSet();
Slide slide=new Slide(Gravity.LEFT);
slide.setDuration(500);
slide.excludeTarget(android.R.id.navigationBarBackground, true);
slide.excludeTarget(android.R.id.statusBarBackground, true);
slide.excludeTarget(R.id.appBarLayout, true);
slide.excludeTarget(R.id.fab, true);
cotentTransition.addTransition(slide);
//fab进入动画
FABTransition fabTransition=new FABTransition(fab,this);
fabTransition.addTarget(R.id.fab);
fabTransition.setDuration(500);
cotentTransition.addTransition(fabTransition);
getWindow().setEnterTransition(cotentTransition);
截取自 :http://www.jianshu.com/p/19cc20e6d8a9
Transition系列文章
一、初识Transition—实现两个场景的变换
二、番外篇 Transition之ViewOverlay
三、定义 界面指定元素 或界面间共享元素 的转场动画基础
四、Content Transition实现非共享元素转场
五、SharedElementTransition之Activity间的转场
六、SharedElementTransition之Fragment间的转场
七、番外篇- 自定义Visibility
八、5.0以下实现共享转场