Android 屬性動(dòng)畫(huà)(三)

即之前了解了屬性動(dòng)畫(huà) Property Animator 的 Evaluator 添吗、Interpolator 和 xml 定義 之后,今天就完成最后一部分的總結(jié):布局動(dòng)畫(huà)瞬哼。不過(guò)婚肆,先補(bǔ)充一個(gè)知識(shí)點(diǎn):PropertyValuesHolder。

PropertyValuesHolder

我們可以理解為 多屬性值控制器 坐慰, 它可以幫助我們跟簡(jiǎn)單方便的實(shí)現(xiàn)多個(gè)同步動(dòng)畫(huà)的效果较性。

// 用 PropertyValuesHolder 實(shí)現(xiàn)多個(gè)同步動(dòng)畫(huà)
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f, 0f, 1f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 0, 600, 0);
ObjectAnimator.ofPropertyValuesHolder(animView, pvhX, pvhY).setDuration(1000).start();

如上就是實(shí)現(xiàn) 同步 漸變 和 Y軸縮放 的動(dòng)畫(huà)效果用僧。可以與其他實(shí)現(xiàn)方式比較下赞咙,的確是更加方便责循。

布局動(dòng)畫(huà) (Layout Aniamtion)

以下參靠Android 屬性動(dòng)畫(huà)(Property Animation) 完全解析 (下),的確這種方式講解最簡(jiǎn)單攀操。主要使用LayoutTransition為布局的容器設(shè)置動(dòng)畫(huà)院仿,當(dāng)容器中的視圖層次發(fā)生變化時(shí)存在過(guò)渡的動(dòng)畫(huà)效果。

過(guò)渡動(dòng)畫(huà)有四種類型:

  • LayoutTransition.APPEARING 當(dāng)一個(gè)View A 在ViewGroup中出現(xiàn)時(shí)速和,對(duì)View A設(shè)置的動(dòng)畫(huà)
  • LayoutTransition.DISAPPEARING 當(dāng)一個(gè)View A 在ViewGroup中消失時(shí)歹垫,對(duì)View A設(shè)置的動(dòng)畫(huà)
  • LayoutTransition.CHANGE_APPEARING 當(dāng)一個(gè)View A 在ViewGroup中出現(xiàn)時(shí),對(duì)被 View A 影響了位置的 ** View ** 設(shè)置的動(dòng)畫(huà)
  • LayoutTransition.CHANGE_DISAPPEARING 當(dāng)一個(gè)View A 在ViewGroup中消失時(shí)颠放,對(duì)被 View A 影響了位置的 ** View ** 設(shè)置的動(dòng)畫(huà)
    ·
    主要?jiǎng)赢?huà)設(shè)置代碼:
LayoutTransition transition = new LayoutTransition();
/**  @param transitionType One of {@link #CHANGE_APPEARING}, 
 *          {@link #CHANGE_DISAPPEARING},
 *          {@link #CHANGING}, 
 *          {@link #APPEARING}, 
 *          or {@link #DISAPPEARING},
 *          which determines the* animation whose animator is being set.
 *   @param animator The animation being assigned. 
 *          A value of <code>null</code> means that no animation
 *          will be run for the specified transitionType. 
 * */
transition.setAnimator(LayoutTransition.CHANGE_APPEARING,  transition.getAnimator(LayoutTransition.CHANGE_APPEARING)); 
 ViewGroup.setLayoutTransition(transition );

如上大家可以看到 LayoutTransition.setAnimator(int transitionType, Animator animator); 第一個(gè)參數(shù)就是 設(shè)置布局動(dòng)畫(huà)類型(四種)排惨,第二個(gè)參數(shù)就是動(dòng)畫(huà)對(duì)象,我們可以任意設(shè)置碰凶。
當(dāng)然暮芭,LayoutTransition 可以設(shè)置多個(gè) setAnimator。

實(shí)現(xiàn)demo 代碼

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/id_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="addBtn"
        android:text="addBtns" />

    <CheckBox
        android:id="@+id/id_appear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="APPEARING" />

    <CheckBox
        android:id="@+id/id_change_appear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="CHANGE_APPEARING" />

    <CheckBox
        android:id="@+id/id_disappear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="DISAPPEARING" />

    <CheckBox
          android:id="@+id/id_change_disappear"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="CHANGE_DISAPPEARING " />

</LinearLayout>

代碼:

package com.example.zhy_property_animation;

import android.animation.LayoutTransition;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.GridLayout;

