在 Android 動(dòng)畫(huà)中,總共有兩種類型的動(dòng)畫(huà)View Animation(視圖動(dòng)畫(huà))和Property Animator(屬性動(dòng)畫(huà));其中
成都創(chuàng)新互聯(lián)自2013年起,先為大箐山等服務(wù)建站,大箐山等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為大箐山企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
View Animation包括Tween Animation(補(bǔ)間動(dòng)畫(huà))和Frame Animation(逐幀動(dòng)畫(huà));
Property Animator包括ValueAnimator和ObjectAnimation;
首先,直觀上,他們有如下三點(diǎn)不同:
1、引入時(shí)間不同: View Animation是API Level 1就引入的。Property Animation是API Level 11引入的,即Android 3.0才開(kāi)始有Property Animation相關(guān)的API。
2、所在包名不同: View Animation在包android.view.animation中。而Property Animation API在包 android.animation中。
3、動(dòng)畫(huà)類的命名不同: View Animation中動(dòng)畫(huà)類取名都叫XXXXAnimation,而在Property Animator中動(dòng)畫(huà)類的取名則叫XXXXAnimator大家都知道逐幀動(dòng)畫(huà)主要是用來(lái)實(shí)現(xiàn)動(dòng)畫(huà)的,而補(bǔ)間動(dòng)畫(huà)才能實(shí)現(xiàn)控件的漸入漸出、移動(dòng)、旋轉(zhuǎn)和縮放的;而Property Animator是在Android 3.0版本才引入的,之前是沒(méi)有的。
為什么還要引入Property Animator呢?
1、為什么引入Property Animator(屬性動(dòng)畫(huà))
我提出一個(gè)假設(shè):請(qǐng)問(wèn)大家,如何利用補(bǔ)間動(dòng)畫(huà)來(lái)將一個(gè)控件的背景色在一分鐘內(nèi)從綠色變?yōu)榧t色?這個(gè)效果想必沒(méi)辦法僅僅通過(guò)改變控件的漸入漸出、移動(dòng)、旋轉(zhuǎn)和縮放來(lái)實(shí)現(xiàn)吧,而這個(gè)效果是可以通過(guò)Property Animator完美實(shí)現(xiàn)的
**這就是第一個(gè)原因:Property Animator能實(shí)現(xiàn)補(bǔ)間動(dòng)畫(huà)無(wú)法實(shí)現(xiàn)的功能 **大家都知道,補(bǔ)間動(dòng)畫(huà)和逐幀動(dòng)畫(huà)統(tǒng)稱為View Animation,也就是說(shuō)這兩個(gè)動(dòng)畫(huà)只能對(duì)派生自View的控件實(shí)例起作用;而Property Animator則不同,從名字中可以看出屬性動(dòng)畫(huà),應(yīng)該是作用于控件屬性的!正因?yàn)閷傩詣?dòng)畫(huà)能夠只針對(duì)控件的某一個(gè)屬性來(lái)做動(dòng)畫(huà),所以也就造就了他能單獨(dú)改變控件的某一個(gè)屬性的值!比如顏色!這就是Property Animator能實(shí)現(xiàn)補(bǔ)間動(dòng)畫(huà)無(wú)法實(shí)現(xiàn)的功能的最重要原因。
**我們得到了第二點(diǎn)不同:View Animation僅能對(duì)指定的控件做動(dòng)畫(huà),而Property Animator是通過(guò)改變控件某一屬性值來(lái)做動(dòng)畫(huà)的。
**假設(shè)我們將一個(gè)按鈕從左上角利用補(bǔ)間動(dòng)畫(huà)將其移動(dòng)到右下角,在移動(dòng)過(guò)程中和移動(dòng)后,這個(gè)按鈕都是不會(huì)響應(yīng)點(diǎn)擊事件的。這是為什么呢?因?yàn)檠a(bǔ)間動(dòng)畫(huà)僅僅轉(zhuǎn)變的是控件的顯示位置而已,并沒(méi)有改變控件本身的值。View Animation的動(dòng)畫(huà)實(shí)現(xiàn)是通過(guò)其Parent View實(shí)現(xiàn)的,在View被drawn時(shí)Parents View改變它的繪制參數(shù),這樣雖然View的大小或旋轉(zhuǎn)角度等改變了,但View的實(shí)際屬性沒(méi)變,所以有效區(qū)域還是應(yīng)用動(dòng)畫(huà)之前的區(qū)域;我們看到的效果僅僅是系統(tǒng)作用在按鈕上的顯示效果,利用動(dòng)畫(huà)把按鈕從原來(lái)的位置移到了右下角,但按鈕內(nèi)部的任何值是沒(méi)有變化的,所以按鈕所捕捉的點(diǎn)擊區(qū)域仍是原來(lái)的點(diǎn)擊區(qū)域。(下面會(huì)舉例來(lái)說(shuō)明這個(gè)問(wèn)題)
這就得到了第三點(diǎn)不同:補(bǔ)間動(dòng)畫(huà)雖能對(duì)控件做動(dòng)畫(huà),但并沒(méi)有改變控件內(nèi)部的屬性值。而Property Animator則是恰恰相反,Property Animator是通過(guò)改變控件內(nèi)部的屬性值來(lái)達(dá)到動(dòng)畫(huà)效果的
我們前面講了Property Animator包括ValueAnimator和ObjectAnimator;這篇文章就主要來(lái)看看ValueAnimator的使用方法吧。
我覺(jué)得谷歌那幫老頭是最會(huì)起名字的人,單從命名上,就能看出來(lái)這個(gè)東東的含義。ValueAnimator從名字可以看出,這個(gè)Animation是針對(duì)值的! ValueAnimator不會(huì)對(duì)控件做任何操作,我們可以給它設(shè)定從哪個(gè)值運(yùn)動(dòng)到哪個(gè)值,通過(guò)監(jiān)聽(tīng)這些值的漸變過(guò)程來(lái)自己操作控件。 它會(huì)自己計(jì)算動(dòng)畫(huà)的過(guò)程,然后我們需要監(jiān)聽(tīng)它的動(dòng)畫(huà)過(guò)程來(lái)自己操作控件。
這就是ValueAnimator的功能:ValueAnimator對(duì)指定值區(qū)間做動(dòng)畫(huà)運(yùn)算,我們通過(guò)對(duì)運(yùn)算過(guò)程做監(jiān)聽(tīng)來(lái)自己操作控件。
總而言之就是兩點(diǎn):
1. ValueAnimator只負(fù)責(zé)對(duì)指定的數(shù)字區(qū)間進(jìn)行動(dòng)畫(huà)運(yùn)算
2. 我們需要對(duì)運(yùn)算過(guò)程進(jìn)行監(jiān)聽(tīng),然后自己對(duì)控件做動(dòng)畫(huà)操作
插值器的意義其實(shí)就相當(dāng)于物理公式中的加速度參數(shù),所以這也就是它也叫加速器的原因。 如何自定義插值器:
**input參數(shù)與任何我們?cè)O(shè)定的值沒(méi)關(guān)系,只與時(shí)間有關(guān),隨著時(shí)間的增長(zhǎng),動(dòng)畫(huà)的進(jìn)度也自然的增加,input參數(shù)就代表了當(dāng)前動(dòng)畫(huà)的進(jìn)度。而返回值則表示動(dòng)畫(huà)的當(dāng)前數(shù)值進(jìn)度 **
在getInterpolation函數(shù)中,我們將進(jìn)度反轉(zhuǎn)過(guò)來(lái),當(dāng)傳0的時(shí)候,我們讓它數(shù)值進(jìn)度在完成的位置,當(dāng)完成的時(shí)候,我們讓它在開(kāi)始的位置
ObjectAnimator是派生自ValueAnimator的,所以ValueAnimator中所能使用的方法,在ObjectAnimator中都可以正常使用。ObjectAnimator重寫(xiě)了幾個(gè)方法,比如ofInt(),ofFloat()等。利用ObjectAnimator重寫(xiě)的ofFloat方法如何實(shí)現(xiàn)一個(gè)動(dòng)畫(huà):(改變透明度)
前面我們都是定義多個(gè)值,即至少兩個(gè)值之間的變化,那如果我們只定義一個(gè)值呢,如下面的方式:(同樣以MyPointView為例)
僅且僅當(dāng)我們只給動(dòng)畫(huà)設(shè)置一個(gè)值時(shí),程序才會(huì)調(diào)用屬性對(duì)應(yīng)的get函數(shù)來(lái)得到動(dòng)畫(huà)初始值。如果動(dòng)畫(huà)沒(méi)有初始值,那么就會(huì)使用系統(tǒng)默認(rèn)值。比如ofInt()中使用的參數(shù)類型是int類型的,而系統(tǒng)的Int值的默認(rèn)值是0,所以動(dòng)畫(huà)就會(huì)從0運(yùn)動(dòng)到100;也就是系統(tǒng)雖然在找到不到屬性對(duì)應(yīng)的get函數(shù)時(shí),會(huì)給出警告,但同時(shí)會(huì)用系統(tǒng)默認(rèn)值做為動(dòng)畫(huà)初始值。
如果通過(guò)給自定義控件MyPointView設(shè)置了get函數(shù),那么將會(huì)以get函數(shù)的返回值做為初始值。
根據(jù) View setBackGroundColor() 方法可以自定義條用屬性動(dòng)畫(huà)。
題主是否想詢問(wèn)“android屬性動(dòng)畫(huà)平移和縮放疊加嗎”?不疊加。android的View動(dòng)畫(huà)屬性是一步一步進(jìn)行的,先進(jìn)行平移,再進(jìn)行縮放比例,是兩個(gè)步驟,是不能疊加的。android動(dòng)畫(huà)是通過(guò)控制view在一段時(shí)間間隔內(nèi)的屬性來(lái)達(dá)到動(dòng)畫(huà)效果。
CSDN同步發(fā)布
旋轉(zhuǎn)動(dòng)畫(huà)有三種
角度增加是逆時(shí)針?lè)较蛐D(zhuǎn)。注意,如果旋轉(zhuǎn)角度是90度的話,最終View會(huì)不可見(jiàn)。
當(dāng)要旋轉(zhuǎn)的View尺寸很小的時(shí)候,效果很好,但是當(dāng)View很大的時(shí)候,就出問(wèn)題了。如下所示:
當(dāng)時(shí)很奇怪為啥會(huì)這樣呢?最后是在這篇文章 實(shí)現(xiàn)翻轉(zhuǎn)卡片的動(dòng)畫(huà)效果 看到了一個(gè)叫cameraDistance的東西,然后感覺(jué)可能這個(gè)有用,試了試果然可以。
View的 getCameraDistance 方法。
View的 setCameraDistance 方法,看注釋。
注意:注釋中的這段這個(gè)相機(jī)距離用“深度像素”來(lái)表示。默認(rèn)的距離依賴屏幕的密度。例如,在一個(gè)中等密度的屏幕上,默認(rèn)的距離是1280。在高密度的屏幕上,默認(rèn)距離是1920。我認(rèn)為這個(gè)單位是dp。1280dp,1920dp。我的測(cè)試機(jī)density是2.75,通過(guò)getCameraDistance方法,獲取到的值是3520.0,3520.0除以2.75就是1280。
注意:關(guān)于設(shè)置cameraDistance,建議始終使用大于此視圖高度(繞X軸旋轉(zhuǎn))或?qū)挾龋╕軸旋轉(zhuǎn))的相機(jī)距離。而且這個(gè)距離得比較大才行,我測(cè)試下來(lái)得10000以上才可以。如下所示:
同樣需要設(shè)置 cameraDistance
平時(shí)這個(gè)用的比較多應(yīng)該,也比較簡(jiǎn)單。也不涉及 cameraDistance 的東西。
參考鏈接