Android動(dòng)畫系列——屬性動(dòng)畫

屬性動(dòng)畫(Animator)是在API11(Android3.0)新加入的容诬。主要是針對(duì)一個(gè)對(duì)象的屬性變化加入動(dòng)畫效果。屬性動(dòng)畫的默認(rèn)時(shí)長(zhǎng)是300ms屹堰,默認(rèn)幀率是10ms/幀。其可以達(dá)到的效果就是街氢,在一定的時(shí)長(zhǎng)內(nèi)扯键,對(duì)象的某個(gè)屬性值連續(xù)發(fā)生變化。因此珊肃,屬性動(dòng)畫幾乎無(wú)所不能荣刑。只要對(duì)象有這個(gè)屬性(主要是有這個(gè)屬性的setter方法),它都能實(shí)現(xiàn)動(dòng)畫效果伦乔。但屬性動(dòng)畫是Android3.0以后才加入的厉亏,這就限制了屬性動(dòng)畫在API 11之前的系統(tǒng)上使用。不過烈和,使用開源動(dòng)畫庫(kù)nineoldandroids叶堆,可以在API 11之前的系統(tǒng)上使用屬性動(dòng)畫。
簡(jiǎn)單提一下斥杜,nineoldandroids開源動(dòng)畫庫(kù)虱颗,它的功能和android.animation.*中的類的功能完全一樣,使用方式也完全一致蔗喂。實(shí)現(xiàn)屬性動(dòng)畫比較常用的類有:ValueAnimator忘渔,ObjectAnimator,AnimatorSet缰儿。其中ObjectAnimator是ValueAnimator的子類畦粮,一個(gè)ObjectAnimator對(duì)象可以作用于同一個(gè)對(duì)象(如View)的一個(gè)或多個(gè)屬性。AnimatorSet是一組Animator的集合乖阵,主要用于以不同的順序控制多個(gè)屬性動(dòng)畫Animator的執(zhí)行宣赔。
下面是幾種屬性動(dòng)畫的簡(jiǎn)單實(shí)現(xiàn)方式:

//方式一
intentBtn.animate().translationXBy(800);
//方式二
ObjectAnimator.ofInt(intentBtn,"translationX",0,800).start();
//方式三
animate(intentBtn).setDuration(1000).rotationYBy(720).x(100).y(100);

AnimatorSet的簡(jiǎn)單用法:


AnimatorSet set = new AnimatorSet();
set.playTogether(
    ObjectAnimator.ofFloat(myView, "rotationX", 0, 360),
    ObjectAnimator.ofFloat(myView, "rotationY", 0, 180),
    ObjectAnimator.ofFloat(myView, "rotation", 0, -90),
    ObjectAnimator.ofFloat(myView, "translationX", 0, 90),
    ObjectAnimator.ofFloat(myView, "translationY", 0, 90),
    ObjectAnimator.ofFloat(myView, "scaleX", 1, 1.5f),
    ObjectAnimator.ofFloat(myView, "scaleY", 1, 0.5f),
    ObjectAnimator.ofFloat(myView, "alpha", 1, 0.25f, 1)
);
set.setDuration(5 * 1000).start();

ValueAnimator的用法

ValueAnimator valueAnimator = ValueAnimator.ofInt(1,100);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            IntEvaluator evaluator = new IntEvaluator();
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
              int currentCount = (int)animation.getAnimatedValue();
              float fraction = currentCount/100f;
              intentBtn.getLayoutParams().width = evaluator.evaluate(fraction,300,800);
              intentBtn.requestLayout();
             }
          });
          valueAnimator.setDuration(5000).start();

屬性動(dòng)畫的原理

屬性動(dòng)畫要求動(dòng)畫作用的對(duì)象能提供該屬性的get和set方法,屬性動(dòng)畫根據(jù)你設(shè)置的屬性的初始值和結(jié)束值瞪浸,以動(dòng)畫的效果多次調(diào)用該屬性的set方法儒将,每次傳遞給set方法的值都不一樣,確切地說(shuō)是对蒲,隨著時(shí)間的推移钩蚊,所傳遞的值越來(lái)越接近結(jié)束值。所以蹈矮,你對(duì)一個(gè)對(duì)象(如View)的屬性xxx做動(dòng)畫砰逻,如果想讓動(dòng)畫生效,要同時(shí)滿足兩個(gè)條件:

  • 對(duì)象必須提供setXxx方法泛鸟,如果動(dòng)畫初始化時(shí)沒有設(shè)置起始值蝠咆,還需要提供getXxx方法,因?yàn)橄到y(tǒng)要去拿到xxx屬性的初始值北滥。(如果條件不滿足刚操,會(huì)導(dǎo)致crash)
  • 對(duì)象的setXxx方法對(duì)屬性xxx的改變必須通過某種方式體現(xiàn)出來(lái)闸翅,比如會(huì)帶來(lái)UI的改變之類的,既然是動(dòng)畫赡茸,肯定是要有直觀的視覺變化(如果這條不滿足,動(dòng)畫效果提現(xiàn)不出來(lái)但不會(huì)crash)

如果對(duì)象沒有屬性的setter方法或者setter方法不能帶來(lái)UI上的改變祝闻,就需要其他的方法占卧。google告訴我們?nèi)N方法:

  1. 如果對(duì)象沒有setter和getter方法,就自己設(shè)置setter和getter方法联喘,前提是你有權(quán)限华蜒。
  2. 一個(gè)類來(lái)包裝原始對(duì)象,間接為其提供getter和settter方法豁遭。
  3. 采用ValueAnimator叭喜,監(jiān)聽動(dòng)畫過程,自己實(shí)現(xiàn)屬性的改變蓖谢。

以上的第一點(diǎn)很顯而易見捂蕴,第三點(diǎn)在上面ValueAnimator的用法中已經(jīng)講到。著重講講第二點(diǎn)闪幽。以FrameLayout的marginTop屬性為例啥辨。首先我們應(yīng)該知道m(xù)arginTop屬性對(duì)應(yīng)xml里面的android:layout_marginTop屬性,也就是說(shuō)它是FrameLayout控件的LayoutParams中的屬性LayoutParams.topMargin盯腌,F(xiàn)rameLayout類中并沒有setMarginTop方法溉知,根據(jù)上面說(shuō)的第二種方法,我們可以這樣實(shí)現(xiàn):
首先腕够,定義一個(gè)ViewWrapper類

class ViewWrapper{
        View target;
        public ViewWrapper(View view){
            this.target = view;
        }
        public int getMarginTop(){
            return ((FrameLayout.LayoutParams)target.getLayoutParams()).topMargin;
        }
        public void setMarginTop(int marginTop){
            FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) target.getLayoutParams();
            lp.topMargin = marginTop;
            target.setLayoutParams(lp);
            //注意此處只設(shè)置setLayoutParams并不能帶來(lái)UI上的改變级乍,必須在最后調(diào)用requestLayout
            //這就是屬性動(dòng)畫原理中說(shuō)到的第二個(gè)條件
            target.requestLayout();
        }
    }

然后,將這個(gè)包裝對(duì)象作為ObjectAnimator的作用對(duì)象

//此處的this帚湘,是一個(gè)自定義的FrameLayout子類
viewWrapper = new ViewWrapper(this);
ObjectAnimator animator = ObjectAnimator.ofInt(viewWrapper,"marginTop",-100);
animator.setDuration(1000);
animator.start();

以上就是針對(duì)對(duì)象屬性沒有setter方法玫荣,實(shí)現(xiàn)屬性動(dòng)畫的一種方法。

ViewPropertyAnimator

ViewPropertyAnimator的功能和ObjectAnimator一樣大诸,sdk給出的說(shuō)明是崇决,如果只是對(duì)view的一兩個(gè)屬性設(shè)置屬性動(dòng)畫,就直接用ObjectAnimator就好底挫;而如果是對(duì)一個(gè)view對(duì)象的多個(gè)屬性設(shè)置動(dòng)畫同時(shí)開啟恒傻,那么官方推薦用ViewPropertyAnimator,因?yàn)樗鼤?huì)對(duì)這些屬性動(dòng)畫進(jìn)行自動(dòng)優(yōu)化。同時(shí)茵乱,使用ViewPropertyAnimator設(shè)置屬性動(dòng)畫也是一種更方便的方式私植,它的API看起來(lái)更直觀艘蹋。

