屬性動畫一 基本使用

一 為什么引入屬性動畫

  1. 補(bǔ)間動畫只有四種(移動宋舷、縮放鳖链、旋轉(zhuǎn)和淡入淡出)

補(bǔ)間動畫還有一個缺陷呢袱,就是它只能夠?qū)崿F(xiàn)移動官扣、縮放、旋轉(zhuǎn)和淡入淡出這四種動畫操作羞福,那如果我們希望可以對View的背景色進(jìn)行動態(tài)地改變呢惕蹄?很遺憾,我們只能靠自己去實現(xiàn)了治专。說白了卖陵,之前的補(bǔ)間動畫機(jī)制就是使用硬編碼的方式來完成的,功能限定死就是這些张峰,基本上沒有任何擴(kuò)展性可言泪蔫。

  1. 補(bǔ)間動畫只能作用于view,不能作用于canvas畫出的圖形

  2. 補(bǔ)間動畫有個致命的缺陷:它只是改變了View的顯示效果而已喘批,而不會真正去改變View的屬性

比如說撩荣,現(xiàn)在屏幕的左上角有一個按鈕铣揉,然后我們通過補(bǔ)間動畫將它移動到了屏幕的右下角,現(xiàn)在你可以去嘗試點擊一下這個按鈕餐曹,點擊事件是絕對不會觸發(fā)的逛拱,因為實際上這個按鈕還是停留在屏幕的左上角,只不過補(bǔ)間動畫將這個按鈕繪制到了屏幕的右下角而已台猴。

二 屬性動畫基本使用

新引入的屬性動畫機(jī)制已經(jīng)不再是針對于View來設(shè)計的了朽合,也不限定于只能實現(xiàn)移動、縮放饱狂、旋轉(zhuǎn)和淡入淡出這幾種動畫操作曹步,同時也不再只是一種視覺上的動畫效果了。它實際上是一種不斷地對值進(jìn)行操作的機(jī)制休讳,并將值賦值到指定對象的指定屬性上箭窜,可以是任意對象的任意屬性。所以我們?nèi)匀豢梢詫⒁粋€View進(jìn)行移動或者縮放衍腥,但同時也可以對自定義View中的Point對象進(jìn)行動畫操作了磺樱。我們只需要告訴系統(tǒng)動畫的運行時長,需要執(zhí)行哪種類型的動畫婆咸,以及動畫的初始值和結(jié)束值竹捉,剩下的工作就可以全部交給系統(tǒng)去完成了。

1 ValueAnimator

ValueAnimator是整個屬性動畫機(jī)制當(dāng)中最核心的一個類尚骄,前面我們已經(jīng)提到了块差,屬性動畫的運行機(jī)制是通過不斷地對值進(jìn)行操作來實現(xiàn)的,而初始值和結(jié)束值之間的動畫過渡就是由ValueAnimator這個類來負(fù)責(zé)計算的倔丈。它的內(nèi)部使用一種時間循環(huán)的機(jī)制來計算值與值之間的動畫過渡憨闰,我們只需要將初始值和結(jié)束值提供給ValueAnimator,并且告訴它動畫所需運行的時長需五,那么ValueAnimator就會自動幫我們完成從初始值平滑地過渡到結(jié)束值這樣的效果鹉动。除此之外,ValueAnimator還負(fù)責(zé)管理動畫的播放次數(shù)宏邮、播放模式泽示、以及對動畫設(shè)置監(jiān)聽器等,確實是一個非常重要的類蜜氨。

基本使用

ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);  
anim.setDuration(300);  
anim.start();

監(jiān)聽value的改變

ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);  
anim.setDuration(300);  
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  
    @Override  
    public void onAnimationUpdate(ValueAnimator animation) {  
        float value = (float) animation.getAnimatedValue();//得到0f~100f當(dāng)中的這個時間點對應(yīng)的值
        float percent = (float) animation.getAnimatedFraction();// 動畫執(zhí)行的百分比 0~1
    }  
});  
anim.start();

常用方法

可以使用的偏移量
ValueAnimator.ofFloat(1f);//浮點數(shù)
ValueAnimator.ofArgb(Color.BLACK);//顏色偏移
ValueAnimator.ofInt(1);//整形
ValueAnimator.ofObject();//對象
ValueAnimator.ofPropertyValuesHolder();

