繼承Visibility,覆蓋兩個方法:
onAppear() :創(chuàng)建并返回一個進(jìn)入場景的Animator對象。
onDisappear():創(chuàng)建并返回一個退出場景的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指的就是在目標(biāo)界面上的那個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);
}
/**
* 收集動畫結(jié)束的信息
*/
@Override
public void captureEndValues(TransitionValues transitionValues) {
super.captureEndValues(transitionValues);
transitionValues.values.put(BOTTOM_TRANSITION_Y, 0);
}
/**
* 創(chuàng)建一個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進(jìn)入動畫
FABTransition fabTransition=new FABTransition(fab,this);
fabTransition.addTarget(R.id.fab);
fabTransition.setDuration(500);
cotentTransition.addTransition(fabTransition);
getWindow().setEnterTransition(cotentTransition);

自定義Visibility fab
截取自 :http://www.itdecent.cn/p/19cc20e6d8a9
Transition系列文章
一、初識Transition—實現(xiàn)兩個場景的變換
二、番外篇 Transition之ViewOverlay
三、定義 界面指定元素 或界面間共享元素 的轉(zhuǎn)場動畫基礎(chǔ)
四、Content Transition實現(xiàn)非共享元素轉(zhuǎn)場
五、SharedElementTransition之Activity間的轉(zhuǎn)場
六、SharedElementTransition之Fragment間的轉(zhuǎn)場
七、番外篇- 自定義Visibility
八、5.0以下實現(xiàn)共享轉(zhuǎn)場