www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀]1 背景不能只分析源碼呀,分析的同時也要整理歸納基礎(chǔ)知識,剛好有人微博私信讓全面說說Android的動畫,所以今天來一發(fā)Android應(yīng)用的各種Animation大集合。英文厲害的請直接移步參考And

1 背景

不能只分析源碼呀,分析的同時也要整理歸納基礎(chǔ)知識,剛好有人微博私信讓全面說說Android的動畫,所以今天來一發(fā)Android應(yīng)用的各種Animation大集合。英文厲害的請直接移步參考Android Developer。

Android系統(tǒng)提供了很多豐富的API去實(shí)現(xiàn)UI的2D與3D動畫,最主要的劃分可以分為如下幾類:

View Animation:?視圖動畫在古老的Android版本系統(tǒng)中就已經(jīng)提供了,只能被用來設(shè)置View的動畫。

Drawable Animation:?這種動畫(也叫Frame動畫、幀動畫)其實(shí)可以劃分到視圖動畫的類別,專門用來一個一個的顯示Drawable的resources,就像放幻燈片一樣。

Property Animation:?屬性動畫只對Android 3.0(API 11)以上版本的Android系統(tǒng)才有效,這種動畫可以設(shè)置給任何Object,包括那些還沒有渲染到屏幕上的對象。這種動畫是可擴(kuò)展的,可以讓你自定義任何類型和屬性的動畫。

可以看見,當(dāng)前應(yīng)用程序開發(fā)涉及的主要動畫也就這三大類,我們接下來以類別為基礎(chǔ)來慢慢展開說明。

2 View Animation(視圖動畫)使用詳解 2-1 視圖動畫概述

視圖動畫,也叫Tween(補(bǔ)間)動畫可以在一個視圖容器內(nèi)執(zhí)行一系列簡單變換(位置、大小、旋轉(zhuǎn)、透明度)。譬如,如果你有一個TextView對象,您可以移動、旋轉(zhuǎn)、縮放、透明度設(shè)置其文本,當(dāng)然,如果它有一個背景圖像,背景圖像會隨著文本變化。

補(bǔ)間動畫通過XML或Android代碼定義,建議使用XML文件定義,因?yàn)樗呖勺x性、可重用性。

如下是視圖動畫相關(guān)的類繼承關(guān)系:

AlphaAnimation?放置在res/anim/目錄下 漸變透明度動畫效果 RotateAnimation?放置在res/anim/目錄下 畫面轉(zhuǎn)移旋轉(zhuǎn)動畫效果 ScaleAnimation?放置在res/anim/目錄下 漸變尺寸伸縮動畫效果 TranslateAnimation?放置在res/anim/目錄下 畫面轉(zhuǎn)換位置移動動畫效果 AnimationSet?放置在res/anim/目錄下 一個持有其它動畫元素alpha、scale、translate、rotate或者其它set元素的容器

通過上圖和上表可以直觀的看出來補(bǔ)間動畫的關(guān)系及種類了吧,接下來我們就詳細(xì)一個一個的介紹一下各種補(bǔ)間動畫。

2-2 視圖動畫詳細(xì)說明

可以看出來Animation抽象類是所有補(bǔ)間動畫類的基類,所以基類會提供一些通用的動畫屬性方法,如下我們就來詳細(xì)看看這些屬性

2-2-1 Animation屬性詳解android:detachWallpaper setDetachWallpaper(boolean) 是否在壁紙上運(yùn)行 android:duration setDuration(long) 動畫持續(xù)時間,毫秒為單位 android:fillAfter setFillAfter(boolean) 控件動畫結(jié)束時是否保持動畫最后的狀態(tài) android:fillBefore setFillBefore(boolean) 控件動畫結(jié)束時是否還原到開始動畫前的狀態(tài) android:fillEnabled setFillEnabled(boolean) 與android:fillBefore效果相同 android:interpolator setInterpolator(Interpolator) 設(shè)定插值器(指定的動畫效果,譬如回彈等) android:repeatCount setRepeatCount(int) 重復(fù)次數(shù) android:repeatMode setRepeatMode(int) 重復(fù)類型有兩個值,reverse表示倒序回放,restart表示從頭播放 android:startOffset setStartOffset(long) 調(diào)用start函數(shù)之后等待開始運(yùn)行的時間,單位為毫秒 android:zAdjustment setZAdjustment(int) 表示被設(shè)置動畫的內(nèi)容運(yùn)行時在Z軸上的位置(top/bottom/normal),默認(rèn)為normal