intentBtn.animate().translationXBy(800).scaleX(1.5f).alpha(0.8f);

animate()方法會(huì)創(chuàng)建并返回一個(gè)ViewPropertyAnimator對(duì)象沸手,這就是ViewPropertyAnimator的簡(jiǎn)單用法外遇。以下圖表列出的是ViewPropertyAnimator的一些API和與之對(duì)應(yīng)的View動(dòng)畫的相關(guān)的API的簡(jiǎn)單說(shuō)明


image.png
PropertyValuesHolder

PropertyValuesHolder的用途,最簡(jiǎn)單的就是契吉,在一個(gè)ObjectAnimator對(duì)象中跳仿,設(shè)置多個(gè)屬性動(dòng)畫。我們從PropertyValuesHolder的實(shí)例化函數(shù)可以看出來(lái)捐晶,它和對(duì)應(yīng)ObjectAnimator中對(duì)應(yīng)的同名函數(shù)菲语,唯一的區(qū)別就是少了一個(gè)參數(shù),也就是屬性動(dòng)畫的對(duì)象惑灵。

public static PropertyValuesHolder ofFloat(String propertyName, float... values)  
public static PropertyValuesHolder ofInt(String propertyName, int... values)   
public static PropertyValuesHolder ofObject(String propertyName, TypeEvaluator evaluator,Object... values)  

同時(shí)我們也可以看到山上,ObjectAnimator類有一個(gè)實(shí)例化的方法是ofPropertyValuesHolder,可以傳一個(gè)或多個(gè)PropertyValuesHolder對(duì)象作為參數(shù)

public static ObjectAnimator ofPropertyValuesHolder(Object target,PropertyValuesHolder... values)  

所以,PropertyValuesHolder和ObjectAnimator組合起來(lái)的用法就像這樣

PropertyValuesHolder rotationHolder = PropertyValuesHolder.ofFloat("Rotation", 60f, -60f, 40f, -40f, -20f, 20f, 10f, -10f, 0f);  
PropertyValuesHolder colorHolder = PropertyValuesHolder.ofInt("BackgroundColor", 0xffffffff, 0xffff00ff, 0xffffff00, 0xffffffff);  
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(mTextView, rotationHolder, colorHolder);  
animator.setDuration(3000);  
animator.setInterpolator(new AccelerateInterpolator());  
animator.start();  

給一個(gè)ObjectAnimator設(shè)置了兩個(gè)屬性動(dòng)畫

KeyFrame

KeyFrame就是關(guān)鍵幀英支,從電影動(dòng)畫的原理上來(lái)說(shuō)佩憾,關(guān)鍵幀就是整個(gè)動(dòng)畫過程中,某個(gè)特定時(shí)刻的畫面圖像干花。那么妄帘,將這個(gè)理解放到屬性動(dòng)畫這里,關(guān)鍵幀就是某個(gè)特定階段點(diǎn)的屬性值池凄。這里說(shuō)的階段點(diǎn)寄摆,是指動(dòng)畫完成的進(jìn)度點(diǎn)。先來(lái)看看它的實(shí)例化函數(shù)

public static Keyframe ofFloat(float fraction, float value) 

其中第一個(gè)參數(shù)fraction修赞,就是進(jìn)度或者說(shuō)比例婶恼,簡(jiǎn)單的理解就是動(dòng)畫進(jìn)行到多少進(jìn)度時(shí),對(duì)應(yīng)的屬性值是多少柏副。
KeyFrame的簡(jiǎn)單用法如下

Keyframe frame0 = Keyframe.ofFloat(0f, 0);  
Keyframe frame1 = Keyframe.ofFloat(0.1f, -20f);  
Keyframe frame2 = Keyframe.ofFloat(1, 0);  
PropertyValuesHolder frameHolder = PropertyValuesHolder.ofKeyframe("rotation",frame0,frame1,frame2);  
 Animator animator = ObjectAnimator.ofPropertyValuesHolder(mImage,frameHolder);  
animator.setDuration(1000);  
animator.start(); 