setStartDelay()//方法來設(shè)置動畫延遲播放的時間械筛,
setRepeatCount()//設(shè)置動畫循環(huán)播放的次數(shù)
setRepeatMode()//循環(huán)播放的模式,循環(huán)模式包括RESTART和REVERSE兩種飒炎,分別表示重新播放和倒序播放的意思埋哟。
animator.setDuration(5000);  // 動畫播放時長

2 ObjectAnimator

相比于ValueAnimator,ObjectAnimator可能才是我們最常接觸到的類郎汪,因為ValueAnimator只不過是對值進(jìn)行了一個平滑的動畫過渡赤赊,但我們實際使用到這種功能的場景好像并不多闯狱。而ObjectAnimator則就不同了,它是可以直接對任意對象的任意屬性進(jìn)行動畫操作的砍鸠,比如說View的alpha屬性扩氢。

一個TextView在5秒中內(nèi)從常規(guī)變換成全透明耕驰,再從全透明變換成常規(guī)爷辱,就可以這樣寫:

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
animator.setDuration(5000);  
animator.start();

大概原理

//1.-------------屬性動畫基礎(chǔ)--------------------
iv.setTranslationX(100);
iv.setScaleX(scaleX);
iv.setAlpha(alpha);
iv.setRotation(rotation)
iv.setBackgroundColor(color);
        
//只要view里面有setXXX()方法就可以通過反射達(dá)到變化的目的
ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "translationX", 0f,200f);
//ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "backgroundColor", Color.RED,Color.BLUE);
oa.setDuration(500);
oa.start();

監(jiān)聽值變化用ValueAnimator

        //方法 2)---------------ValueAnimator---如果只需要監(jiān)聽值變化就用ValueAnimator---------------
        ValueAnimator animator = ValueAnimator.ofFloat(0f, 200f);
        animator.setDuration(200);
        animator.addUpdateListener(new AnimatorUpdateListener() {
            
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                float value = (float) animation.getAnimatedValue();//得到0f~100f當(dāng)中的這個時間點對應(yīng)的值
                iv.setScaleX(0.5f+value/200);
                iv.setScaleY(0.5f+value/200);
            }
        });
        animator.start();

PropertyValuesHolder

//  ObjectAnimator內(nèi)部使用了PropertyValuesHolder,所以這里傳入PropertyValuesHolder也ok
        PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("alpha", 1f, 0.5f);
        PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0.5f);
        PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0.5f);
        ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(iv, holder1, holder2, holder3);
        animator.setDuration(200);
        animator.start();

3 動畫組合

函數(shù)介紹

        animator.setRepeatCount(2);//重復(fù)兩次
        animator.setRepeatCount(ValueAnimator.INFINITE);//無限重復(fù)
        animator.setRepeatMode(ValueAnimator.RESTART);// 重新開始
        animator.setRepeatMode(ValueAnimator.REVERSE);
        animatorSet.play(animator3).with(animator2).after(animator1);//animator1在前面
        animatorSet.play(animator3).with(animator2).before(animator1);//animator1在后面
        animatorSet.playTogether(animator1, animator2, animator3);// 一起執(zhí)行
        animatorSet.playSequentially(animator1, animator2, animator3);// 一個個按順序來執(zhí)行

例子:



 //-------------動畫集合-----------------
        ImageView iv = new ImageView(this);
        ObjectAnimator animator1 = ObjectAnimator.ofFloat(iv, "translationX", 0f, 100f);
        animator1.setRepeatCount(3);
        ObjectAnimator animator2 = ObjectAnimator.ofFloat(iv, "alpha", 0f, 1f);
        animator2.setStartDelay(startDelay);//設(shè)置延遲執(zhí)行
        ObjectAnimator animator3 = ObjectAnimator.ofFloat(iv, "scaleX", 0f, 2f);
        AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.setDuration(500);
        animatorSet.play(animator3).with(animator2).after(animator1);//animator1在前面
        animatorSet.play(animator3).with(animator2).before(animator1);//animator1在后面
        animatorSet.playTogether(animator1, animator2, animator3);
        animatorSet.playSequentially(animator1, animator2, animator3);// 一個個按順序來執(zhí)行
        animatorSet.start();

