Android動畫入門教程之kotlin

Android動畫入門教程之kotlin

前言

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物件進行動畫操作了。我們只需要告訴系統動畫的執行時長,需要執行哪種型別的動畫,以及動畫的初始值和結束值,剩下的工作就可以全部交給系統去完成了。

既然屬性動畫的實現機制是通過對目標物件進行賦值並修改其屬性來實現的,那麼之前所說的按鈕顯示的問題也就不復存在了,如果我們通過屬性動畫來移動一個按鈕,那麼這個按鈕就是真正的移動了,而不再是僅僅在另外一個位置繪製了而已。
好了,介紹了這麼多,相信大家已經對屬性動畫有了一個最基本的認識了,下面我們就來開始學習一下屬性動畫的用法。

核心類

ValueAnimator:該類是Animator的子類,實現了動畫的整個處理邏輯也是屬性動畫的核心類
ObjectAnimator:物件屬性動畫的操作類,繼承自ValueAnimator,通過該類使用動畫的形式操作物件的屬性
TimeInterpolator:時間插值器,他的作用是根據時間流逝的百分比來計算出當前屬性值改變的百分比,系統預置的有線性插值器(LinearInterpolator)、加速插值器(AccelerateDeceleratenterpolator)和減速插值器(DecelerateInterpolator)等。
TypeEvaluator:TypeEvaluator的中文為型別估值演算法,他的作用是根據當前屬性改變的百分比來計算改變後的屬性值,系統預支的有針對整形屬性(IntEvaluator)、針對浮點型(FloatEvaluator)和針對Color屬性(ArgbEvaluator)
Property:屬性物件,主要是定義了屬性的set和get方法。
PropertyValuesHolder: PropertyValuesHolder是持有目標屬性Property、setter和getter方法以及關鍵幀的集合
KeyframeSet:儲存一個動畫的關鍵幀集合。
AnimotionProxy:再3.0以下使用View的屬性動畫的輔助類

基本使用

這是一個讓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()
}
}
}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對指令碼之家的支援。

您可能感興趣的文章:

通過FancyView提供 Android 酷炫的開屏動畫例項程式碼Android自定義帶載入動畫效果的環狀進度條Android自定義viewGroup實現點選動畫效果Android仿開啟微信紅包動畫效果實現程式碼Android仿硬幣轉動微信紅包動畫效果Android實現過渡動畫、引導頁 Android判斷是否第一次啟動AppAndroid 仿餘額寶數字跳動動畫效果完整程式碼Android開發簡單實現搖動動畫的方法Android開發之背景動畫簡單實現方法Android動畫實現原理和程式碼