需要說(shuō)明的是勾邦,給PropertyValuesHolder設(shè)置KeyFrame對(duì)象不能少于兩個(gè),只有一個(gè)KeyFrame形成不了動(dòng)畫割择。默認(rèn)情況下眷篇,如代碼中的frame0到frame1這段動(dòng)畫中,屬性值的變化是勻速的荔泳,frame1到frame2這段動(dòng)畫中蕉饼,屬性值的變化也是勻速的。但是這兩個(gè)速率是不相等的玛歌,明顯前一段的速率要大一些昧港,后一段的速率要小一些。

下面的小例子支子,演示了屬性動(dòng)畫為ViewGroup的子View的顯示和隱藏設(shè)置過渡動(dòng)畫:

llImageView = (LinearLayout) root.findViewById(R.id.ll_image);

LayoutTransition transition = new LayoutTransition();

transition.setStagger(LayoutTransition.CHANGE_APPEARING, 30);
transition.setDuration(LayoutTransition.CHANGE_APPEARING, transition.getDuration(LayoutTransition.CHANGE_APPEARING));
transition.setStartDelay(LayoutTransition.CHANGE_APPEARING, 0);

ObjectAnimator appearingAnimator = ObjectAnimator
        .ofPropertyValuesHolder(
                (Object) null,
                PropertyValuesHolder.ofFloat("scaleX", 0.0f, 1.0f),
                PropertyValuesHolder.ofFloat("scaleY", 0.0f, 1.0f),
                PropertyValuesHolder.ofFloat("alpha", 0, 1.0f));
transition.setAnimator(LayoutTransition.APPEARING, appearingAnimator);
transition.setDuration(LayoutTransition.APPEARING, transition.getDuration(LayoutTransition.APPEARING));
transition.setStartDelay(LayoutTransition.APPEARING, transition.getDuration(LayoutTransition.CHANGE_APPEARING));

ObjectAnimator disappearingAnimator = ObjectAnimator
        .ofPropertyValuesHolder(
                (Object) null,
                PropertyValuesHolder.ofFloat("scaleX", 1.0f, 0.0f),
                PropertyValuesHolder.ofFloat("scaleY", 1.0f, 0.0f),
                PropertyValuesHolder.ofFloat("alpha", 1.0f, 0));
transition.setAnimator(LayoutTransition.DISAPPEARING, disappearingAnimator);
transition.setDuration(LayoutTransition.DISAPPEARING, transition.getDuration(LayoutTransition.DISAPPEARING));
transition.setStartDelay(LayoutTransition.DISAPPEARING, 0);

transition.setStagger(LayoutTransition.CHANGE_DISAPPEARING, 30);
transition.setDuration(LayoutTransition.CHANGE_DISAPPEARING, transition.getDuration(LayoutTransition.CHANGE_DISAPPEARING));
transition.setStartDelay(LayoutTransition.CHANGE_DISAPPEARING, transition.getDuration(LayoutTransition.DISAPPEARING));

llImageView.setLayoutTransition(transition);

順帶解釋下過渡動(dòng)畫的四種類型CHANGE_APPEARING创肥、APPEARING、DISAPPEARING和CHANGE_DISAPPEARING

APPEARING
當(dāng)通過 設(shè)置子View的可見性為VISIBLE或者通過addView方法添加子View 來(lái)顯示子View時(shí),
子View就會(huì)執(zhí)行該類型的動(dòng)畫叹侄。
該類型動(dòng)畫的周期為300毫秒巩搏,默認(rèn)延遲為300毫秒。
DISAPPEARING
當(dāng)通過 設(shè)置子View的可見性為GONE或者通過removeView方法移除子View 來(lái)隱藏子View時(shí)趾代,
子View就會(huì)執(zhí)行該類型的動(dòng)畫贯底。
該類型動(dòng)畫的周期為300毫秒,默認(rèn)延遲為0毫秒撒强。
CHANGE_APPEARING
當(dāng)顯示子View時(shí)禽捆,所有的兄弟View就會(huì)立即依次執(zhí)行該類型動(dòng)畫并且兄弟View之間執(zhí)行動(dòng)畫的間隙默認(rèn)為0毫秒,然后才會(huì)執(zhí)行顯示子View的動(dòng)畫尿褪。
該類型動(dòng)畫的周期為300毫秒睦擂,默認(rèn)延遲為0毫秒得湘。
CHANGE_DISAPPEARING
當(dāng)隱藏子View的動(dòng)畫執(zhí)行完畢后杖玲,所有的兄弟View就會(huì)依次執(zhí)行該類型動(dòng)畫并且兄弟View之間執(zhí)行動(dòng)畫的間隙默認(rèn)為0毫秒。
該類型動(dòng)畫的周期為300毫秒淘正,默認(rèn)延遲為300毫秒摆马。