public class LayoutAnimaActivity extends Activity implements
        OnCheckedChangeListener
{
    private ViewGroup viewGroup;
    private GridLayout mGridLayout;
    private int mVal;
    private LayoutTransition mTransition;

    private CheckBox mAppear, mChangeAppear, mDisAppear, mChangeDisAppear;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_animator);
        viewGroup = (ViewGroup) findViewById(R.id.id_container);

        mAppear = (CheckBox) findViewById(R.id.id_appear);
        mChangeAppear = (CheckBox) findViewById(R.id.id_change_appear);
        mDisAppear = (CheckBox) findViewById(R.id.id_disappear);
        mChangeDisAppear = (CheckBox) findViewById(R.id.id_change_disappear);

        mAppear.setOnCheckedChangeListener(this);
        mChangeAppear.setOnCheckedChangeListener(this);
        mDisAppear.setOnCheckedChangeListener(this);
        mChangeDisAppear.setOnCheckedChangeListener(this);

        // 創(chuàng)建一個(gè)GridLayout
        mGridLayout = new GridLayout(this);
        // 設(shè)置每列5個(gè)按鈕
        mGridLayout.setColumnCount(5);
        // 添加到布局中
        viewGroup.addView(mGridLayout);
        //默認(rèn)動(dòng)畫(huà)全部開(kāi)啟
        mTransition = new LayoutTransition();
        mGridLayout.setLayoutTransition(mTransition);

    }

    /**
     * 添加按鈕
     * 
     * @param view
     */
    public void addBtn(View view)
    {
        final Button button = new Button(this);
        button.setText((++mVal) + "");
        mGridLayout.addView(button, Math.min(1, mGridLayout.getChildCount()));
        button.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                mGridLayout.removeView(button);
            }
        });
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
    {
        mTransition = new LayoutTransition();
        mTransition.setAnimator(
                LayoutTransition.APPEARING,
                (mAppear.isChecked() ? mTransition
                        .getAnimator(LayoutTransition.APPEARING) : null));
        mTransition
                .setAnimator(
                        LayoutTransition.CHANGE_APPEARING,
                        (mChangeAppear.isChecked() ? mTransition
                                .getAnimator(LayoutTransition.CHANGE_APPEARING)
                                : null));
        mTransition.setAnimator(
                LayoutTransition.DISAPPEARING,
                (mDisAppear.isChecked() ? mTransition
                        .getAnimator(LayoutTransition.DISAPPEARING) : null));
        mTransition.setAnimator(
                LayoutTransition.CHANGE_DISAPPEARING,
                (mChangeDisAppear.isChecked() ? mTransition
                        .getAnimator(LayoutTransition.CHANGE_DISAPPEARING)
                        : null));
        mGridLayout.setLayoutTransition(mTransition);
    }
}

大家可以運(yùn)行欲低,看下效果谴麦。

總結(jié)

進(jìn)過(guò) 三篇文章的學(xué)習(xí)總結(jié),我們對(duì) 屬性動(dòng)畫(huà) (Property Animator)有了全面的了解∩焱罚現(xiàn)在匾效,我們就可以去實(shí)戰(zhàn)中使用他們啦。至于直播打賞動(dòng)畫(huà)恤磷,

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末面哼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扫步,更是在濱河造成了極大的恐慌魔策,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件河胎,死亡現(xiàn)場(chǎng)離奇詭異闯袒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)游岳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門政敢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人胚迫,你說(shuō)我怎么就攤上這事喷户。” “怎么了访锻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,689評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵褪尝,是天一觀的道長(zhǎng)闹获。 經(jīng)常有香客問(wèn)我,道長(zhǎng)河哑,這世上最難降的妖魔是什么避诽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,925評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮璃谨,結(jié)果婚禮上沙庐,老公的妹妹穿的比我還像新娘。我一直安慰自己睬罗,他們只是感情好轨功,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布旭斥。 她就那樣靜靜地躺著容达,像睡著了一般。 火紅的嫁衣襯著肌膚如雪垂券。 梳的紋絲不亂的頭發(fā)上花盐,一...
    開(kāi)封第一講書(shū)人閱讀 51,727評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音菇爪,去河邊找鬼算芯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛凳宙,可吹牛的內(nèi)容都是我干的熙揍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼氏涩,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼届囚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起是尖,我...
    開(kāi)封第一講書(shū)人閱讀 39,349評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤意系,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后饺汹,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蛔添,經(jīng)...
    沈念sama閱讀 45,820評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評(píng)論 3 337
  • 正文 我和宋清朗相戀三年兜辞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了迎瞧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逸吵,死狀恐怖夹攒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胁塞,我是刑警寧澤咏尝,帶...
    沈念sama閱讀 35,812評(píng)論 5 346
  • 正文 年R本政府宣布压语,位于F島的核電站,受9級(jí)特大地震影響编检,放射性物質(zhì)發(fā)生泄漏胎食。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評(píng)論 3 331
  • 文/蒙蒙 一允懂、第九天 我趴在偏房一處隱蔽的房頂上張望厕怜。 院中可真熱鬧,春花似錦蕾总、人聲如沸粥航。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,017評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)递雀。三九已至,卻和暖如春蚀浆,著一層夾襖步出監(jiān)牢的瞬間缀程,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,142評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工市俊, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杨凑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,388評(píng)論 3 373
  • 正文 我出身青樓摆昧,卻偏偏與公主長(zhǎng)得像撩满,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绅你,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評(píng)論 2 355

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