也就是說,無論我們補(bǔ)間動畫的哪一種都已經(jīng)具備了這種屬性,也都可以設(shè)置使用這些屬性中的一個或多個。

那接下來我們就看看每種補(bǔ)間動畫特有的一些屬性說明吧。

2-2-2 Alpha屬性詳解android:fromAlpha AlphaAnimation(float fromAlpha, …) 動畫開始的透明度(0.0到1.0,0.0是全透明,1.0是不透明) android:toAlpha AlphaAnimation(…, float toAlpha) 動畫結(jié)束的透明度,同上 2-2-3 Rotate屬性詳解android:fromDegrees RotateAnimation(float fromDegrees, …) 旋轉(zhuǎn)開始角度,正代表順時針度數(shù),負(fù)代表逆時針度數(shù) android:toDegrees RotateAnimation(…, float toDegrees, …) 旋轉(zhuǎn)結(jié)束角度,正代表順時針度數(shù),負(fù)代表逆時針度數(shù) android:pivotX RotateAnimation(…, float pivotX, …) 縮放起點(diǎn)X坐標(biāo)(數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p,譬如50表示以當(dāng)前View左上角坐標(biāo)加50px為初始點(diǎn)、50%表示以當(dāng)前View的左上角加上當(dāng)前View寬高的50%做為初始點(diǎn)、50%p表示以當(dāng)前View的左上角加上父控件寬高的50%做為初始點(diǎn)) android:pivotY RotateAnimation(…, float pivotY) 縮放起點(diǎn)Y坐標(biāo),同上規(guī)律 2-2-4 Scale屬性詳解android:fromXScale ScaleAnimation(float fromX, …) 初始X軸縮放比例,1.0表示無變化 android:toXScale ScaleAnimation(…, float toX, …) 結(jié)束X軸縮放比例 android:fromYScale ScaleAnimation(…, float fromY, …) 初始Y軸縮放比例 android:toYScale ScaleAnimation(…, float toY, …) 結(jié)束Y軸縮放比例 android:pivotX ScaleAnimation(…, float pivotX, …) 縮放起點(diǎn)X軸坐標(biāo)(數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p,譬如50表示以當(dāng)前View左上角坐標(biāo)加50px為初始點(diǎn)、50%表示以當(dāng)前View的左上角加上當(dāng)前View寬高的50%做為初始點(diǎn)、50%p表示以當(dāng)前View的左上角加上父控件寬高的50%做為初始點(diǎn)) android:pivotY ScaleAnimation(…, float pivotY) 縮放起點(diǎn)Y軸坐標(biāo),同上規(guī)律 2-2-5 Translate屬性詳解android:fromXDelta TranslateAnimation(float fromXDelta, …) 起始點(diǎn)X軸坐標(biāo)(數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p,譬如50表示以當(dāng)前View左上角坐標(biāo)加50px為初始點(diǎn)、50%表示以當(dāng)前View的左上角加上當(dāng)前View寬高的50%做為初始點(diǎn)、50%p表示以當(dāng)前View的左上角加上父控件寬高的50%做為初始點(diǎn)) android:fromYDelta TranslateAnimation(…, float fromYDelta, …) 起始點(diǎn)Y軸從標(biāo),同上規(guī)律 android:toXDelta TranslateAnimation(…, float toXDelta, …) 結(jié)束點(diǎn)X軸坐標(biāo),同上規(guī)律 android:toYDelta TranslateAnimation(…, float toYDelta) 結(jié)束點(diǎn)Y軸坐標(biāo),同上規(guī)律 2-2-6 AnimationSet詳解

AnimationSet繼承自Animation,是上面四種的組合容器管理類,沒有自己特有的屬性,他的屬性繼承自Animation,所以特別注意,當(dāng)我們對set標(biāo)簽使用Animation的屬性時會對該標(biāo)簽下的所有子控件都產(chǎn)生影響。

2-3 視圖動畫使用方法

通過上面對于動畫的屬性介紹之后我們來看看在Android中這些動畫如何使用(PS:這里直接演示xml方式,至于java方式太簡單了就不說了),如下