設(shè)置監(jiān)聽器

給屬性動(dòng)畫設(shè)置監(jiān)聽器,ViewPropertyAnimator和ObjectAnimator略微不一樣鸿吆;ViewPropertyAnimator用的是setListner和setUpdateListner方法囤采,可以設(shè)置一個(gè)監(jiān)聽器,移除監(jiān)聽器時(shí)惩淳,通過setListner(null)和setUpdateListner(null)蕉毯,來(lái)移除;而ObjetcAnimator用的是addListner和addUpdateListner方法思犁,可以添加一個(gè)或多個(gè)監(jiān)聽器代虾,移除監(jiān)聽器則是通過removeListner(listner)和removeUpdateListner(listner)來(lái)移除指定的監(jiān)聽器對(duì)象。
由于ObjectAnimator支持用pause()方法暫停動(dòng)畫激蹲,所以多了一對(duì)addPauseListner和removePauseListner方法的支持棉磨;而ViewPropertyAnimator獨(dú)有的withStartAction(action)和withEndAction(action),可以為其設(shè)置一次性的針對(duì)動(dòng)畫開始和結(jié)束的處理学辱。

ViewPropertyAnimator.setListener() / ObjectAnimator.addListener()

它們的參數(shù)類型都是Animator.AnimatorListener乘瓤,有4個(gè)回調(diào)方法:

@Override
public void onAnimationStart(Animator animation) {}
@Override
public void onAnimationEnd(Animator animation) {}
@Override
public void onAnimationCancel(Animator animation) {}
@Override
public void onAnimationRepeat(Animator animation) {}

其中值得注意的是:就算動(dòng)畫未執(zhí)行完被取消,onAnimationEnd()也會(huì)被回調(diào)策泣。也就是說(shuō)動(dòng)畫被取消時(shí)衙傀,會(huì)先回調(diào)onAnimationCancel(),再回調(diào)onAnimationEnd()萨咕。
由于ViewPropertyAnimator不支持重復(fù)執(zhí)行差油,所以ViewPropertyAnimator的監(jiān)聽器中的onAnimatorRepeat()方法相當(dāng)于無(wú)效。

ViewPropertyAnimator.setUpdateListener() / ObjectAnimator.addUpdateListener()

它們的參數(shù)類型都是Animator.AnimatorUpdateListener⌒罾回調(diào)方法只有一個(gè)

@Override
public void onAnimationUpdate(ValueAnimator animation) {}

當(dāng)動(dòng)畫的屬性更新時(shí)(不嚴(yán)謹(jǐn)?shù)恼f(shuō)发侵,即每過 10 毫秒,動(dòng)畫的完成度更新時(shí))妆偏,這個(gè)方法被調(diào)用刃鳄。
方法的參數(shù)是一個(gè) ValueAnimator,ValueAnimator 是 ObjectAnimator 的父類钱骂,也是 ViewPropertyAnimator 的內(nèi)部實(shí)現(xiàn)叔锐,所以這個(gè)參數(shù)其實(shí)就是 ViewPropertyAnimator 內(nèi)部的那個(gè) ValueAnimator,或者對(duì)于 ObjectAnimator 來(lái)說(shuō)就是它自己本身见秽。

ObjectAnimator.addPauseListener()

參數(shù)類型是Animator.AnimatorPauseListener愉烙,有兩個(gè)回調(diào)方法

@Override
public void onAnimationPause(Animator animation) {}
@Override
public void onAnimationResume(Animator animation) {}
ViewPropertyAnimator.withStartAction/EndAction()

這兩個(gè)方法是 ViewPropertyAnimator 的獨(dú)有方法。它們和 set/addListener() 中回調(diào)的 onAnimationStart() / onAnimationEnd() 相比起來(lái)的不同主要有兩點(diǎn):

