屬性動畫

屬性動畫可直接改變View的屬性值扩所,屬性動畫幾乎可以對任意對象執(zhí)行動畫祖屏,而不局限在View對象執(zhí)行動畫。
基本屬性
動畫持續(xù)時間:默認值是300ms袁勺,通過android:duration指定
動畫插值方式:android:interpolator
動畫重復次數(shù):動畫重復播放次數(shù)期丰,android:repeatCount
動畫重復模式:在一次動畫播放結(jié)束后,重復下次動畫時街立,是從開始幀再次播放到結(jié)束幀埠通,還是從結(jié)束幀反方向播放到開始幀。android:repeatMode
幀刷新頻率:指定間隔多長時間播放一幀梁剔,默認值是10毫秒
動畫集合

Eavluator

是用來控制屬性動畫如何計算屬性值的舞蔽。
它的接口是TypeEvalutor,其中定義了evaluate方法,供不同的子類實現(xiàn)。

public interface TypeEvaluator<T> {
    public T evaluate(float fraction, T startValue, T endValue);
}

**輸入初始值和結(jié)束值及一個進度比灸拍,計算每個進度對應(yīng)的值鸡岗。
常見的實現(xiàn)類有
ArgbEvaluator,IntEvaluator,FloatEvaluator

ValueAnimator

屬性動畫最重要的一個類声登,繼承自Animator,它定義了屬性動畫大部分的核心功能悯嗓,包括計算各幀的屬性值,處理更新時間铅祸,按照屬性值的類型控制計算規(guī)則等合武。
一個完整的屬性動畫由兩部分組成:
1.計算動畫各幀的相關(guān)屬性值稼跳。
2.將這些屬性值設(shè)置給指定對象。
ValueAnimator為開發(fā)者完成了第一部分的功能汤善,第二部分功能由開發(fā)者自行設(shè)置萎津。
ValueAnimator的構(gòu)造函數(shù)是空實現(xiàn),一般由使用靜態(tài)工廠方法來進行實例化锉屈。

    public static ValueAnimator ofInt(int... values) {
        ValueAnimator anim = new ValueAnimator();
        anim.setIntValues(values);
        return anim;
    }
    public static ValueAnimator ofArgb(int... values) {
        ValueAnimator anim = new ValueAnimator();
        anim.setIntValues(values);
        anim.setEvaluator(ArgbEvaluator.getInstance());
        return anim;
    }
    public static ValueAnimator ofFloat(float... values) {
        ValueAnimator anim = new ValueAnimator();
        anim.setFloatValues(values);
        return anim;
    }
    public static ValueAnimator ofPropertyValuesHolder(PropertyValuesHolder... values) {
        ValueAnimator anim = new ValueAnimator();
        anim.setValues(values);
        return anim;
    }
    public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values) {
        ValueAnimator anim = new ValueAnimator();
        anim.setObjectValues(values);
        anim.setEvaluator(evaluator);
        return anim;
    }

獲取實例颈渊,設(shè)置動畫持續(xù)時間俊嗽,差值方式,重復次數(shù)等屬性值绍豁,啟動動畫竹揍。為ValueAnimator 注冊addUpdateListener監(jiān)聽器,并在這個方法中計算出來的屬性設(shè)置給指定對象芬位。

        int statusBarColor = this.getWindow().getStatusBarColor();
        ValueAnimator valueAnimator = ValueAnimator.ofObject(new ArgbEvaluator(), statusBarColor, color);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                Test.this.getWindow().setStatusBarColor((Integer) animation.getAnimatedValue());
            }
        });
        valueAnimator.setDuration(300).setStartDelay(0);
        valueAnimator.start();

ValueAnimator改變高度案例

隱藏顯示—
1通過更改height逐漸的變?yōu)?
2更改整個view的paddingyop—改成父值
為了整體控制動畫—在外面再包一層布局
開始默認隱藏三個布局

//一開始應(yīng)該讓下面的三個布局隱藏昧碉,將其height設(shè)置為0--通過params

//為了獲取最初的高度--設(shè)置一個布局監(jiān)聽器--局對可以取到寬高
llSafeAnim.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        llSafeAnim.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        //記錄最初的高度--一遍之后變回來
        height = llSafeAnim.getHeight();

        //將當前的高度設(shè)置為0--隱藏---這里使用.getLayoutParams因為在布局里面寫
        //線性布局是繼承自viewgroup
        ViewGroup.LayoutParams params = llSafeAnim.getLayoutParams();
        params.height = 0;
        llSafeAnim.setLayoutParams(params);
    }
});