上面就是一個標(biāo)準(zhǔn)的使用我們定義的補(bǔ)間動畫的模板。至于補(bǔ)間動畫的使用,Animation還有如下一些比較實(shí)用的方法介紹:

reset() 重置Animation的初始化 cancel() 取消Animation動畫 start() 開始Animation動畫 setAnimationListener(AnimationListener listener) 給當(dāng)前Animation設(shè)置動畫監(jiān)聽 hasStarted() 判斷當(dāng)前Animation是否開始 hasEnded() 判斷當(dāng)前Animation是否結(jié)束


既然補(bǔ)間動畫只能給View使用,那就來看看View中和動畫相關(guān)的幾個常用方法吧,如下:

...
ImageView?spaceshipImage?=?(ImageView)?findViewById(R.id.spaceshipImage);
Animation?hyperspaceJumpAnimation?=?AnimationUtils.loadAnimation(this,?R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);

startAnimation(Animation animation) 對當(dāng)前View開始設(shè)置的Animation動畫 clearAnimation() 取消當(dāng)View在執(zhí)行的Animation動畫

到此整個Android的補(bǔ)間動畫常用詳細(xì)屬性及方法全部介紹完畢,如有特殊的屬性需求可以訪問Android Developer查閱即可。如下我們就來個綜合大演練。

2-4 視圖動畫注意事項(xiàng)

關(guān)于視圖動畫(補(bǔ)間動畫)的例子我就不介紹了,網(wǎng)上簡直多的都泛濫了。只是強(qiáng)調(diào)在使用補(bǔ)間動畫時注意如下一點(diǎn)即可:

特別特別注意:補(bǔ)間動畫執(zhí)行之后并未改變View的真實(shí)布局屬性值。切記這一點(diǎn),譬如我們在Activity中有一個Button在屏幕上方,我們設(shè)置了平移動畫移動到屏幕下方然后保持動畫最后執(zhí)行狀態(tài)呆在屏幕下方,這時如果點(diǎn)擊屏幕下方動畫執(zhí)行之后的Button是沒有任何反應(yīng)的,而點(diǎn)擊原來屏幕上方?jīng)]有Button的地方卻響應(yīng)的是點(diǎn)擊Button的事件。

2-5 視圖動畫Interpolator插值器詳解 2-5-1 插值器簡介

介紹補(bǔ)間動畫插值器之前我們先來看一幅圖,如下:

可以看見其實(shí)各種插值器都是實(shí)現(xiàn)了Interpolator接口而已,同時可以看見系統(tǒng)提供了許多已經(jīng)實(shí)現(xiàn)OK的插值器,具體如下:

AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator 動畫始末速率較慢,中間加速 AccelerateInterpolator @android:anim/accelerate_interpolator 動畫開始速率較慢,之后慢慢加速 AnticipateInterpolator @android:anim/anticipate_interpolator 開始的時候從后向前甩 AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator 類似上面AnticipateInterpolator BounceInterpolator @android:anim/bounce_interpolator 動畫結(jié)束時彈起 CycleInterpolator @android:anim/cycle_interpolator 循環(huán)播放速率改變?yōu)檎仪€ DecelerateInterpolator @android:anim/decelerate_interpolator 動畫開始快然后慢 LinearInterpolator @android:anim/linear_interpolator 動畫勻速改變 OvershootInterpolator @android:anim/overshoot_interpolator 向前彈出一定值之后回到原來位置 PathInterpolator ? 新增,定義路徑坐標(biāo)后按照路徑坐標(biāo)來跑。

如上就是系統(tǒng)提供的一些插值器,下面我們來看看怎么使用他們。

2-5-2 插值器使用方法

插值器的使用比較簡單,如下:

...


2-5-3 插值器的自定義

有時候你會發(fā)現(xiàn)系統(tǒng)提供的插值器不夠用,可能就像View一樣需要自定義。所以接下來我們來看看插值器的自定義,關(guān)于插值器的自定義分為兩種實(shí)現(xiàn)方式,xml自定義實(shí)現(xiàn)(其實(shí)就是對現(xiàn)有的插值器的一些屬性修改)或者java代碼實(shí)現(xiàn)方式。如下我們來說說。

先看看XML自定義插值器的步驟:

在res/anim/目錄下創(chuàng)建filename.xml文件。修改你準(zhǔn)備自定義的插值器。


