Android動(dòng)畫(huà)入門(mén)教程之kotlin
前言
Google在今年的IO大會(huì)上宣布,將Android開(kāi)發(fā)的官方語(yǔ)言更換為Kotlin,作為跟著Google玩兒Android的人,我們必須盡快了解和使用Kotlin語(yǔ)言。
本文將詳細(xì)介紹Android動(dòng)畫(huà)入門(mén)之kotlin的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話(huà)不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
屬性動(dòng)畫(huà)
簡(jiǎn)述
在手機(jī)上去實(shí)現(xiàn)一些動(dòng)畫(huà)效果算是件比較炫酷的事情,因此Android系統(tǒng)在一開(kāi)始的時(shí)候就給我們提供了兩種實(shí)現(xiàn)動(dòng)畫(huà)效果的方式,逐幀動(dòng)畫(huà)(frame-by-frame animation)和補(bǔ)間動(dòng)畫(huà)(tweened animation)。逐幀動(dòng)畫(huà)的工作原理很簡(jiǎn)單,其實(shí)就是將一個(gè)完整的動(dòng)畫(huà)拆分成一張張單獨(dú)的圖片,然后再將它們連貫起來(lái)進(jìn)行播放,類(lèi)似于動(dòng)畫(huà)片的工作原理。補(bǔ)間動(dòng)畫(huà)則是可以對(duì)View進(jìn)行一系列的動(dòng)畫(huà)操作,包括淡入淡出、縮放、平移、旋轉(zhuǎn)四種。
然而自Android 3.0版本開(kāi)始,系統(tǒng)給我們提供了一種全新的動(dòng)畫(huà)模式,屬性動(dòng)畫(huà)(property animation),它的功能非常強(qiáng)大,彌補(bǔ)了之前補(bǔ)間動(dòng)畫(huà)的一些缺陷,幾乎是可以完全替代掉補(bǔ)間動(dòng)畫(huà)了。對(duì)于逐幀動(dòng)畫(huà)和補(bǔ)間動(dòng)畫(huà)的用法,我不想再多講,它們的技術(shù)已經(jīng)比較老了,而且網(wǎng)上資料也非常多,那么今天我們這篇文章的主題就是對(duì)Android屬性動(dòng)畫(huà)進(jìn)行一次完全解析。
為什么要引入屬性動(dòng)畫(huà)?
Android之前的補(bǔ)間動(dòng)畫(huà)機(jī)制其實(shí)還算是比較健全的,在android.view.animation包下面有好多的類(lèi)可以供我們操作,來(lái)完成一系列的動(dòng)畫(huà)效果,比如說(shuō)對(duì)View進(jìn)行移動(dòng)、縮放、旋轉(zhuǎn)和淡入淡出,并且我們還可以借助AnimationSet來(lái)將這些動(dòng)畫(huà)效果組合起來(lái)使用,除此之外還可以通過(guò)配置Interpolator來(lái)控制動(dòng)畫(huà)的播放速度等等等等。那么這里大家可能要產(chǎn)生疑問(wèn)了,既然之前的動(dòng)畫(huà)機(jī)制已經(jīng)這么健全了,為什么還要引入屬性動(dòng)畫(huà)呢?
其實(shí)上面所謂的健全都是相對(duì)的,如果你的需求中只需要對(duì)View進(jìn)行移動(dòng)、縮放、旋轉(zhuǎn)和淡入淡出操作,那么補(bǔ)間動(dòng)畫(huà)確實(shí)已經(jīng)足夠健全了。但是很顯然,這些功能是不足以覆蓋所有的場(chǎng)景的,一旦我們的需求超出了移動(dòng)、縮放、旋轉(zhuǎn)和淡入淡出這四種對(duì)View的操作,那么補(bǔ)間動(dòng)畫(huà)就不能再幫我們忙了,也就是說(shuō)它在功能和可擴(kuò)展方面都有相當(dāng)大的局限性,那么下面我們就來(lái)看看補(bǔ)間動(dòng)畫(huà)所不能勝任的場(chǎng)景。
注意:上面我在介紹補(bǔ)間動(dòng)畫(huà)的時(shí)候都有使用“對(duì)View進(jìn)行操作”這樣的描述,沒(méi)錯(cuò),補(bǔ)間動(dòng)畫(huà)是只能夠作用在View上的。也就是說(shuō),我們可以對(duì)一個(gè)Button、TextView、甚至是LinearLayout、或者其它任何繼承自View的組件進(jìn)行動(dòng)畫(huà)操作,但是如果我們想要對(duì)一個(gè)非View的對(duì)象進(jìn)行動(dòng)畫(huà)操作,抱歉,補(bǔ)間動(dòng)畫(huà)就幫不上忙了。可能有的朋友會(huì)感到不能理解,我怎么會(huì)需要對(duì)一個(gè)非View的對(duì)象進(jìn)行動(dòng)畫(huà)操作呢?這里我舉一個(gè)簡(jiǎn)單的例子,比如說(shuō)我們有一個(gè)自定義的View,在這個(gè)View當(dāng)中有一個(gè)Point對(duì)象用于管理坐標(biāo),然后在onDraw()方法當(dāng)中就是根據(jù)這個(gè)Point對(duì)象的坐標(biāo)值來(lái)進(jìn)行繪制的。也就是說(shuō),如果我們可以對(duì)Point對(duì)象進(jìn)行動(dòng)畫(huà)操作,那么整個(gè)自定義View的動(dòng)畫(huà)效果就有了。顯然,補(bǔ)間動(dòng)畫(huà)是不具備這個(gè)功能的,這是它的第一個(gè)缺陷。
然后補(bǔ)間動(dòng)畫(huà)還有一個(gè)缺陷,就是它只能夠?qū)崿F(xiàn)移動(dòng)、縮放、旋轉(zhuǎn)和淡入淡出這四種動(dòng)畫(huà)操作,那如果我們希望可以對(duì)View的背景色進(jìn)行動(dòng)態(tài)地改變呢?很遺憾,我們只能靠自己去實(shí)現(xiàn)了。說(shuō)白了,之前的補(bǔ)間動(dòng)畫(huà)機(jī)制就是使用硬編碼的方式來(lái)完成的,功能限定死就是這些,基本上沒(méi)有任何擴(kuò)展性可言。
最后,補(bǔ)間動(dòng)畫(huà)還有一個(gè)致命的缺陷,就是它只是改變了View的顯示效果而已,而不會(huì)真正去改變View的屬性。什么意思呢?比如說(shuō),現(xiàn)在屏幕的左上角有一個(gè)按鈕,然后我們通過(guò)補(bǔ)間動(dòng)畫(huà)將它移動(dòng)到了屏幕的右下角,現(xiàn)在你可以去嘗試點(diǎn)擊一下這個(gè)按鈕,點(diǎn)擊事件是絕對(duì)不會(huì)觸發(fā)的,因?yàn)閷?shí)際上這個(gè)按鈕還是停留在屏幕的左上角,只不過(guò)補(bǔ)間動(dòng)畫(huà)將這個(gè)按鈕繪制到了屏幕的右下角而已。
也正是因?yàn)檫@些原因,Android開(kāi)發(fā)團(tuán)隊(duì)決定在3.0版本當(dāng)中引入屬性動(dòng)畫(huà)這個(gè)功能,那么屬性動(dòng)畫(huà)是不是就把上述的問(wèn)題全部解決掉了?下面我們就來(lái)一起看一看。
新引入的屬性動(dòng)畫(huà)機(jī)制已經(jīng)不再是針對(duì)于View來(lái)設(shè)計(jì)的了,也不限定于只能實(shí)現(xiàn)移動(dòng)、縮放、旋轉(zhuǎn)和淡入淡出這幾種動(dòng)畫(huà)操作,同時(shí)也不再只是一種視覺(jué)上的動(dòng)畫(huà)效果了。它實(shí)際上是一種不斷地對(duì)值進(jìn)行操作的機(jī)制,并將值賦值到指定對(duì)象的指定屬性上,可以是任意對(duì)象的任意屬性。所以我們?nèi)匀豢梢詫⒁粋€(gè)View進(jìn)行移動(dòng)或者縮放,但同時(shí)也可以對(duì)自定義View中的Point對(duì)象進(jìn)行動(dòng)畫(huà)操作了。我們只需要告訴系統(tǒng)動(dòng)畫(huà)的運(yùn)行時(shí)長(zhǎng),需要執(zhí)行哪種類(lèi)型的動(dòng)畫(huà),以及動(dòng)畫(huà)的初始值和結(jié)束值,剩下的工作就可以全部交給系統(tǒng)去完成了。
既然屬性動(dòng)畫(huà)的實(shí)現(xiàn)機(jī)制是通過(guò)對(duì)目標(biāo)對(duì)象進(jìn)行賦值并修改其屬性來(lái)實(shí)現(xiàn)的,那么之前所說(shuō)的按鈕顯示的問(wèn)題也就不復(fù)存在了,如果我們通過(guò)屬性動(dòng)畫(huà)來(lái)移動(dòng)一個(gè)按鈕,那么這個(gè)按鈕就是真正的移動(dòng)了,而不再是僅僅在另外一個(gè)位置繪制了而已。
好了,介紹了這么多,相信大家已經(jīng)對(duì)屬性動(dòng)畫(huà)有了一個(gè)最基本的認(rèn)識(shí)了,下面我們就來(lái)開(kāi)始學(xué)習(xí)一下屬性動(dòng)畫(huà)的用法。
核心類(lèi)
- ValueAnimator:該類(lèi)是Animator的子類(lèi),實(shí)現(xiàn)了動(dòng)畫(huà)的整個(gè)處理邏輯也是屬性動(dòng)畫(huà)的核心類(lèi)
- ObjectAnimator:對(duì)象屬性動(dòng)畫(huà)的操作類(lèi),繼承自ValueAnimator,通過(guò)該類(lèi)使用動(dòng)畫(huà)的形式操作對(duì)象的屬性
- TimeInterpolator:時(shí)間插值器,他的作用是根據(jù)時(shí)間流逝的百分比來(lái)計(jì)算出當(dāng)前屬性值改變的百分比,系統(tǒng)預(yù)置的有線(xiàn)性插值器(LinearInterpolator)、加速插值器(AccelerateDeceleratenterpolator)和減速插值器(DecelerateInterpolator)等。
- TypeEvaluator:TypeEvaluator的中文為類(lèi)型估值算法,他的作用是根據(jù)當(dāng)前屬性改變的百分比來(lái)計(jì)算改變后的屬性值,系統(tǒng)預(yù)支的有針對(duì)整形屬性(IntEvaluator)、針對(duì)浮點(diǎn)型(FloatEvaluator)和針對(duì)Color屬性(ArgbEvaluator)
- Property:屬性對(duì)象,主要是定義了屬性的set和get方法。
- PropertyValuesHolder: PropertyValuesHolder是持有目標(biāo)屬性Property、setter和getter方法以及關(guān)鍵幀的集合
- KeyframeSet:儲(chǔ)存一個(gè)動(dòng)畫(huà)的關(guān)鍵幀集合。
- AnimotionProxy:再3.0以下使用View的屬性動(dòng)畫(huà)的輔助類(lèi)
基本使用
這是一個(gè)讓textview點(diǎn)擊向下移動(dòng)的demo
效果展示
xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="transformation.numberutils.wushaocong.manimotor.MainActivity"> <TextView android:text="移動(dòng)" android:textSize="20sp" android:layout_centerInParent="true" android:id="@+id/mtext" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout>
kotlin:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) var y = 100f mtext.setOnClickListener { v -> ObjectAnimator.ofFloat(v, "translationY", y).start() y+=100f } } }
這是一個(gè)將textview的背景3秒鐘從0xF000000變?yōu)?xF00ffff 無(wú)限播放且有反轉(zhuǎn)效果
直接把剛才的代碼修改為
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) var y = 100f mtext.setOnClickListener { v -> val colorAnimator = ObjectAnimator.ofInt(v,"backgroundColor",0xF000000,0xF00ffff) //設(shè)置動(dòng)畫(huà)時(shí)間 colorAnimator.setDuration(3000) //設(shè)置插值器 colorAnimator.setEvaluator(ArgbEvaluator()) //設(shè)置播放次數(shù)為無(wú)限 colorAnimator.repeatCount = ValueAnimator.INFINITE //播放完成之后反轉(zhuǎn) colorAnimator.repeatMode = ValueAnimator.REVERSE colorAnimator.start() } } }
最后再來(lái)一個(gè)終極的動(dòng)畫(huà)組合
將代碼修改為:
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) var y = 100f mtext.setOnClickListener { v -> var animators = listOf<ObjectAnimator>( ObjectAnimator.ofFloat(v,"rotationX",0f,360f), ObjectAnimator.ofFloat(v,"rotationY",0f,180f), ObjectAnimator.ofFloat(v,"rotation",0f,-90f), ObjectAnimator.ofFloat(v,"translationX",0f,90f), ObjectAnimator.ofFloat(v,"translationY",0f,90f), ObjectAnimator.ofFloat(v,"scaleY",1f,1.5f), ObjectAnimator.ofFloat(v,"scaleX",1f,0.5f), ObjectAnimator.ofFloat(v,"alpha",0f,1f,0.25f,1f) ) val set = AnimatorSet() set.playTogether(animators) set.setDuration(6*1000).start() } } }
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- 通過(guò)FancyView提供 Android 酷炫的開(kāi)屏動(dòng)畫(huà)實(shí)例代碼
- Android自定義帶加載動(dòng)畫(huà)效果的環(huán)狀進(jìn)度條
- Android自定義viewGroup實(shí)現(xiàn)點(diǎn)擊動(dòng)畫(huà)效果
- Android仿打開(kāi)微信紅包動(dòng)畫(huà)效果實(shí)現(xiàn)代碼
- Android仿硬幣轉(zhuǎn)動(dòng)微信紅包動(dòng)畫(huà)效果
- Android實(shí)現(xiàn)過(guò)渡動(dòng)畫(huà)、引導(dǎo)頁(yè) Android判斷是否第一次啟動(dòng)App
- Android 仿余額寶數(shù)字跳動(dòng)動(dòng)畫(huà)效果完整代碼
- Android開(kāi)發(fā)簡(jiǎn)單實(shí)現(xiàn)搖動(dòng)動(dòng)畫(huà)的方法
- Android開(kāi)發(fā)之背景動(dòng)畫(huà)簡(jiǎn)單實(shí)現(xiàn)方法
- Android動(dòng)畫(huà)實(shí)現(xiàn)原理和代碼
相關(guān)文章
Android嵌套滾動(dòng)和協(xié)調(diào)滾動(dòng)的多種實(shí)現(xiàn)方法
嵌套的滾動(dòng)主要方式就是這些,這些簡(jiǎn)單的效果我們用協(xié)調(diào)滾動(dòng),如?CoordinatorLayout?也能實(shí)現(xiàn)同樣的效果,這篇文章主要介紹了Android嵌套滾動(dòng)和協(xié)調(diào)滾動(dòng)的多種實(shí)現(xiàn)方法,需要的朋友可以參考下2022-06-06完美解決客戶(hù)端webview持有的頁(yè)面緩存,不會(huì)立即釋放的問(wèn)題
下面小編就為大家?guī)?lái)一篇完美解決客戶(hù)端webview持有的頁(yè)面緩存,不會(huì)立即釋放的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12Android編程開(kāi)發(fā)ScrollView中ViewPager無(wú)法正?;瑒?dòng)問(wèn)題解決方法
這篇文章主要介紹了Android編程開(kāi)發(fā)ScrollView中ViewPager無(wú)法正?;瑒?dòng)問(wèn)題解決方法,以實(shí)例形式分析了ScrollView中滑動(dòng)失效的原因及解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10Android自定義View 實(shí)現(xiàn)鬧鐘喚起播放鬧鐘鈴聲功能
這篇文章主要介紹了Android自定義View 實(shí)現(xiàn)鬧鐘喚起播放鬧鐘鈴聲的效果,本文通過(guò)實(shí)例代碼給大家詳解,需要的朋友可以參考下2016-12-12Android人臉識(shí)別Demo豎屏YUV方向調(diào)整和圖片保存(分享)
下面小編就為大家分享一篇Android人臉識(shí)別Demo實(shí)現(xiàn)豎屏YUV方向調(diào)整和圖片保存的方法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12Android入門(mén)教程之Vibrator(振動(dòng)器)
本節(jié)我們介紹的是Vibrator(振動(dòng)器),是手機(jī)自帶的振動(dòng)器,其實(shí)就是Android給我們提供的用于機(jī)身震動(dòng)的一個(gè)服務(wù)!當(dāng)收到推送消息的時(shí)候我們可以設(shè)置震動(dòng)提醒。2016-07-075分鐘快速實(shí)現(xiàn)Android爆炸破碎酷炫動(dòng)畫(huà)特效的示例
本篇文章主要介紹了5分鐘快速實(shí)現(xiàn)Android爆炸破碎酷炫動(dòng)效的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12輕松實(shí)現(xiàn)Rxjava定時(shí)器功能
這篇文章主要為大家詳細(xì)介紹了Rxjava實(shí)現(xiàn)定時(shí)器功能的兩種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06