日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android属性动画 ObjectAnimator

發布時間:2024/9/30 Android 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android属性动画 ObjectAnimator 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載請標明出處:http://blog.csdn.net/zhaoyanjun6/article/details/118709616
本文出自【趙彥軍的博客】

文章目錄

  • ObjectAnimator
  • 實戰-心跳動畫
  • 參考資料

ObjectAnimator

public final class ObjectAnimator extends ValueAnimator { ... }

ObjectAnimator 繼承 ValueAnimator , 所以 ObjectAnimator 擁有 ValueAnimator 一切特性。

相比于ValueAnimator,ObjectAnimator可能才是我們最常接觸到的類,因為ValueAnimator只不過是對值進行了一個平滑的動畫過渡,但我們實際使用到這種功能的場景好像并不多。而ObjectAnimator則就不同了,它是可以直接對任意對象的任意屬性進行動畫操作的,比如說View的alpha屬性。

不過雖說ObjectAnimator會更加常用一些,但是它其實是繼承自ValueAnimator的,底層的動畫實現機制也是基于ValueAnimator來完成的,因此ValueAnimator仍然是整個屬性動畫當中最核心的一個類。那么既然是繼承關系,說明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,它們的用法也非常類似,這里如果我們想要將一個TextView在5秒中內從常規變換成全透明,再從全透明變換成常規,就可以這樣寫:

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f); animator.setDuration(5000); animator.start();

可以看到,我們還是調用了ofFloat()方法來去創建一個ObjectAnimator的實例,只不過ofFloat()方法當中接收的參數有點變化了。這里第一個參數要求傳入一個object對象,我們想要對哪個對象進行動畫操作就傳入什么,這里我傳入了一個textview。第二個參數是想要對該對象的哪個屬性進行動畫操作,由于我們想要改變TextView的不透明度,因此這里傳入"alpha"。后面的參數就是不固定長度了,想要完成什么樣的動畫就傳入什么值,這里傳入的值就表示將TextView從常規變換成全透明,再從全透明變換成常規。之后調用setDuration()方法來設置動畫的時長,然后調用start()方法啟動動畫,效果如下圖所示:

學會了這一個用法之后,其它的用法我們就可以舉一反三了,那比如說我們想要將TextView進行一次360度的旋轉,就可以這樣寫:

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f); animator.setDuration(5000); animator.start();

可以看到,這里我們將第二個參數改成了"rotation",然后將動畫的初始值和結束值分別設置成0和360,現在運行一下代碼,效果如下圖所示:

那么如果想要將TextView先向左移出屏幕,然后再移動回來,就可以這樣寫:

float curTranslationX = textview.getTranslationX(); ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX, -500f, curTranslationX); animator.setDuration(5000); animator.start();

這里我們先是調用了TextView的getTranslationX()方法來獲取到當前TextView的translationX的位置,然后ofFloat()方法的第二個參數傳入"translationX",緊接著后面三個參數用于告訴系統TextView應該怎么移動,現在運行一下代碼,效果如下圖所示:


然后我們還可以TextView進行縮放操作,比如說將TextView在垂直方向上放大3倍再還原,就可以這樣寫:

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f); animator.setDuration(5000); animator.start();

這里將ofFloat()方法的第二個參數改成了"scaleY",表示在垂直方向上進行縮放,現在重新運行一下程序,效果如下圖所示:


到目前為止,ObjectAnimator的用法還算是相當簡單吧,但是我相信肯定會有不少朋友現在心里都有同樣一個疑問,就是ofFloat()方法的第二個參數到底可以傳哪些值呢?

目前我們使用過了alpha、rotation、translationX和scaleY這幾個值,分別可以完成淡入淡出、旋轉、水平移動、垂直縮放這幾種動畫,那么還有哪些值是可以使用的呢?

其實這個問題的答案非常玄乎,就是我們可以傳入任意的值到ofFloat()方法的第二個參數當中。任意的值?相信這很出乎大家的意料吧,但事實就是如此。因為ObjectAnimator在設計的時候就沒有針對于View來進行設計,而是針對于任意對象的,它所負責的工作就是不斷地向某個對象中的某個屬性進行賦值,然后對象根據屬性值的改變再來決定如何展現出來。

那么比如說我們調用下面這樣一段代碼:

ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f);

其實這段代碼的意思就是ObjectAnimator會幫我們不斷地改變textview對象中alpha屬性的值,從1f變化到0f。然后textview對象需要根據alpha屬性值的改變來不斷刷新界面的顯示,從而讓用戶可以看出淡入淡出的動畫效果。

那么textview對象中是不是有alpha屬性這個值呢?

沒有,不僅textview沒有這個屬性,連它所有的父類也是沒有這個屬性的!

這就奇怪了,textview當中并沒有alpha這個屬性,ObjectAnimator是如何進行操作的呢?其實ObjectAnimator內部的工作機制并不是直接對我們傳入的屬性名進行操作的,而是會去尋找這個屬性名對應的get和set方法,因此alpha屬性所對應的get和set方法應該就是:

public void setAlpha(float value); public float getAlpha();

那么textview對象中是否有這兩個方法呢?確實有,并且這兩個方法是由View對象提供的,也就是說不僅TextView可以使用這個屬性來進行淡入淡出動畫操作,任何繼承自View的對象都可以的。

既然alpha是這個樣子,相信大家一定已經明白了,前面我們所用的所有屬性都是這個工作原理,那么View當中一定也存在著setRotation()、getRotation()、setTranslationX()、getTranslationX()、setScaleY()、getScaleY()這些方法,不信的話你可以到View當中去找一下。

實戰-心跳動畫

先上效果圖:


自定義 View

/*** @author : zhaoyanjun* @time : 2021/7/13* @desc :*/ class MyView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {private var radius = 10f //圓的半徑set(value) {field = valueinvalidate()}private val paint = Paint()init {paint.color = Color.BLUEpaint.textSize = 8fpaint.isAntiAlias = truepaint.style = Paint.Style.FILL}override fun onDraw(canvas: Canvas?) {super.onDraw(canvas)//繪制圓canvas?.drawCircle((width / 2).toFloat(), (height / 2).toFloat(), radius, paint)} }

有一點很重要的是,radius 的 set 方法中需要調用 invalidate() 方法,才能夠刷新view

我們再看執行動畫的部分

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)var myView: MyView = findViewById(R.id.myView)//通過動畫,不斷的改變 radius 的值var objectAnimator =ObjectAnimator.ofFloat(myView, "radius", 200f, 500f, 200f)objectAnimator.duration = 600objectAnimator.interpolator = LinearInterpolator()objectAnimator.repeatCount = 20 //執行20次objectAnimator.start()} }

參考資料

  • Android屬性動畫完全解析(上),初識屬性動畫的基本用法

總結

以上是生活随笔為你收集整理的Android属性动画 ObjectAnimator的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。