国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android 屬性動畫原理與DataBinding

2019-12-12 03:08:21
字體:
來源:轉載
供稿:網友

Android 屬性動畫原理與DataBinding

看到這個標題的時候你可能會有疑問,屬性動畫和 DataBinding 之間有什么關系?我個人理解的是:它們內部的實現思想有相似之處。這篇文章主要對 Android 屬性動畫的知識通過文字進行整理記錄,內容參考于《Android開發藝術探索》,在最后會給出我如此理解屬性動畫和 DataBinding 的原因。

Android動畫概述:

Android 的動畫可以分為三種:View 動畫、幀動畫和屬性動畫,View 動畫通過對場景里的對象不斷做圖像變化(平移、縮放、旋轉、透明度)從而產生動畫效果,View 動畫支持自定義。幀動畫通過順序播放一系列圖像產生動畫效果,可以簡單理解為圖片切換動畫,圖片過大會導致 OOM。屬性動畫通過動態的改變對象的屬性從而達到動畫效果,屬性動畫為API 11的新特性,在低版本需要通過兼容庫來使用它。

屬性動畫:

屬性動畫可以對任意對象的屬性進行動畫而不僅僅是 View,在一個時間間隔內可以完成對象從一個屬性值到另一個屬性值的改變。因此屬性動畫幾乎是無所不能的,只要對象有這個屬性,它都能實現動畫效果。、

使用:

屬性動畫中有 ValueAnimator 、ObjectAnimator 和 AnimatorSet 等概念,其中 ObjectAnimator 繼承自 ValueAnimator,用來是實現一個屬性動畫,AnimatorSet 是動畫集合,可以定義一組動畫,它們使用起來是及其簡單的,在此不再舉例。屬性動畫除了通過代碼實現以外,同View動畫一樣,也可以通過XML來定義,屬性動畫需要定義在res/animator目錄下,其中的 set、objectAnimator 和 animator 標簽分別對應 AnimatorSet、ObjectAnimator 和 ValueAnimator 。盡管屬性動畫可以通過XML來實現,但在實際開發中往往會采用代碼來實現,因為很多時候一個屬性的起始值是無法提前確定的。

插值器和估值器:

TimeInterpolator 譯為時間插值器,它的作用是根據時間流逝的百分比來計算出當前屬性值改變的百分比,系統預置的有 LinearInterpolator (線性插值器:勻速動畫)、 AccelerateDecelerateInterpolator (加速減速插值器:動畫兩頭慢中間快)和 DecelerateInterpolator (減速插值器:動畫越來越慢)等。

TypeEvaluator 譯為類型估值算法,也叫估值器,它的作用是根據當前屬性改變的百分比來計算改變后的屬性值,系統預置的有 IntEvaluator (針對整型屬性)、 FloatEvaluator (針對浮點型屬性)和ArgbEvaluator (針對 Color 屬性)。屬性動畫中的插值器( Interpolator )和估值器( TypeEvaluator )很重要,它們是實現非勻速動畫的重要手段。

屬性動畫的監聽器:

屬性動畫提供了監聽器來監聽動畫的播放過程,主要有AnimatorUpdateListenerAnimatorListener 。AnimatorListener 可以監聽動畫的開始、結束、取消以及重復播放 ,同時為了方便開發,系統還提供了 AnimatorListenerAdapter 這個類,他是 AnimatorListener 的適配器類, 可以有選擇的實現這四個監聽方法。AnimatorUpdateListener 比較特殊,他會監聽整個動畫過程, 動畫是由許多幀組成的,每播放一幀對應監聽方法就會被調用一次。

對任意屬性做動畫:

屬性動畫可以對任意屬性添加動畫效果,假如我們要給一個 button 加一個動畫,讓這個 button 的寬度增加 100px,我們可能會這樣寫:

@Overridepublic void onClick(View v){   ObjectAnimator.ofInt(v,"width",100).setDuration(1000).start();}

但是當點擊按鈕后并沒有效果,不是說好的可以對任意屬性實現動畫嘛,其實沒效果是對的,下面分析屬性動畫的原理:屬性動畫要求動畫作用的對象提供該屬性的 get 和 set 方法,屬性動畫根據外界傳遞的該屬性的初始值和最終值,以動畫的效果多次去調用 set 方法,每次傳遞給 set 方法的值都不一樣,確切的來說是隨著時間的推移,所傳遞的值越來越接近最終值。總結一下,我們對 object 的屬性 abc 做動畫,如果想讓動畫生效,要同時滿足以下兩個條件:

1.object 必須提供 setAbc 方法,如果動畫的時候沒有傳遞初始值,那么還要提供 getAbc 方法,因為系統要去取 abc 屬性的初始值(若這條不滿足,程序直接 Crash)

2.object 的 setAbc 對屬性 abc 所做的改變必須能夠通過某種方法反映出來,比如會帶來 UI 的改變之類的(如果這條不滿足,動畫無效果但不會Crash)

這跟 DataBinding 中的思想是一樣的,這里的object對應于DataBinding中的 ViewModel,ViewModel 的成員變量 set 方法中需要提醒 DataBinding 去更新 view 的內容,如下:

  public void setName(String name) {    this.name = name;    notifyPropertyChanged(BR.name);  }

針對以上問題,官方文檔告訴我們有3種解決方法:

  1. 給你的對象加上 get 和 set 方法,如果有權限的話
  2. 用一個類來包裝原始對象,間接為其提供 get 和 set 方法
  3. 采用 ValueAnimator,監聽動畫過程,自己實現屬性的改變

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 闽侯县| 肃宁县| 军事| 怀来县| 慈利县| 东兴市| 寻乌县| 连山| 安岳县| 龙井市| 全州县| 尼木县| 额敏县| 金昌市| 若尔盖县| 温泉县| 鹰潭市| 阳原县| 古浪县| 鹤壁市| 根河市| 英德市| 临安市| 富顺县| 财经| 万源市| 洛川县| 合作市| 江西省| 佛坪县| 牟定县| 开化县| 海淀区| 河北省| 永年县| 沙河市| 沙河市| 健康| 黔江区| 安义县| 高青县|