Android之屬性動(dòng)畫Animator

Android 3.0之前已有動(dòng)畫框架Animation(詳見:Android之視圖動(dòng)畫Animation)邪驮,但存在一些局限性,當(dāng)某個(gè)元素發(fā)生視圖動(dòng)畫后网梢,其響應(yīng)事件位置還在動(dòng)畫前的地方履澳。于是3.0之后,Google提出了屬性動(dòng)畫哭廉。

ObjectAnimator

ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "translationX", 300);
objectAnimator1.setInterpolator(new AccelerateInterpolator());
objectAnimator1.setDuration(2000);
objectAnimator.setRepeatCount(ValueAnimator.INFINITE);//Animation.INFINITE 表示重復(fù)多次
objectAnimator.setRepeatMode(ValueAnimator.RESTART);//RESTART表示從頭開始脊僚,REVERSE表示從末尾倒播
objectAnimator1.start();

第一個(gè)參數(shù):操縱的view
第二個(gè)參數(shù):操縱的動(dòng)畫屬性值
第三個(gè)參數(shù):可變數(shù)組參數(shù)

動(dòng)畫屬性值

translationX和translationY:增量控制view從它布局容器左上角坐標(biāo)偏移

ObjectAnimator.ofFloat(imageView, "translationX", 300f);

rotation、rotationX遵绰、rotationY:控制view繞支點(diǎn)進(jìn)行2D或3D旋轉(zhuǎn)

ObjectAnimator.ofFloat(imageView, "rotation", 360);

scaleX辽幌、scaleY:控制view繞支點(diǎn)進(jìn)行2D縮放

ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 0.5f,1f);

alpha:控制view透明度椿访,默認(rèn)是1(不透明)乌企,0完全透明(不可見)

ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0.5f);

x和y:描述view在容器最終位置

可變數(shù)組參數(shù)

可以有一個(gè)到N個(gè),如果是一個(gè)值的話默認(rèn)這個(gè)值是動(dòng)畫過渡值的結(jié)束值成玫。如果有N個(gè)值加酵,動(dòng)畫就在這N個(gè)值之間過渡。

動(dòng)畫監(jiān)聽

ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "alpha", 0.5f, 1f);
objectAnimator1.addListener(new Animator.AnimatorListener() {
    @Override
    public void onAnimationStart(Animator animation) {

    }

    @Override
    public void onAnimationEnd(Animator animation) {

    }

    @Override
    public void onAnimationCancel(Animator animation) {

    }

    @Override
    public void onAnimationRepeat(Animator animation) {

    }
});

一般我們只關(guān)心onAnimationEnd哭当,所以Android提供了AnimatorListenerAdapter:

 ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "alpha", 0.5f, 1f);
 objectAnimator1.addListener(new AnimatorListenerAdapter() {
     @Override
     public void onAnimationEnd(Animator animation) {
         super.onAnimationEnd(animation);
     }
 });

ValueAnimator

ValueAnimator 本身不提供任何動(dòng)畫效果猪腕,像個(gè)數(shù)值 發(fā)生器,用來產(chǎn)生具有一點(diǎn)規(guī)律數(shù)字钦勘。

ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 100);
valueAnimator.setTarget(imageView);
valueAnimator.setDuration(2000).start();
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        Int value = (Integer) animation.getAnimatedValue();
        //TODO use the value
        Toast.makeText(getApplicationContext(), "value=" + value, Toast.LENGTH_LONG).show();
    }
});

PropertyValuesHolder

針對(duì)同一個(gè)對(duì)象多個(gè)屬性陋葡,同時(shí)作用多種動(dòng)畫

PropertyValuesHolder propertyValuesHolder1 = PropertyValuesHolder.ofFloat("translationX", 300f);
PropertyValuesHolder propertyValuesHolder2 = PropertyValuesHolder.ofFloat("alpha", 1f, 0.5f);
PropertyValuesHolder propertyValuesHolder3 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
PropertyValuesHolder propertyValuesHolder4 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);
ObjectAnimator.ofPropertyValuesHolder(imageView, propertyValuesHolder1, propertyValuesHolder2, propertyValuesHolder3, propertyValuesHolder4)
        .setDuration(5000).start();

AnimatorSet