withStartAction() / withEndAction() 是一次性的(只會(huì)執(zhí)行一次)解取,在動(dòng)畫執(zhí)行結(jié)束后就自動(dòng)棄掉了步责,就算之后再重用 ViewPropertyAnimator 來(lái)做別的動(dòng)畫,用它們?cè)O(shè)置的回調(diào)也不會(huì)再被調(diào)用禀苦。而 set/addListener() 所設(shè)置的 AnimatorListener 是持續(xù)有效的蔓肯,當(dāng)動(dòng)畫重復(fù)執(zhí)行時(shí),回調(diào)總會(huì)被調(diào)用振乏。

withEndAction() 設(shè)置的回調(diào)只有在動(dòng)畫正常結(jié)束時(shí)才會(huì)被調(diào)用蔗包,而在動(dòng)畫被取消時(shí)不會(huì)被執(zhí)行。這點(diǎn)和 AnimatorListener.onAnimationEnd() 的行為是不一致的慧邮。

本文參考:
https://blog.csdn.net/singwhatiwanna/article/details/17841165
http://www.reibang.com/p/b117c974deaf
https://juejin.im/post/5b5ac6eef265da0f6f1aad86
https://hencoder.com/ui-1-6/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末调限,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子误澳,更是在濱河造成了極大的恐慌耻矮,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脓匿,死亡現(xiàn)場(chǎng)離奇詭異淘钟,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)陪毡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門米母,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人毡琉,你說(shuō)我怎么就攤上這事铁瞒。” “怎么了桅滋?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵慧耍,是天一觀的道長(zhǎng)身辨。 經(jīng)常有香客問我,道長(zhǎng)芍碧,這世上最難降的妖魔是什么煌珊? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮泌豆,結(jié)果婚禮上定庵,老公的妹妹穿的比我還像新娘。我一直安慰自己踪危,他們只是感情好蔬浙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贞远,像睡著了一般畴博。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓝仲,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天俱病,我揣著相機(jī)與錄音,去河邊找鬼杂曲。 笑死庶艾,一個(gè)胖子當(dāng)著我的面吹牛袁余,可吹牛的內(nèi)容都是我干的擎勘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼颖榜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼棚饵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起掩完,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤噪漾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后且蓬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欣硼,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年恶阴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诈胜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冯事,死狀恐怖焦匈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昵仅,我是刑警寧澤缓熟,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響够滑,放射性物質(zhì)發(fā)生泄漏垦写。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一彰触、第九天 我趴在偏房一處隱蔽的房頂上張望梯澜。 院中可真熱鬧,春花似錦渴析、人聲如沸晚伙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)咆疗。三九已至,卻和暖如春母债,著一層夾襖步出監(jiān)牢的瞬間午磁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工毡们, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迅皇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓衙熔,卻偏偏與公主長(zhǎng)得像登颓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子红氯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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

  • 【Android 動(dòng)畫】 動(dòng)畫分類補(bǔ)間動(dòng)畫(Tween動(dòng)畫)幀動(dòng)畫(Frame 動(dòng)畫)屬性動(dòng)畫(Property ...
    Rtia閱讀 6,164評(píng)論 1 38
  • 1 背景 不能只分析源碼呀框咙,分析的同時(shí)也要整理歸納基礎(chǔ)知識(shí),剛好有人微博私信讓全面說(shuō)說(shuō)Android的動(dòng)畫痢甘,所以今...
    未聞椛洺閱讀 2,711評(píng)論 0 10
  • 屬性動(dòng)畫 屬性動(dòng)畫出現(xiàn)的原因 屬性動(dòng)畫(Property Animation)是在 Android 3.0(API...
    luoqiang108閱讀 1,151評(píng)論 0 1
  • 動(dòng)畫基礎(chǔ)概念 動(dòng)畫分類 Android 中動(dòng)畫分為兩種喇嘱,一種是 Tween 動(dòng)畫、還有一種是 Frame 動(dòng)畫塞栅。 ...
    Rtia閱讀 1,231評(píng)論 0 6
  • 臥聽海濤頌者铜,漁燈三五更。 裙裾祺福舞放椰,篝火徹天明作烟。 月下無(wú)花趣,興闌有酒酲庄敛。 子陵垂釣志俗壹,狂浪寄浮生。
    月圓天心閱讀 185評(píng)論 0 2