在你的補(bǔ)間動畫文件中引用該文件即可。

可以看見上面第二步修改的是現(xiàn)有插值器的一些屬性,但是有些插值器卻不具備修改屬性,具體如下:

無可自定義的attribute。

android:factor 浮點(diǎn)值,加速速率(默認(rèn)值為1)。

android:tension 浮點(diǎn)值,起始點(diǎn)后拉的張力數(shù)(默認(rèn)值為2)。

android:tension 浮點(diǎn)值,起始點(diǎn)后拉的張力數(shù)(默認(rèn)值為2)。?
android:extraTension 浮點(diǎn)值,拉力的倍數(shù)(默認(rèn)值為1.5)。

無可自定義的attribute。

android:cycles 整形,循環(huán)的個數(shù)(默認(rèn)為1)。

android:factor 浮點(diǎn)值,減速的速率(默認(rèn)為1)。

無可自定義的attribute。

android:tension 浮點(diǎn)值,超出終點(diǎn)后的張力(默認(rèn)為2)。

再來看看Java自定義插值器的(Java自定義插值器其實(shí)是xml自定義的升級,也就是說如果我們修改xml的屬性還不能滿足需求,那就可以選擇通過Java來實(shí)現(xiàn))方式。

可以看見上面所有的Interpolator都實(shí)現(xiàn)了Interpolator接口,而Interpolator接口又繼承自TimeInterpolator,TimeInterpolator接口定義了一個float getInterpolation(float input);方法,這個方法是由系統(tǒng)調(diào)用的,其中的參數(shù)input代表動畫的時間,在0和1之間,也就是開始和結(jié)束之間。

如下就是一個動畫始末速率較慢、中間加速的AccelerateDecelerateInterpolator插值器:

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


到此整個補(bǔ)間動畫與補(bǔ)間動畫的插值器都分析完畢了,接下來看下別的動畫。

【工匠若水?http://blog.csdn.net/yanbober?轉(zhuǎn)載請注明出處。點(diǎn)我開始Android技術(shù)交流】

3 Drawable Animation(Drawable動畫)使用詳解 3-1 Drawable動畫概述

Drawable動畫其實(shí)就是Frame動畫(幀動畫),它允許你實(shí)現(xiàn)像播放幻燈片一樣的效果,這種動畫的實(shí)質(zhì)其實(shí)是Drawable,所以這種動畫的XML定義方式文件一般放在res/drawable/目錄下。具體關(guān)于幀動畫的xml使用方式翻墻點(diǎn)擊我查看,java方式翻墻點(diǎn)擊我查看。

如下圖就是幀動畫的源碼文件:

可以看見實(shí)際的真實(shí)父類就是Drawable。

3-2 Drawable動畫詳細(xì)說明

我們依舊可以使用xml或者java方式實(shí)現(xiàn)幀動畫。但是依舊推薦使用xml,具體如下:

?必須是根節(jié)點(diǎn),包含一個或者多個元素,屬性有:

android:oneshot?true代表只執(zhí)行一次,false循環(huán)執(zhí)行。?類似一幀的動畫資源。

?animation-list的子項(xiàng),包含屬性如下:

android:drawable?一個frame的Drawable資源。android:duration?一個frame顯示多長時間。 3-3 Drawable動畫實(shí)例演示

關(guān)于幀動畫相對來說比較簡單,這里給出一個常規(guī)使用框架,如下:



ImageView?rocketImage?=?(ImageView)?findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);

rocketAnimation?=?(AnimationDrawable)?rocketImage.getBackground();
rocketAnimation.start();

特別注意,AnimationDrawable的start()方法不能在Activity的onCreate方法中調(diào)運(yùn),因?yàn)锳nimationDrawable還未完全附著到window上,所以最好的調(diào)運(yùn)時機(jī)是onWindowFocusChanged()方法中。

至此幀動畫也就說明完成了。讓我們接下來進(jìn)入Android更牛叉的動畫類型。

4 Property Animation(屬性動畫)使用詳解

在使用屬性動畫之前先來看幾個常用的View屬性成員:

translationX,translationY:控制View的位置,值是相對于View容器左上角坐標(biāo)的偏移。rotationX,rotationY:控制相對于軸心旋轉(zhuǎn)。x,y:控制View在容器中的位置,即左上角坐標(biāo)加上translationX和translationY的值。alpha:控制View對象的alpha透明度值。

這幾個常用的屬性相信大家都很熟悉,接下來的屬性動畫我們就從這里展開。

4-1 屬性動畫概述

Android 3.0以后引入了屬性動畫,屬性動畫可以輕而易舉的實(shí)現(xiàn)許多View動畫做不到的事,上面也看見了,View動畫無非也就做那幾種事情,別的也搞不定,而屬性動畫就可以的,譬如3D旋轉(zhuǎn)一張圖片。其實(shí)說白了,你記住一點(diǎn)就行,屬性動畫實(shí)現(xiàn)原理就是修改控件的屬性值實(shí)現(xiàn)的動畫。

具體先看下類關(guān)系:


/**
?*?This?is?the?superclass?for?classes?which?provide?basic?support?for?animations?which?can?be
?*?started,?ended,?and?have?AnimatorListeners?added?to?them.
?*/
public?abstract?class?Animator?implements?Cloneable?{
????......
}

所有的屬性動畫的抽象基類就是他。我們看下他的實(shí)現(xiàn)子類:?
?
其實(shí)可以看見,屬性動畫的實(shí)現(xiàn)有7個類(PS,之所以類繼承關(guān)系列表會出來那么多是因?yàn)槲蚁螺d了所有版本的SDK,你只用關(guān)注我紅點(diǎn)標(biāo)注的就行,妹的,ubuntu下圖片處理工具怎么都這么難用),進(jìn)去粗略分析可以發(fā)現(xiàn),好幾個是hide的類,而其他可用的類繼承關(guān)系又如下:

ValueAnimator?放置在res/animator/目錄下 在一個特定的時間里執(zhí)行一個動畫 TimeAnimator 不支持/點(diǎn)我查看原因 時序監(jiān)聽回調(diào)工具 ObjectAnimator?放置在res/animator/目錄下 一個對象的一個屬性動畫 AnimatorSet?放置在res/animator/目錄下 動畫集合

所以可以看見,我們平時使用屬性動畫的重點(diǎn)就在于AnimatorSet、ObjectAnimator、TimeAnimator、ValueAnimator。所以接下來我們就來依次說說如何使用。

4-2 屬性動畫詳細(xì)說明 4-2-1 屬性動畫計(jì)算原理

參看Android官方文檔,英文原版詳情點(diǎn)我查看!

Android屬性動畫(注意最低兼容版本,不過可以使用開源項(xiàng)目來替代低版本問題)提供了以下屬性:

Duration:動畫的持續(xù)時間;TimeInterpolation:定義動畫變化速率的接口,所有插值器都必須實(shí)現(xiàn)此接口,如線性、非線性插值器;TypeEvaluator:用于定義屬性值計(jì)算方式的接口,有int、float、color類型,根據(jù)屬性的起始、結(jié)束值和插值一起計(jì)算出當(dāng)前時間的屬性值;Animation sets:動畫集合,即可以同時對一個對象應(yīng)用多個動畫,這些動畫可以同時播放也可以對不同動畫設(shè)置不同的延遲;Frame refreash delay:多少時間刷新一次,即每隔多少時間計(jì)算一次屬性值,默認(rèn)為10ms,最終刷新時間還受系統(tǒng)進(jìn)程調(diào)度與硬件的影響;Repeat Country and behavoir:重復(fù)次數(shù)與方式,如播放3次、5次、無限循環(huán),可以讓此動畫一直重復(fù),或播放完時向反向播放;

接下來先來看官方為了解釋原理給出的兩幅圖(其實(shí)就是初中物理題,不解釋):

?
上面就是一個線性勻速動畫,描述了一個Object的X屬性運(yùn)動動畫,該對象的X坐標(biāo)在40ms內(nèi)從0移動到40,每10ms刷新一次,移動4次,每次移動為40/4=10pixel。?
?
上面是一個非勻速動畫,描述了一個Object的X屬性運(yùn)動動畫,該對象的X坐標(biāo)在40ms內(nèi)從0移動到40,每10ms刷新一次,移動4次,但是速率不同,開始和結(jié)束的速度要比中間部分慢,即先加速后減速。

接下來我們來詳細(xì)的看一下,屬性動畫系統(tǒng)的重要組成部分是如何計(jì)算動畫值的,下圖描述了如上面所示動畫的實(shí)現(xiàn)作用過程。