4 動畫監(jiān)聽

常用監(jiān)聽函數(shù)

  1. 監(jiān)聽值變化
        final ObjectAnimator animator = ObjectAnimator.ofFloat(iv, "hehe", 0f, 100f);
        animator.setDuration(300);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                // 監(jiān)聽動畫回調(diào)
                animation.getAnimatedFraction();//動畫執(zhí)行的百分比 0~1 //API 12+
                float value = (float) animation.getAnimatedValue();//得到0f~100f當(dāng)中的這個時間點對應(yīng)的值
                iv.setScaleX(0.5f + value / 200);
                iv.setScaleY(0.5f + value / 200);
                iv.setTranslationX(value);
            }
        });
        animator.start();
  1. 監(jiān)聽動畫執(zhí)行
 animator.addListener(new Animator.AnimatorListener() {

            @Override
            public void onAnimationStart(Animator animation) {
            }

            @Override
            public void onAnimationRepeat(Animator animation) {
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                animator.setRepeatCount(ValueAnimator.RESTART);
            }

            @Override
            public void onAnimationCancel(Animator animation) {
            }
        });
  1. 監(jiān)聽動畫執(zhí)行可選部分監(jiān)聽
// 監(jiān)聽特定的函數(shù):AnimatorListenerAdapter是一個抽象函數(shù)朦肘,實現(xiàn)了Animator.AnimatorListener接口
        animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                // TODO Auto-generated method stub
                super.onAnimationEnd(animation);
            }
        });

5 插值器

Interpolator這個東西很難進(jìn)行翻譯饭弓,直譯過來的話是補(bǔ)間器的意思,它的主要作用是可以控制動畫的變化速率媒抠,比如去實現(xiàn)一種非線性運動的動畫效果弟断。那么什么叫做非線性運動的動畫效果呢?就是說動畫改變的速率不是一成不變的趴生,像加速運動以及減速運動都屬于非線性運動阀趴。

決定某個時間執(zhí)行哪段曲線

//6.---------插值器(加速器)Interpolater-----------
        ObjectAnimator oa = ObjectAnimator.ofFloat(iv, "translationY", 0f, 1000f);
        oa.setDuration(800);
        //oa.setInterpolator(new AccelerateInterpolator(1));// 加速
        //oa.setInterpolator(new AccelerateDecelerateInterpolator());// 先加速在減速
        oa.setInterpolator(new BounceInterpolator()); // 下落彈起
        //oa.setInterpolator(new AnticipateInterpolator());// 先上再下
        //oa.setInterpolator(new CycleInterpolator(5));
        oa.start();
小球落地插值器效果
幾種差值器說明.png

幾種差值器的曲線圖

先加速后減速效果

AccelerateDecelerateInterpolator 加速減速插值器

public class AccelerateDecelerateInterpolator extends BaseInterpolator
        implements NativeInterpolatorFactory {
    public AccelerateDecelerateInterpolator() {
    }
    public float getInterpolation(float input) {
        return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
    }
}

加速效果

AccelerateInterpolator 加速插值器

public class AccelerateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
    private final float mFactor;
    private final double mDoubleFactor;

    public AccelerateInterpolator() {
        mFactor = 1.0f;
        mDoubleFactor = 2.0;
    }

    public AccelerateInterpolator(float factor) {
        mFactor = factor;
        mDoubleFactor = 2 * mFactor;
    }

    public float getInterpolation(float input) {
        if (mFactor == 1.0f) {
            return input * input;
        } else {
            return (float)Math.pow(input, mDoubleFactor);
        }
    }

先回彈,再加速

AnticipateInterpolator 回蕩秋千插值器

先回彈苍匆,再加速刘急,減速,再回彈

AnticipateOvershootInterpolator

小球落地彈起效果

BounceInterpolator 彈跳插值器

正弦波

CycleInterpolator 正弦周期變化插值器

減速

DecelerateInterpolator 減速插值器

Android基于Facebook Rebound的動畫效果框架Backboard demo (非常炫酷)

