七、番外篇- 自定義Visibility

繼承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)場

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、Unity簡介 1. Unity界面 Shift + Space : 放大界面 Scene界面按鈕渲染模式2D...
    MYves閱讀 8,664評論 0 22
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,656評論 1 32
  • 假設(shè),兩個有Activity A和B A啟動B: A發(fā)生exit動畫,B發(fā)生enter動畫 B返回A:B發(fā)生ret...
    i冰點閱讀 17,477評論 7 42
  • 如果起風(fēng)了 請一定要告訴我 是什么流淌過了你的風(fēng)華正茂 帶你跋涉遠(yuǎn)行 啟程漂泊 似乎經(jīng)歷了一個世紀(jì)的漫長 似乎度過...
    萬小十閱讀 376評論 0 1
  • 在家看書看了半天,兩點多想起要去郵局交電費(fèi),到了街上,看著人山人海才有種過節(jié)的真實感。 轉(zhuǎn)到集貿(mào)市場,推著自行車都...
    我是小1閱讀 171評論 0 1

友情鏈接更多精彩內(nèi)容