其中的ValueAnimator是動畫的執(zhí)行類,跟蹤了當(dāng)前動畫的執(zhí)行時間和當(dāng)前時間下的屬性值;ValueAnimator封裝了動畫的TimeInterpolator時間插值器和一個TypeEvaluator類型估值,用于設(shè)置動畫屬性的值,就像上面圖2非線性動畫里,TimeInterpolator使用了AccelerateDecelerateInterpolator、TypeEvaluator使用了IntEvaluator。

為了執(zhí)行一個動畫,你需要創(chuàng)建一個ValueAnimator,并且指定目標(biāo)對象屬性的開始、結(jié)束值和持續(xù)時間。在調(diào)用start后,整個動畫過程中, ValueAnimator會根據(jù)已經(jīng)完成的動畫時間計(jì)算得到一個0到1之間的分?jǐn)?shù),代表該動畫的已完成動畫百分比。0表示0%,1表示100%,譬如上面圖一線性勻速動畫中總時間 t = 40 ms,t = 10 ms的時候是 0.25。

當(dāng)ValueAnimator計(jì)算完已完成動畫分?jǐn)?shù)后,它會調(diào)用當(dāng)前設(shè)置的TimeInterpolator,去計(jì)算得到一個interpolated(插值)分?jǐn)?shù),在計(jì)算過程中,已完成動畫百分比會被加入到新的插值計(jì)算中。如上圖2非線性動畫中,因?yàn)閯赢嫷倪\(yùn)動是緩慢加速的,它的插值分?jǐn)?shù)大約是 0.15,小于t = 10ms時的已完成動畫分?jǐn)?shù)0.25。而在上圖1中,這個插值分?jǐn)?shù)一直和已完成動畫分?jǐn)?shù)是相同的。

當(dāng)插值分?jǐn)?shù)計(jì)算完成后,ValueAnimator會根據(jù)插值分?jǐn)?shù)調(diào)用合適的 TypeEvaluator去計(jì)算運(yùn)動中的屬性值。

好了,現(xiàn)在我們來看下代碼就明白這段話了,上面圖2非線性動畫里,TimeInterpolator使用了AccelerateDecelerateInterpolator、TypeEvaluator使用了IntEvaluator。所以這些類都是標(biāo)準(zhǔn)的API,我們來看下標(biāo)準(zhǔn)API就能類比自己寫了,如下:

首先計(jì)算已完成動畫時間分?jǐn)?shù)(以10ms為例):t=10ms/40ms=0.25。

接著看如下源碼如何實(shí)現(xiàn)計(jì)算差值分?jǐn)?shù)的:


public?class?AccelerateDecelerateInterpolator?extends?BaseInterpolator
????????implements?NativeInterpolatorFactory?{
????public?AccelerateDecelerateInterpolator()?{
????}
????......
????//這是我們關(guān)注重點(diǎn),可以發(fā)現(xiàn)如下計(jì)算公式計(jì)算后(input即為時間因子)插值大約為0.15。
????public?float?getInterpolation(float?input)?{
????????return?(float)(Math.cos((input?+?1)?*?Math.PI)?/?2.0f)?+?0.5f;
????}
????......
}

其實(shí)AccelerateDecelerateInterpolator的基類接口就是TimeInterpolator,如下,他只有g(shù)etInterpolation方法,也就是上面我們關(guān)注的方法。


public?interface?TimeInterpolator?{
????float?getInterpolation(float?input);
}

接著ValueAnimator會根據(jù)插值分?jǐn)?shù)調(diào)用合適的TypeEvaluator(IntEvaluator)去計(jì)算運(yùn)動中的屬性值,如下,因?yàn)閟tartValue = 0,所以屬性值:0+0.15*(40-0)= 6。


public?class?IntEvaluator?implements?TypeEvaluator{
????public?Integer?evaluate(float?fraction,?Integer?startValue,?Integer?endValue)?{
????????int?startInt?=?startValue;
????????return?(int)(startInt?+?fraction?*?(endValue?-?startInt));
????}
}

這就是官方給的一個關(guān)于屬性動畫實(shí)現(xiàn)的過程及基本原理解釋,相信你看到這里是會有些迷糊的,沒關(guān)系,你先有個大致概念就行,接下來我們會慢慢進(jìn)入實(shí)戰(zhàn),因?yàn)锳ndroid的屬性動畫相對于其他動畫來說涉及的知識點(diǎn)本來就比較復(fù)雜,所以我們慢慢來。