6 xml中使用屬性動畫

  • (1) XML文件位置:res/animator/filename.xml
  • (2) 文件編譯后的類型:ValueAnimator, ObjectAnimator, AnimatorSet浸踩。
<set
// 執(zhí)行順序 同時 | 順序執(zhí)行
  android:ordering=["together" | "sequentially"]>

    <objectAnimator
      // 屬性名叔汁,alpha translateX scale 
        android:propertyName="string"
        android:duration="int"
        android:valueFrom="float | int | color"
        android:valueTo="float | int | color"
        android:startOffset="int"
        android:repeatCount="int"
        // 差值器:注意位置
        android:interpolator="@android:anim/decelerate_interpolator">
        // 模式 重復(fù),反轉(zhuǎn)重復(fù)
        android:repeatMode=["repeat" | "reverse"]
        // 值類型 ofFlaot  ofInt
        android:valueType=["intType" | "floatType"]/>

    <animator
        android:duration="int"
        android:valueFrom="float | int | color"
        android:valueTo="float | int | color"
        android:startOffset="int"
        android:repeatCount="int"
        android:repeatMode=["repeat" | "reverse"]
        android:valueType=["intType" | "floatType"]/>

    <set>
        ...
    </set>
</set>
  • (3) 引用資源的方式:
// AnimatorSet
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,
     R.anim.property_animator);
set.setTarget(myObject);
set.start();
// animator 
Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
animator.setTarget(view);  
animator.start();  

7 TypeEvaluator 估值器

那么TypeEvaluator的作用到底是什么呢检碗?簡單來說据块,就是告訴動畫系統(tǒng)如何從初始值過度到結(jié)束值。
如果是移動折剃,Evaluator能改變移動的軌跡

Evaluator和Interpolator的區(qū)別
Evaluator(估值器)作用:決定startValue到endValue的軌跡曲線
Interpolator(差值器)作用:決定某一時間執(zhí)行哪段曲線另假,決定每一曲線段的運動速率,重復(fù)某部分曲線段效果(小球彈起)

我們來看一下FloatEvaluator的代碼實現(xiàn):

public class FloatEvaluator implements TypeEvaluator {  
    public Object evaluate(float fraction, Object startValue, Object endValue) {  
        float startFloat = ((Number) startValue).floatValue();  
        return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);  
    }  
}  

FloatEvaluator 實現(xiàn)了TypeEvaluator 的evaluate方法怕犁, fraction表示執(zhí)行的百分比, startValue動畫開始值, endValue動畫結(jié)束值浪谴,

    //------------------案例:實現(xiàn)自由落體拋物線效果-----------------
    /**
     * x: 勻速
     * y: 加速度 y=vt=1/2*g*t*t
     * 估值器---控制坐標(biāo)PointF(x,y)
     */
        ValueAnimator valueAnimator = new ValueAnimator();
//      valueAnimator.setInterpolator(value)
        valueAnimator.setDuration(2000);
        valueAnimator.setObjectValues(new PointF(0, 0));
//      valueAnimator.setObjectValues(new PointF(0, 0),new PointF(10, 10));
        final PointF pointF = new PointF();
        //顏色估值器
//      setBackgroundColor((Integer) sArgbEvaluator.evaluate(ratio, mDiscrollveFromBgColor, mDiscrollveToBgColor));
        valueAnimator.setEvaluator(new TypeEvaluator<PointF>() {

            @Override
            public PointF evaluate(float fraction, PointF startValue,
                    PointF endValue) {
                // 估值計算方法---可以在執(zhí)行的過程當(dāng)中干預(yù)改變屬性的值---做效果:用自己的算法來控制
                //不斷地去計算修改坐標(biāo)
                //x勻速運動 x=v*t 為了看起來效果好我讓t變成fraction*5
                pointF.x = 100f*(fraction*5);
                //加速度 y=vt=1/2*g*t*t
//              pointF.y = 0.5f*9.8f*(fraction*5)*(fraction*5);
                pointF.y = 10f*0.5f*9.8f*(fraction*5)*(fraction*5);
                return pointF;
            }
        });
        valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
            
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                PointF f = (PointF) animation.getAnimatedValue();
                iv.setX(f.x);
                iv.setY(f.y);
            }
        });
        valueAnimator.start();

ofObject方法使用