點擊切換動畫

int height;//最初的高度
//定義變量boolean--完成切換--默認為不打開
boolean isOpen = false;

//設(shè)置整個模塊條目的點擊事件
@OnClick(R.id.safe_module)
public void onViewClicked() {

    //ValueAnimator控制值在指定范圍內(nèi)改變的動畫對象, 注意:它只是負責讓值進行改變,
    //本身不會有任何的動畫效果
    ValueAnimator animator = null;
    if (isOpen) {
        //ValueAnimator使用--需要關(guān)閉
        animator = ValueAnimator.ofInt(height, 0);
    } else {
        //ValueAnimator使用--需要打開
        animator = ValueAnimator.ofInt(0, height);
    }
    //設(shè)置時間
    animator.setDuration(600).start();
    //置為反值
    isOpen = !isOpen;
}

監(jiān)聽值的變化過程—將值設(shè)置給height實現(xiàn)動畫—執(zhí)行之前進行監(jiān)聽

//監(jiān)聽值的變化過程
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        //獲取動畫的值--默認是object類型--強轉(zhuǎn)
        int animatedValue = (int) animation.getAnimatedValue();
        //我們只需要將值設(shè)置給height
        ViewGroup.LayoutParams params = llSafeAnim.getLayoutParams();
        params.height = animatedValue;
        llSafeAnim.setLayoutParams(params);
    }
});

添加監(jiān)聽動畫結(jié)束語開始

//監(jiān)聽動畫
animator.addListener(new MyAnimatorListener());
//設(shè)置時間
animator.setDuration(600).start();
//置為反值
isOpen = !isOpen;
class MyAnimatorListener extends AnimatorListenerAdapter {
    //當動畫結(jié)束
    @Override
    public void onAnimationEnd(Animator animation) {
        isAnimRunning = false;
    }

    ///當動畫開始
    @Override
    public void onAnimationStart(Animator animation) {
        isAnimRunning = true;
    }
}

ObjectAnimator

ObjectAnimator是ValueAnimator 的子類,封裝實現(xiàn)了屬性值設(shè)置給指定對象的功能.
只有在ObjectAnimator實現(xiàn)不了的場景下才考慮使用ValueAnimator 箭养。
ObjectAnimator最大的不同是在構(gòu)造實例中需要指定作用的具體對象和對象的屬性名,而且一般不需要注冊addUpdateListener監(jiān)聽器喝检。

傳統(tǒng)animator--Objectanimator.ofXXX

透明效果-alpha

//獲取ObjectAnimator對象
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "alpha",
        1.0f, 0.5f, 0.0f, 0.2f, 0.7f, 1.0f);
// 參數(shù)1:target 目標:產(chǎn)生的動畫效果 誰來執(zhí)行
// 參數(shù)2:屬性名字 字符串類型--針對(參數(shù)1)控件來說 --alpha透明--可以通過
// 控件.set看一下都有哪些方法--也就是有什么參數(shù)
// 參數(shù)3:可變參數(shù)--數(shù)組
//設(shè)置動畫執(zhí)行時間
objectAnimator.setDuration(2000);
//開始執(zhí)行動畫
objectAnimator.start();

旋轉(zhuǎn)效果

//獲取ObjectAnimator對象
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "rotationX", 0, 90, 180, 360);
// 參數(shù)1:target 目標:產(chǎn)生的動畫效果 誰來執(zhí)行
// 參數(shù)2:屬性名字 字符串類型--針對(參數(shù)1)控件來說 --rotationX按照x軸移旋轉(zhuǎn)--可以通過
// 控件.set看一下都有哪些方法--也就是有什么參數(shù)
// 參數(shù)3:可變參數(shù)--數(shù)組
//設(shè)置動畫執(zhí)行時間
objectAnimator.setDuration(2000);
//開始執(zhí)行動畫
objectAnimator.start();

縮放動畫

//獲取ObjectAnimator對象
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv, "scaleX",
        1.0f, 2.0f, 3.0f);
// 參數(shù)1:target 目標:產(chǎn)生的動畫效果 誰來執(zhí)行
// 參數(shù)2:屬性名字 字符串類型--針對(參數(shù)1)控件來說 --scaleX按照x軸縮放--可以通過
// 控件.set看一下都有哪些方法--也就是有什么參數(shù)
// 參數(shù)3:可變參數(shù)--數(shù)組
//設(shè)置動畫執(zhí)行時間
objectAnimator.setDuration(2000);
//開始執(zhí)行動畫
objectAnimator.start();

位移動畫

//獲取ObjectAnimator對象
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv,
        "translationX", 20, 30, 40, 100, -150);
// 參數(shù)1:target 目標:產(chǎn)生的動畫效果 誰來執(zhí)行
// 參數(shù)2:屬性名字 字符串類型--針對(參數(shù)1)控件來說 --translationX按照x軸移動--可以通過
// 控件.set看一下都有哪些方法--也就是有什么參數(shù)
// 參數(shù)3:可變參數(shù)--數(shù)組
//設(shè)置動畫執(zhí)行時間
objectAnimator.setDuration(2000);
//開始執(zhí)行動畫
objectAnimator.start();

動畫合集

AnimatorSet 是Animator的子類,用來組合多個animator愿题。

        AnimatorSet set = new AnimatorSet();
        ObjectAnimator aa = ObjectAnimator.ofFloat(iv, "alpha", 1.0f, 0.5f,
                0.0f, 0.2f, 0.7f, 1.0f);
        ObjectAnimator ra = ObjectAnimator.ofFloat(iv, "rotationX", 0, 90, 180,
                360);
        ObjectAnimator sa = ObjectAnimator.ofFloat(iv, "scaleX", 1.0f, 2.0f,
                3.0f);
        ObjectAnimator ta = ObjectAnimator.ofFloat(iv, "translationX", 20, 30,
                40, 100, -150);
        //四個動畫一起執(zhí)行
        // set.playTogether(aa,ra,sa,ta);
        //四個動畫順序執(zhí)行
        set.playSequentially(aa, ra, sa, ta);
        //設(shè)置iv來執(zhí)行動畫
        set.setTarget(iv);
        //設(shè)置執(zhí)行時間
        set.setDuration(2000);
        //開始執(zhí)行
        set.start();

標準寫法

        //屬性動畫的標準寫法:
        //ViewCompat.animate(tv1).translationZBy(100).setDuration(3000).start();
        //帶by每次都會執(zhí)行--不帶by只執(zhí)行一次
        ViewCompat.animate(tv1)
                .translationZBy(100)
                //.rotationBy(720)
                //旋轉(zhuǎn)
                .rotationYBy(720)//繞著y軸旋轉(zhuǎn)
                //縮放
                .scaleXBy(0.3f)
                .scaleYBy(0.3f)//每次放大0.3
                //移動
                .translationYBy(20)
                //.alphaBy()透明
                //靈動的感覺
                //OvershootInterpolator超過后再回來
                //.setInterpolator(new OvershootInterpolator())
                //BounceInterpolator--彈簧的感覺
                .setInterpolator(new BounceInterpolator())
                .setDuration(3000).start();

http://www.reibang.com/p/2412d00a0ce4

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末杆兵,一起剝皮案震驚了整個濱河市仔夺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌日裙,老刑警劉巖惰蜜,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異格侯,居然都是意外死亡财著,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驮履,“玉大人,你說我怎么就攤上這事玫镐。” “怎么了杜跷?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵矫夷,是天一觀的道長双藕。 經(jīng)常有香客問我,道長忧陪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任延蟹,我火速辦了婚禮叶堆,結(jié)果婚禮上蹂空,老公的妹妹穿的比我還像新娘。我一直安慰自己上枕,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布棋恼。 她就那樣靜靜地躺著锈玉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪师崎。 梳的紋絲不亂的頭發(fā)上椅棺,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音床估,去河邊找鬼。 笑死谈况,一個胖子當著我的面吹牛递胧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播谓着,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼赊锚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了耸袜?” 一聲冷哼從身側(cè)響起牲平,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜈抓,沒想到半個月后昂儒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡腊嗡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年燕少,在試婚紗的時候發(fā)現(xiàn)自己被綠了蒿囤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡底挫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凄敢,到底是詐尸還是另有隱情湿痢,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布拒逮,位于F島的核電站臀规,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏玩徊。R本人自食惡果不足惜谨究,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望畔塔。 院中可真熱鬧鸯屿,春花似錦、人聲如沸谅辣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽联逻。三九已至检痰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铅歼,已是汗流浹背换可。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工沾鳄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留确憨,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓吞歼,卻偏偏與公主長得像塔猾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子丈甸,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

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