溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android動畫入門教程之kotlin

發(fā)布時間:2020-10-25 20:59:06 來源:腳本之家 閱讀:195 作者:TTD丶 欄目:移動開發(fā)

前言

Google在今年的IO大會上宣布,將Android開發(fā)的官方語言更換為Kotlin,作為跟著Google玩兒Android的人,我們必須盡快了解和使用Kotlin語言。

本文將詳細介紹Android動畫入門之kotlin的相關內(nèi)容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

屬性動畫

簡述

在手機上去實現(xiàn)一些動畫效果算是件比較炫酷的事情,因此Android系統(tǒng)在一開始的時候就給我們提供了兩種實現(xiàn)動畫效果的方式,逐幀動畫(frame-by-frame animation)和補間動畫(tweened animation)。逐幀動畫的工作原理很簡單,其實就是將一個完整的動畫拆分成一張張單獨的圖片,然后再將它們連貫起來進行播放,類似于動畫片的工作原理。補間動畫則是可以對View進行一系列的動畫操作,包括淡入淡出、縮放、平移、旋轉(zhuǎn)四種。

然而自Android 3.0版本開始,系統(tǒng)給我們提供了一種全新的動畫模式,屬性動畫(property animation),它的功能非常強大,彌補了之前補間動畫的一些缺陷,幾乎是可以完全替代掉補間動畫了。對于逐幀動畫和補間動畫的用法,我不想再多講,它們的技術已經(jīng)比較老了,而且網(wǎng)上資料也非常多,那么今天我們這篇文章的主題就是對Android屬性動畫進行一次完全解析。
為什么要引入屬性動畫?

Android之前的補間動畫機制其實還算是比較健全的,在android.view.animation包下面有好多的類可以供我們操作,來完成一系列的動畫效果,比如說對View進行移動、縮放、旋轉(zhuǎn)和淡入淡出,并且我們還可以借助AnimationSet來將這些動畫效果組合起來使用,除此之外還可以通過配置Interpolator來控制動畫的播放速度等等等等。那么這里大家可能要產(chǎn)生疑問了,既然之前的動畫機制已經(jīng)這么健全了,為什么還要引入屬性動畫呢?

其實上面所謂的健全都是相對的,如果你的需求中只需要對View進行移動、縮放、旋轉(zhuǎn)和淡入淡出操作,那么補間動畫確實已經(jīng)足夠健全了。但是很顯然,這些功能是不足以覆蓋所有的場景的,一旦我們的需求超出了移動、縮放、旋轉(zhuǎn)和淡入淡出這四種對View的操作,那么補間動畫就不能再幫我們忙了,也就是說它在功能和可擴展方面都有相當大的局限性,那么下面我們就來看看補間動畫所不能勝任的場景。

注意:上面我在介紹補間動畫的時候都有使用“對View進行操作”這樣的描述,沒錯,補間動畫是只能夠作用在View上的。也就是說,我們可以對一個Button、TextView、甚至是LinearLayout、或者其它任何繼承自View的組件進行動畫操作,但是如果我們想要對一個非View的對象進行動畫操作,抱歉,補間動畫就幫不上忙了。可能有的朋友會感到不能理解,我怎么會需要對一個非View的對象進行動畫操作呢?這里我舉一個簡單的例子,比如說我們有一個自定義的View,在這個View當中有一個Point對象用于管理坐標,然后在onDraw()方法當中就是根據(jù)這個Point對象的坐標值來進行繪制的。也就是說,如果我們可以對Point對象進行動畫操作,那么整個自定義View的動畫效果就有了。顯然,補間動畫是不具備這個功能的,這是它的第一個缺陷。

然后補間動畫還有一個缺陷,就是它只能夠?qū)崿F(xiàn)移動、縮放、旋轉(zhuǎn)和淡入淡出這四種動畫操作,那如果我們希望可以對View的背景色進行動態(tài)地改變呢?很遺憾,我們只能靠自己去實現(xiàn)了。說白了,之前的補間動畫機制就是使用硬編碼的方式來完成的,功能限定死就是這些,基本上沒有任何擴展性可言。

最后,補間動畫還有一個致命的缺陷,就是它只是改變了View的顯示效果而已,而不會真正去改變View的屬性。什么意思呢?比如說,現(xiàn)在屏幕的左上角有一個按鈕,然后我們通過補間動畫將它移動到了屏幕的右下角,現(xiàn)在你可以去嘗試點擊一下這個按鈕,點擊事件是絕對不會觸發(fā)的,因為實際上這個按鈕還是停留在屏幕的左上角,只不過補間動畫將這個按鈕繪制到了屏幕的右下角而已。

也正是因為這些原因,Android開發(fā)團隊決定在3.0版本當中引入屬性動畫這個功能,那么屬性動畫是不是就把上述的問題全部解決掉了?下面我們就來一起看一看。

新引入的屬性動畫機制已經(jīng)不再是針對于View來設計的了,也不限定于只能實現(xiàn)移動、縮放、旋轉(zhuǎn)和淡入淡出這幾種動畫操作,同時也不再只是一種視覺上的動畫效果了。它實際上是一種不斷地對值進行操作的機制,并將值賦值到指定對象的指定屬性上,可以是任意對象的任意屬性。所以我們?nèi)匀豢梢詫⒁粋€View進行移動或者縮放,但同時也可以對自定義View中的Point對象進行動畫操作了。我們只需要告訴系統(tǒng)動畫的運行時長,需要執(zhí)行哪種類型的動畫,以及動畫的初始值和結(jié)束值,剩下的工作就可以全部交給系統(tǒng)去完成了。

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

核心類

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

基本使用

這是一個讓textview點擊向下移動的demo

效果展示

Android動畫入門教程之kotlin

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變?yōu)?xF00ffff 無限播放且有反轉(zhuǎn)效果

Android動畫入門教程之kotlin

直接把剛才的代碼修改為

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())
   //設置播放次數(shù)為無限
   colorAnimator.repeatCount = ValueAnimator.INFINITE
   //播放完成之后反轉(zhuǎn)
   colorAnimator.repeatMode = ValueAnimator.REVERSE
   colorAnimator.start()
  }
 }
}

最后再來一個終極的動畫組合

Android動畫入門教程之kotlin

將代碼修改為:

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é)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI