您好,登錄后才能下訂單哦!
前言
Google在今年的IO大會上宣布,將Android開發的官方語言更換為Kotlin,作為跟著Google玩兒Android的人,我們必須盡快了解和使用Kotlin語言。
本文將詳細介紹Android動畫入門之kotlin的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
屬性動畫
簡述
在手機上去實現一些動畫效果算是件比較炫酷的事情,因此Android系統在一開始的時候就給我們提供了兩種實現動畫效果的方式,逐幀動畫(frame-by-frame animation)和補間動畫(tweened animation)。逐幀動畫的工作原理很簡單,其實就是將一個完整的動畫拆分成一張張單獨的圖片,然后再將它們連貫起來進行播放,類似于動畫片的工作原理。補間動畫則是可以對View進行一系列的動畫操作,包括淡入淡出、縮放、平移、旋轉四種。
然而自Android 3.0版本開始,系統給我們提供了一種全新的動畫模式,屬性動畫(property animation),它的功能非常強大,彌補了之前補間動畫的一些缺陷,幾乎是可以完全替代掉補間動畫了。對于逐幀動畫和補間動畫的用法,我不想再多講,它們的技術已經比較老了,而且網上資料也非常多,那么今天我們這篇文章的主題就是對Android屬性動畫進行一次完全解析。
為什么要引入屬性動畫?
Android之前的補間動畫機制其實還算是比較健全的,在android.view.animation包下面有好多的類可以供我們操作,來完成一系列的動畫效果,比如說對View進行移動、縮放、旋轉和淡入淡出,并且我們還可以借助AnimationSet來將這些動畫效果組合起來使用,除此之外還可以通過配置Interpolator來控制動畫的播放速度等等等等。那么這里大家可能要產生疑問了,既然之前的動畫機制已經這么健全了,為什么還要引入屬性動畫呢?
其實上面所謂的健全都是相對的,如果你的需求中只需要對View進行移動、縮放、旋轉和淡入淡出操作,那么補間動畫確實已經足夠健全了。但是很顯然,這些功能是不足以覆蓋所有的場景的,一旦我們的需求超出了移動、縮放、旋轉和淡入淡出這四種對View的操作,那么補間動畫就不能再幫我們忙了,也就是說它在功能和可擴展方面都有相當大的局限性,那么下面我們就來看看補間動畫所不能勝任的場景。
注意:上面我在介紹補間動畫的時候都有使用“對View進行操作”這樣的描述,沒錯,補間動畫是只能夠作用在View上的。也就是說,我們可以對一個Button、TextView、甚至是LinearLayout、或者其它任何繼承自View的組件進行動畫操作,但是如果我們想要對一個非View的對象進行動畫操作,抱歉,補間動畫就幫不上忙了。可能有的朋友會感到不能理解,我怎么會需要對一個非View的對象進行動畫操作呢?這里我舉一個簡單的例子,比如說我們有一個自定義的View,在這個View當中有一個Point對象用于管理坐標,然后在onDraw()方法當中就是根據這個Point對象的坐標值來進行繪制的。也就是說,如果我們可以對Point對象進行動畫操作,那么整個自定義View的動畫效果就有了。顯然,補間動畫是不具備這個功能的,這是它的第一個缺陷。
然后補間動畫還有一個缺陷,就是它只能夠實現移動、縮放、旋轉和淡入淡出這四種動畫操作,那如果我們希望可以對View的背景色進行動態地改變呢?很遺憾,我們只能靠自己去實現了。說白了,之前的補間動畫機制就是使用硬編碼的方式來完成的,功能限定死就是這些,基本上沒有任何擴展性可言。
最后,補間動畫還有一個致命的缺陷,就是它只是改變了View的顯示效果而已,而不會真正去改變View的屬性。什么意思呢?比如說,現在屏幕的左上角有一個按鈕,然后我們通過補間動畫將它移動到了屏幕的右下角,現在你可以去嘗試點擊一下這個按鈕,點擊事件是絕對不會觸發的,因為實際上這個按鈕還是停留在屏幕的左上角,只不過補間動畫將這個按鈕繪制到了屏幕的右下角而已。
也正是因為這些原因,Android開發團隊決定在3.0版本當中引入屬性動畫這個功能,那么屬性動畫是不是就把上述的問題全部解決掉了?下面我們就來一起看一看。
新引入的屬性動畫機制已經不再是針對于View來設計的了,也不限定于只能實現移動、縮放、旋轉和淡入淡出這幾種動畫操作,同時也不再只是一種視覺上的動畫效果了。它實際上是一種不斷地對值進行操作的機制,并將值賦值到指定對象的指定屬性上,可以是任意對象的任意屬性。所以我們仍然可以將一個View進行移動或者縮放,但同時也可以對自定義View中的Point對象進行動畫操作了。我們只需要告訴系統動畫的運行時長,需要執行哪種類型的動畫,以及動畫的初始值和結束值,剩下的工作就可以全部交給系統去完成了。
既然屬性動畫的實現機制是通過對目標對象進行賦值并修改其屬性來實現的,那么之前所說的按鈕顯示的問題也就不復存在了,如果我們通過屬性動畫來移動一個按鈕,那么這個按鈕就是真正的移動了,而不再是僅僅在另外一個位置繪制了而已。
好了,介紹了這么多,相信大家已經對屬性動畫有了一個最基本的認識了,下面我們就來開始學習一下屬性動畫的用法。
核心類
基本使用
這是一個讓textview點擊向下移動的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="移動" 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 } } }
這是一個將textview的背景3秒鐘從0xF000000變為0xF00ffff 無限播放且有反轉效果
直接把剛才的代碼修改為
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) //設置動畫時間 colorAnimator.setDuration(3000) //設置插值器 colorAnimator.setEvaluator(ArgbEvaluator()) //設置播放次數為無限 colorAnimator.repeatCount = ValueAnimator.INFINITE //播放完成之后反轉 colorAnimator.repeatMode = ValueAnimator.REVERSE colorAnimator.start() } } }
最后再來一個終極的動畫組合
將代碼修改為:
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() } } }
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。