1 創(chuàng)建point估值器,不斷返回坐標(biāo)變換值

public class PointEvaluator implements TypeEvaluator{  
  
    @Override  
    public Object evaluate(float fraction, Object startValue, Object endValue) {  
        PointF startPoint = (Point) startValue;  
        PointF endPoint = (Point) endValue;  
        float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());  
        float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());  
        PointF point = new Point(x, y);  
        return point;  
    }  
} 

2 通過ofObject使用剛剛創(chuàng)建的估值器因苹,從point1 到point2的移動

Point point1 = new Point(0, 0);  
Point point2 = new Point(300, 300);  
ValueAnimator anim = ValueAnimator.ofObject(new PointEvaluator(), point1, point2);  
anim.setDuration(5000);  
anim.start();  

動態(tài)改變View的顏色

--------------------------------------------------------------------------
public class MyAnimView extends View {  
  
    private String color;  
  
    public String getColor() {  
        return color;  
    }  
  
    public void setColor(String color) {  
        this.color = color;  
        mPaint.setColor(Color.parseColor(color));  
        invalidate();  
    }  
}
--------------------------------------------------------------------------
ObjectAnimator anim = ObjectAnimator.ofObject(myAnimView, "color", new ArgbEvaluator(),   
    "#0000FF", "#FF0000");  
anim.setDuration(5000);  
anim.start(); 

參考文檔
Android屬性動畫完全解析(上)苟耻,初識屬性動畫的基本用法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市扶檐,隨后出現(xiàn)的幾起案子凶杖,更是在濱河造成了極大的恐慌,老刑警劉巖款筑,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件智蝠,死亡現(xiàn)場離奇詭異腾么,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)杈湾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門解虱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漆撞,你說我怎么就攤上這事殴泰。” “怎么了浮驳?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵悍汛,是天一觀的道長。 經(jīng)常有香客問我至会,道長离咐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任奉件,我火速辦了婚禮宵蛀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘县貌。我一直安慰自己术陶,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布窃这。 她就那樣靜靜地躺著瞳别,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杭攻。 梳的紋絲不亂的頭發(fā)上祟敛,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音兆解,去河邊找鬼馆铁。 笑死,一個胖子當(dāng)著我的面吹牛锅睛,可吹牛的內(nèi)容都是我干的埠巨。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼现拒,長吁一口氣:“原來是場噩夢啊……” “哼辣垒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起印蔬,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤勋桶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體例驹,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡捐韩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鹃锈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荤胁。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖屎债,靈堂內(nèi)的尸體忽然破棺而出仅政,到底是詐尸還是另有隱情,我是刑警寧澤扔茅,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布已旧,位于F島的核電站秸苗,受9級特大地震影響召娜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惊楼,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一玖瘸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧檀咙,春花似錦雅倒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至棕诵,卻和暖如春裁良,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背校套。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工价脾, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人笛匙。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓侨把,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妹孙。 傳聞我的和親對象是個殘疾皇子秋柄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

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

  • 接下來的兩篇文章會介紹 屬性動畫 相關(guān)的知識,如下圖所示蠢正。本篇文章會介紹下圖中綠色相關(guān)的知識骇笔。 1. 簡介 相比視...
    lijiankun24閱讀 637評論 0 0
  • 寫的非常好,強(qiáng)烈推薦給大家 轉(zhuǎn)載請注明出處:http://blog.csdn.net/guolin_blog/ar...
    天天大保建閱讀 784評論 0 1
  • 1.介紹 Android系統(tǒng)為我們提供了三種動畫效果的實現(xiàn)方式: 補(bǔ)間動畫(Tween Animation):只能...
    容華謝后閱讀 2,923評論 3 22
  • 我常幻想自己是一個功夫了得的女英雄 不 女痞子 一定要看起來放蕩不羈自由散漫 還要配上帥氣男主標(biāo)配的犀利眼神和冷峻...
    SunNy_Monologue閱讀 229評論 0 0
  • 面對2017年的職業(yè)迷惑,比往年更深的就是讓自己覺得一無是處旭旭,極其悲觀的時候會覺得所有行業(yè)都不感興趣谎脯,都沒意思,眼...
    斯菲閱讀 265評論 0 1