4-2-2 XML方式屬性動畫

在xml中可直接用的屬性動畫節(jié)點(diǎn)有ValueAnimator、ObjectAnimator、AnimatorSet。如下是官方的一個例子和解釋(詳情點(diǎn)我):


...

屬性解釋:

android:ordering 控制子動畫啟動方式是先后有序的還是同時進(jìn)行。sequentially:動畫按照先后順序;together(默認(rèn)):動畫同時啟動;


屬性解釋:

android:propertyName String類型,必須要設(shè)置的節(jié)點(diǎn)屬性,代表要執(zhí)行動畫的屬性(通過名字引用),辟如你可以指定了一個View的”alpha” 或者 “backgroundColor” ,這個objectAnimator元素沒有對外說明target屬性,所以你不能在XML中設(shè)置執(zhí)行這個動畫,必須通過調(diào)用loadAnimator()方法加載你的XML動畫資源,然后調(diào)用setTarget()應(yīng)用到具備這個屬性的目標(biāo)對象上(譬如TextView)。 android:valueTo float、int或者color類型,必須要設(shè)置的節(jié)點(diǎn)屬性,表明動畫結(jié)束的點(diǎn);如果是顏色的話,由6位十六進(jìn)制的數(shù)字表示。 android:valueFrom 相對應(yīng)valueTo,動畫的起始點(diǎn),如果沒有指定,系統(tǒng)會通過屬性的get方法獲取,顏色也是6位十六進(jìn)制的數(shù)字表示。 android:duration 動畫的時長,int類型,以毫秒為單位,默認(rèn)為300毫秒。 android:startOffset 動畫延遲的時間,從調(diào)用start方法后開始計(jì)算,int型,毫秒為單位。 android:repeatCount 一個動畫的重復(fù)次數(shù),int型,”-1“表示無限循環(huán),”1“表示動畫在第一次執(zhí)行完成后重復(fù)執(zhí)行一次,也就是兩次,默認(rèn)為0,不重復(fù)執(zhí)行。 android:repeatMode 重復(fù)模式:int型,當(dāng)一個動畫執(zhí)行完的時候應(yīng)該如何處理。該值必須是正數(shù)或者是-1,“reverse”會使得按照動畫向相反的方向執(zhí)行,可實(shí)現(xiàn)類似鐘擺效果?!皉epeat”會使得動畫每次都從頭開始循環(huán)。 android:valueType 關(guān)鍵參數(shù),如果該value是一個顏色,那么就不需要指定,因?yàn)閯赢嬁蚣軙詣拥奶幚眍伾怠S衖ntType和floatType(默認(rèn))兩種:分別說明動畫值為int和float型。


屬性解釋:?
同上屬性,不多介紹。

XML屬性動畫使用方法:


AnimatorSet?set?=?(AnimatorSet)?AnimatorInflater.loadAnimator(myContext,
????R.animtor.property_animator);
set.setTarget(myObject);
set.start();

4-2-3 Java方式屬性動畫

1、ObjectAnimator:繼承自ValueAnimator,允許你指定要進(jìn)行動畫的對象以及該對象的一個屬性。該類會根據(jù)計(jì)算得到的新值自動更新屬性。大多數(shù)的情況使用ObjectAnimator就足夠了,因?yàn)樗沟媚繕?biāo)對象動畫值的處理過程變得足夠簡單,不用像ValueAnimator那樣自己寫動畫更新的邏輯,但是ObjectAnimator有一定的限制,比如它需要目標(biāo)對象的屬性提供指定的處理方法(譬如提供getXXX,setXXX方法),這時候你就需要根據(jù)自己的需求在ObjectAnimator和ValueAnimator中看哪種實(shí)現(xiàn)更方便了。

<pre style="font-family:'Source Code Pro', monospace;font-size:14px;l

java類名xml關(guān)鍵字描述信息
xml屬性java方法解釋
xml屬性java方法解釋
xml屬性java方法解釋
xml屬性java方法解釋
xml屬性java方法解釋
Animation類的方法解釋
View類的常用動畫操作方法解釋
java類xml id值描述
java類名xml關(guān)鍵字描述信息
xml屬性解釋
xml屬性解釋
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