7.ViewPropertyAnimator

ViewPropertyAnimator概述

屬性動(dòng)畫已不再是針對于View而進(jìn)行設(shè)計(jì)的了,而是一種對數(shù)值不斷操作的過程西傀,我們可以將屬性動(dòng)畫對數(shù)值的操作過程設(shè)置到指定對象的屬性上來买乃,從而形成一種動(dòng)畫的效果显拜。雖然屬性動(dòng)畫給我們提供了ValueAnimator類和ObjectAnimator類枢泰,在正常情況下笨蚁,基本都能滿足我們對動(dòng)畫操作的需求凶朗,但ValueAnimator類和ObjectAnimator類本身并不是針對View對象的而設(shè)計(jì)的瓷胧,而我們在大多數(shù)情況下主要都還是對View進(jìn)行動(dòng)畫操作的,因此Google官方在Android 3.1系統(tǒng)中補(bǔ)充了ViewPropertyAnimator類棚愤,這個(gè)類便是專門為View動(dòng)畫而設(shè)計(jì)的搓萧。

優(yōu)點(diǎn):

  • 專門針對View對象動(dòng)畫而操作的類杂数。
  • 提供了更簡潔的鏈?zhǔn)秸{(diào)用設(shè)置多個(gè)屬性動(dòng)畫,這些動(dòng)畫可以同時(shí)進(jìn)行的瘸洛。
  • 擁有更好的性能揍移,多個(gè)屬性動(dòng)畫是一次同時(shí)變化,只執(zhí)行一次UI刷新(也就是只調(diào)用一次invalidate,而n個(gè)ObjectAnimator就會進(jìn)行n次屬性變化反肋,就有n次invalidate)那伐。
  • 每個(gè)屬性提供兩種類型方法設(shè)置。scaleX()/scaleXBy()
  • 該類只能通過View的animate()獲取其實(shí)例對象的引用石蔗。

用法:鏈?zhǔn)秸{(diào)用喧锦,自動(dòng)start,同時(shí)一次UI刷新抓督, 簡化流程提高效率燃少。

AnimatorSet set = new AnimatorSet();
set.playTogether( ObjectAnimator.ofFloat(btn,"alpha",0.5f),
        ObjectAnimator.ofFloat(btn,"rotation",360),
        ObjectAnimator.ofFloat(btn,"scaleX",1.5f),
        ObjectAnimator.ofFloat(btn,"scaleY",1.5f),
        ObjectAnimator.ofFloat(btn,"translationX",0,50),
        ObjectAnimator.ofFloat(btn,"translationY",0,50)
);
set.setDuration(5000).start();
//自動(dòng)調(diào)用start方法
btn.animate().alpha(0.5f).rotation(360).scaleX(1.5f).scaleY(1.5f)
              .translationX(50).translationY(50).setDuration(5000);

每個(gè)屬性,兩種類型方法設(shè)置:

  • rotationX(20) 改變到某個(gè)值铃在。 旋轉(zhuǎn)到20度阵具。再調(diào)用一次的話,由于已經(jīng)到20度的位置定铜,便不在有變化阳液。
  • rotationXBy(20) 改變某個(gè)值的量。 旋轉(zhuǎn)20度揣炕。再調(diào)用一次的話帘皿,繼續(xù)旋轉(zhuǎn)20度,到40度的位置畸陡。
public ViewPropertyAnimator scaleY(float value) {
        animateProperty(SCALE_Y, value);
        return this;
    }

public ViewPropertyAnimator scaleYBy(float value) {
    animatePropertyBy(SCALE_Y, value);
    return this;
    
-----------------------------------------------------------------------------

private void animateProperty(int constantName, float toValue) {
        float fromValue = getValue(constantName);
        float deltaValue = toValue - fromValue;
        animatePropertyBy(constantName, fromValue, deltaValue);
    }

private void animatePropertyBy(int constantName, float byValue) {
        float fromValue = getValue(constantName);
        animatePropertyBy(constantName, fromValue, byValue);
    }
    
----------scale/rotation/alpha等方法鹰溜,到最后都是調(diào)用該方法-----------------------------------

/**
     * Utility function, called by animateProperty() and animatePropertyBy(), which handles the
     * details of adding a pending animation and posting the request to start the animation.
     *
     * @param constantName The specifier for the property being animated
     * @param startValue The starting value of the property
     * @param byValue The amount by which the property will change
     */
    private void animatePropertyBy(int constantName, float startValue, float byValue) {
        // First, cancel any existing animations on this property
        if (mAnimatorMap.size() > 0) {
            Animator animatorToCancel = null;
            Set<Animator> animatorSet = mAnimatorMap.keySet();
            for (Animator runningAnim : animatorSet) {
                PropertyBundle bundle = mAnimatorMap.get(runningAnim);
                // 如果在該屬性上已經(jīng)有動(dòng)畫,則結(jié)束該屬性上的動(dòng)畫丁恭。
                if (bundle.cancel(constantName)) {
                    // property was canceled - cancel the animation if it's now empty
                    // Note that it's safe to break out here because every new animation
                    // on a property will cancel a previous animation on that property, so
                    // there can only ever be one such animation running.
                    if (bundle.mPropertyMask == NONE) {
                        // the animation is no longer changing anything - cancel it
                        animatorToCancel = runningAnim;
                        break;
                    }
                }
            }
            if (animatorToCancel != null) {
                animatorToCancel.cancel();
            }
        }

        // 封裝該屬性和值曹动,放入集合中
        NameValuesHolder nameValuePair = new NameValuesHolder(constantName, startValue, byValue);
        mPendingAnimations.add(nameValuePair);
        mView.removeCallbacks(mAnimationStarter);
        //雖然每次操作屬性都post了該Runnable類,但是每次都把原來的移除了牲览,始終都在維護(hù)一個(gè)最新的集合post墓陈。
        //TODO ?第献?贡必? post給系統(tǒng),然后系統(tǒng)按順序調(diào)用庸毫,假如系統(tǒng)很閑仔拟,post了立馬就start,那么下一個(gè)屬性設(shè)置的時(shí)候呢岔绸,怎么保證每個(gè)屬性的設(shè)置都放到集合里了才開始start理逊?
        mView.postOnAnimation(mAnimationStarter);
    }

后續(xù)監(jiān)聽什么的,還沒研究盒揉。 資料鏈接晋被。

原理流程:
image

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市刚盈,隨后出現(xiàn)的幾起案子羡洛,更是在濱河造成了極大的恐慌,老刑警劉巖藕漱,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欲侮,死亡現(xiàn)場離奇詭異,居然都是意外死亡肋联,警方通過查閱死者的電腦和手機(jī)威蕉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橄仍,“玉大人韧涨,你說我怎么就攤上這事∥攴保” “怎么了虑粥?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宪哩。 經(jīng)常有香客問我娩贷,道長,這世上最難降的妖魔是什么锁孟? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任彬祖,我火速辦了婚禮,結(jié)果婚禮上品抽,老公的妹妹穿的比我還像新娘涧至。我一直安慰自己,他們只是感情好桑包,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布南蓬。 她就那樣靜靜地躺著,像睡著了一般哑了。 火紅的嫁衣襯著肌膚如雪赘方。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天弱左,我揣著相機(jī)與錄音窄陡,去河邊找鬼。 笑死拆火,一個(gè)胖子當(dāng)著我的面吹牛跳夭,可吹牛的內(nèi)容都是我干的涂圆。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼币叹,長吁一口氣:“原來是場噩夢啊……” “哼润歉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起颈抚,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤踩衩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后贩汉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驱富,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年匹舞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了褐鸥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赐稽,死狀恐怖晶疼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情又憨,我是刑警寧澤翠霍,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站蠢莺,受9級特大地震影響寒匙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜躏将,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一锄弱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧祸憋,春花似錦会宪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拦赠,卻和暖如春巍沙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背荷鼠。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工句携, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人允乐。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓矮嫉,卻偏偏與公主長得像削咆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蠢笋,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容