與PropertyValuesHolder類似,但AnimatorSet多了playTogether(同時(shí)執(zhí)行)彻采、playSequentially(順序執(zhí)行)腐缤、play(objectAnimator1).with(objectAnimator2)、before肛响、after這些方法協(xié)同工作岭粤。

ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(imageView, "alpha", 1f, 0.5f);
ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(imageView, "translationY", 300);
ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat(imageView, "scaleX", 1f, 0, 1f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(5000);
animatorSet.playTogether(objectAnimator1, objectAnimator2,objectAnimator3);
animatorSet.start();

xml使用屬性動(dòng)畫

res下建立animator文件夾,然后建立res/animator/set_animator.xml

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:propertyName="alpha"
android:valueFrom="0.1"
android:valueTo="1.0"
android:valueType="floatType" />

調(diào)用:

 Animator animator = AnimatorInflater.loadAnimator(getApplicationContext(), R.animator.set_animator);
animator.setTarget(imageView);
animator.start();

動(dòng)畫組合
set標(biāo)簽终惑,有一個(gè)orderring屬性設(shè)置為together绍在,還有另一個(gè)值:sequentially(表示一個(gè)接一個(gè)執(zhí)行)。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:ordering="together">
    <objectAnimator
        android:duration="1000"
        android:propertyName="scaleX"
        android:valueFrom="1"
        android:valueTo="0.5" />
    <objectAnimator
        android:duration="1000"
        android:propertyName="scaleY"
        android:valueFrom="1"
        android:valueTo="0.5" />
</set>

View的animate方法

Android 3.0后,谷歌給View增加animate方法直接驅(qū)動(dòng)屬性動(dòng)畫偿渡。

 imageView.animate()
 .alpha(0.5f)
 .y(300)
 .setDuration(2000)
 //api min is 16
 .withStartAction(new Runnable() {
     @Override
     public void run() {

     }
 })
 //api min is 16
 .withEndAction(new Runnable() {
     @Override
     public void run() {

     }
 })
 .start();

布局動(dòng)畫

設(shè)置子View過渡動(dòng)畫

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parentLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="@dimen/activity_vertical_margin">
    <ImageView
        android:id="@+id/imageMove"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@mipmap/ic_launcher" />
</LinearLayout>

 LinearLayout parentLayout = (LinearLayout) findViewById(R.id.parentLayout);
 ScaleAnimation scaleAnimation=new ScaleAnimation(0,1,0,1);
 scaleAnimation.setDuration(2000);
 LayoutAnimationController layoutAnimationController=new LayoutAnimationController(scaleAnimation,0.5f);
 layoutAnimationController.setOrder(LayoutAnimationController.ORDER_NORMAL);
 parentLayout.setLayoutAnimation(layoutAnimationController);

關(guān)于作者

點(diǎn)擊查看

微信公眾號(hào)

我的微信公眾號(hào):吳小龍同學(xué)
不止于技術(shù)分享臼寄,不取悅別人,寫給懂的人看~
歡迎微信掃一掃關(guān)注


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末溜宽,一起剝皮案震驚了整個(gè)濱河市吉拳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌适揉,老刑警劉巖留攒,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異嫉嘀,居然都是意外死亡炼邀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門剪侮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拭宁,“玉大人,你說我怎么就攤上這事瓣俯〗鼙辏” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵彩匕,是天一觀的道長(zhǎng)腔剂。 經(jīng)常有香客問我,道長(zhǎng)驼仪,這世上最難降的妖魔是什么掸犬? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮谅畅,結(jié)果婚禮上登渣,老公的妹妹穿的比我還像新娘噪服。我一直安慰自己毡泻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布粘优。 她就那樣靜靜地躺著仇味,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雹顺。 梳的紋絲不亂的頭發(fā)上丹墨,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音嬉愧,去河邊找鬼贩挣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的王财。 我是一名探鬼主播卵迂,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼绒净!你這毒婦竟也來了见咒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤挂疆,失蹤者是張志新(化名)和其女友劉穎改览,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缤言,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宝当,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了胆萧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片今妄。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鸳碧,靈堂內(nèi)的尸體忽然破棺而出盾鳞,到底是詐尸還是另有隱情,我是刑警寧澤瞻离,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布腾仅,位于F島的核電站,受9級(jí)特大地震影響套利,放射性物質(zhì)發(fā)生泄漏推励。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一肉迫、第九天 我趴在偏房一處隱蔽的房頂上張望验辞。 院中可真熱鬧,春花似錦喊衫、人聲如沸拴泌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抵拘。三九已至,卻和暖如春寝杖,著一層夾襖步出監(jiān)牢的瞬間违施,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工瑟幕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留磕蒲,地道東北人留潦。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辣往,于是被迫代替她去往敵國(guó)和親愤兵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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