成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

App開發中三種動畫使用和屬性詳解

移動開發 Android
幀動畫是順序播放一組預先定義好的圖片,不同于View動畫,系統提供了另外一個類AnimationDrawable來使用幀動畫.

[[437158]]

本文轉載自微信公眾號「Android開發編程」,作者Android開發編程。轉載本文請聯系Android開發編程公眾號。

前言

這次我們介紹一下android中動畫的分類:

View Animation(補間動畫);

Drawable Animation(幀動畫);

Property Animation(屬性動畫);

一、幀動畫

幀動畫是順序播放一組預先定義好的圖片,不同于View動畫,系統提供了另外一個類AnimationDrawable來使用幀動畫;

幀動畫顧名思義就是通過順序一幀一幀播放圖片從而產生動畫效果,效果類似放電影;

該動畫缺點比較明顯,就是如果圖片過大過多會導致OOM。幀動畫xml文件放置在drawable目錄下而非anim文件夾下;

幀動畫的使用

首先我們找一組幀動畫的圖片放入drawable-xhdpi文件夾下,其次在drawable文件夾下創建xml文件,如下所示:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <animation-list 
  3.     xmlns:android="http://schemas.android.com/apk/res/android" 
  4.     android:oneshot="false"
  5.     <item android:drawable="@drawable/refresh1" android:duration="180"/> 
  6.     <item android:drawable="@drawable/refresh2" android:duration="180"/> 
  7.     ... 
  8.     <item android:drawable="@drawable/refresh25" android:duration="180"/> 
  9. </animation-list> 
  10. view = findViewById(R.id.test); 
  11.         view.setBackgroundResource(R.drawable.drawable_test_anim); 
  12.         view.setOnClickListener(new View.OnClickListener() { 
  13.             @Override 
  14.             public void onClick(View v) { 
  15.                 AnimationDrawable animationDrawable = (AnimationDrawable) view.getBackground(); 
  16.                 animationDrawable.start(); 
  17.             } 
  18.         }); 

屬性介紹

  • <animation-list> 必須是根節點,包含一個或者多個<item>元素,屬性有:
  • android:oneshot true代表只執行一次,false循環執行;
  • <item> 類似一幀的動畫資源;
  • <item> animation-list的子項,包含屬性如下:
  • android:drawable 一個frame的Drawable資源;
  • android:duration 一個frame顯示多長時間;

二、補間動畫

補間動畫是通過對view進行旋轉、縮放、漸變、透明度變化,而達到的一種動畫效果;

是一種漸進式動畫。并且可以通過組合以上四種操作,完成復雜的自定義動畫效果;

缺點就是只是改變的view的展示狀態,但是不會改變view的位置;

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:duration="4000" 
  4.     android:fillAfter="true" 
  5.     android:fillBefore="true" 
  6.     android:interpolator="@[package:]anim/interpolator_resource" 
  7.     android:repeatMode="restart | reverse" 
  8.     android:repeatCount = “0” 
  9.     android:shareInterpolator="true" 
  10.     android:startOffset="float"
  11.     <alpha 
  12.         android:fromAlpha="float" 
  13.         android:toAlpha="float" /> 
  14.     <scale 
  15.         android:fromXScale="float" 
  16.         android:fromYScale="float" 
  17.         android:pivotX="float" 
  18.         android:pivotY="float" 
  19.         android:toXScale="float" 
  20.         android:toYScale="float" /> 
  21.     <rotate 
  22.         android:fromDegrees="float" 
  23.         android:pivotX="float" 
  24.         android:pivotY="float" 
  25.         android:toDegrees="float" /> 
  26.     <translate 
  27.         android:fromXDelta="float" 
  28.         android:fromYDelta="float" 
  29.         android:toXDelta="float" 
  30.         android:toYDelta="float" /> 
  31. </set

 

通用屬性說明:

  • android:duration=""動畫時長,單位毫秒
  • android:fillAfter="true"動畫完成后是否停留在結束位置,默認false
  • android:fillBefore="true"動畫完成后是否停留在起點位置。默認true,優先級低于fillAfter
  • android:interpolator為動畫的變化速度【可以單獨設置,可以直接放在set里面】
  • android:repeatMode="restart | reverse"動畫重復策略 restart從起點位置(正序)重復,reverse從結束位置(倒序)重復
  • android:repeatCount = “0”重復次數 “infinite”為無線重復
  • android:shareInterpolator="true"動畫集合中的動畫是否公用一個差值器
  • android:startOffset="float"動畫延遲時間

透明度動畫

  • 透明度動畫,通過改變view的透明度展示動畫。對應AlphaAnimation和xml標簽
  • android:fromAlpha="float" 起始透明度,取值范圍(-1.0~1.0)
  • android:toAlpha="float"結束時透明度,取值范圍(-1.0~1.0)

縮放動畫

  • 縮放動畫,通過修改view的大小展示動畫。對應ScaleAnimation類和xml表情
  • android:fromXScale="float"動畫在水平方向X的起始縮放倍數
  • android:fromYScale="float"動畫在水平方向Y的結束縮放倍數
  • android:toXScale="float"動畫在豎直方向X的結束縮放倍數
  • android:toYScale="float"動畫在豎直方向Y的結束縮放倍數
  • android:pivotX="float"縮放中心點的x坐標
  • android:pivotY="float"縮放中心點的y坐標

旋轉動畫

  • 通過旋轉view展示動畫。對應RotateAnimation類和xml標簽
  • android:fromDegrees="float"動畫開始時 視圖的旋轉角度(正數 = 順時針,負數 = 逆時針)
  • android:toDegrees="float"動畫結束時 視圖的旋轉角度(正數 = 順時針,負數 = 逆時針)
  • android:pivotX="float"旋轉中心點的x坐標 具體如上縮放中心點參數解釋
  • android:pivotY="float"旋轉中心點的y坐標 具體如上縮放中心點參數解釋

平移動畫

  • 平移動畫,更改view的展示位置展示動畫。對應TranslateAnimation類和 xml表情
  • android:fromXDelta="float"view在水平x方向的起始值
  • android:fromYDelta="float"view在水平y方向的起始值
  • android:toXDelta="float"view在水平x方向的結束值
  • android:toYDelta="float" view在水平y方向的結束值

具體動畫的使用

應用動畫xml配置

  1. TextView textDemo = findViewById(R.id.text_demo); 
  2. Animation animation = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.rotate_animation_test); 
  3. textDemo.startAnimation(animation); 

使用java類配置動畫,具體參數類同xml參數,建議使用xml配置動畫

  1. AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 2.0f); 
  2. textDemo.startAnimation(alphaAnimation); 

監聽動畫

  1. alphaAnimation.setAnimationListener(new Animation.AnimationListener() { 
  2.     @Override 
  3.     public void onAnimationStart(Animation animation) { 
  4.         //動畫開始回調 
  5.     } 
  6.     @Override 
  7.     public void onAnimationEnd(Animation animation) { 
  8.         //動畫結束回調 
  9.     } 
  10.     @Override 
  11.     public void onAnimationRepeat(Animation animation) { 
  12.         //動畫重復時回調 
  13.     } 
  14. }); 

三、屬性動畫

屬性動畫本質是通過改變對象的屬性(例如:x,y等屬性),來實現動畫的,所以基本上是無所不能的,只要對象有這個屬性,就能實現動畫效果;

屬性動畫是在api 11的新特性,通過動態的改變view的屬性從而達到動畫效果。雖然可以使用nineoldandroid庫向下兼容,但是兼容本質是使用補間動畫完成,也就是說不會更改view的屬性,也不會更改view的位置;

屬性動畫比較常用的類:ValueAnimator、ObjectAnimator、AnimationSet,其中ObjectAnimator是ValueAnimator的子類,而AnminationSet是動畫集合;

1.單個動畫

  1. ObjectAnimator animator = ObjectAnimator 
  2.         .ofInt(textDemo, "backgroundColor", 0XffFF0000, 0Xff0000FF) 
  3.         .setDuration(2000); 
  4. animator.setRepeatMode(ValueAnimator.RESTART); 
  5. animator.setRepeatCount(10); 
  6. animator.start(); 

2.動畫集合

  1. AnimatorSet animatorSet = new AnimatorSet(); 
  2. ValueAnimator translationX = ObjectAnimator.ofFloat(textDemo, "translationX", 200f); 
  3. ValueAnimator animator = ObjectAnimator 
  4.         .ofInt(textDemo, "backgroundColor", 0XffFF0000, 0Xff0000FF); 
  5. animatorSet.playTogether(translationX,animator); 
  6. animatorSet.setDuration(1000).start(); 

動畫配置同樣可以使用xml配置;

3.差值器和估值器

差值器(Interpolator)

根據時間流逝百分比計算當前屬性改變百分比。同xml配置動畫中的 android:interpolator屬性配置,常見有LinearInterpolator(線性差值器)、AccelerateDecelerateInterpolator(加速減速差值器)等。自定義需要實現Interpolator或者TimeInterpolator。Interpolator接口繼承TimeInterpolator;

  1. // Interpolator接口 
  2. public interface Interpolator extends TimeInterpolator{  
  3.     // 內部只有一個方法 
  4.      float getInterpolation(float input) {   
  5.          // 參數說明 
  6.          // input值值變化范圍是0-1,且隨著動畫進度(0% - 100% )均勻變化 
  7.         // 即動畫開始時,input值 = 0;動畫結束時input = 1 
  8.         // 而中間的值則是隨著動畫的進度(0% - 100%)在0到1之間均勻增加 
  9.       ...// 插值器的計算邏輯 
  10.       return xxx; 
  11.       // 返回的值就是用于估值器繼續計算的fraction值,下面會詳細說明 
  12.     }   
  13. // TimeInterpolator接口 
  14. // 同上 
  15. public interface TimeInterpolator {   
  16.     float getInterpolation(float input);   

估值器(TypeEvaluator)

根據當前屬性改變百分比計算改變后的屬性值。屬性動畫特有的屬性;自定義估值器需要實現TypeEvaluator接口;

  1. public interface TypeEvaluator {   
  2.     public Object evaluate(float fraction, Object startValue, Object endValue) {   
  3. // 參數說明 
  4. // fraction:插值器getInterpolation()的返回值 
  5. // startValue:動畫的初始值 
  6. // endValue:動畫的結束值 
  7.         ....// 估值器的計算邏輯 
  8.         return xxx; 
  9.         // 賦給動畫屬性的具體數值 
  10.         // 使用反射機制改變屬性變化 

可以對任意屬性做屬性動畫,屬性動畫要求動畫作用的對象提供該屬性的get()和set()方法。因為屬性動畫本質就是根據外界傳遞的對象屬性的初始值和終點值,然后根據估值器和差值器計算屬性值,不斷調用屬性的set方法,通過時間的推移所傳遞的值,越來越近終點值;

注意:

對象屬性必須提供對應的set方法,而且如果沒有初始值傳入的情況下必須要設置get方法,因為 系統要獲取初始值,如果沒有滿足條件則程序cash;

對象屬性的set方法對屬性做出改變,需要能夠通過某種方法表示出來。帶來ui展示效果的改變。否則動畫不會生效;

ValueAnimator

使用ValueAnimator通過監聽動畫過程,自己改變對象屬性完成動畫

  1. ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100); 
  2.         valueAnimator.setDuration(2000);//動畫持續時間 
  3.         valueAnimator.setRepeatCount(0);//重復次數 
  4.         valueAnimator.setRepeatMode(ValueAnimator.REVERSE);//重復方式, 
  5.         valueAnimator.setStartDelay(20);//開始前延遲時間 
  6.         valueAnimator.setEvaluator(new IntEvaluator());//估值器 
  7.         valueAnimator.setInterpolator(new LinearInterpolator());//差值器 
  8.         valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
  9.             @Override 
  10.             public void onAnimationUpdate(ValueAnimator animation) { 
  11.                 //獲取當前動畫屬性值,即1~100 
  12.                 Integer animatedValue = (Integer) animation.getAnimatedValue(); 
  13.                 //獲取動畫的百分比 
  14.                 float animatedFraction = animation.getAnimatedFraction(); 
  15.                 ViewGroup.LayoutParams layoutParams = textView.getLayoutParams(); 
  16.                 int width = layoutParams.width; 
  17.                 int height = layoutParams.height; 
  18.                 layoutParams.height = height + 1; 
  19.                 layoutParams.width=width+1; 
  20.                 Log.e(TAG,"animatedValue: "+animatedValue+" animatedFraction : "+animatedFraction 
  21.                 +" width : "+layoutParams.width+" height : "+layoutParams.height); 
  22.                 textView.requestLayout(); 
  23.             } 
  24.         }); 
  25.         valueAnimator.start(); 
  26.     } 

四、注意事項

OOM注意,在幀動畫中如果圖片過大、數量過多容易出現;

內存泄漏, 切記在activity銷毀時,停止動畫。否則一些無限循環動畫將導致activity不能釋放而內存泄漏。出現在屬性動畫中,view動畫不存在此類問題;

View動畫即補間動畫,是改變view的視覺位置,改變view的影像展示位置,而不改變真實位置;注意交互體驗。可能會出現view動畫結束后,view無法隱藏的問題及setVisibility(View.GONE)失效。此時調用view.clearAnimation()清除動畫。可修復此類問題;

總結

公眾號里面是系統的總結,但是要系統學習一類的知識點了,又不是很好;

 

于是就想寫個小冊-掘金小冊,這樣老鐵們就可以系統的學習某個知識點了;

 

責任編輯:武曉燕 來源: Android開發編程
相關推薦

2011-08-01 18:42:40

分區維度物化視圖

2024-07-16 14:15:09

2018-01-17 15:02:28

VMware網絡連接

2012-03-26 12:23:25

JavaSwing

2017-01-05 16:19:12

C++正則表達式

2024-02-26 13:47:00

C#Socket數據接收

2009-06-09 16:53:22

Java Swing處理方法比較

2009-07-01 17:22:05

連接字符串

2021-07-10 10:01:37

Python簡單函數

2021-03-17 09:59:26

Python函數調用

2024-04-11 12:57:55

Python函數

2009-12-01 09:18:22

Linux版本

2021-11-23 10:30:35

Android技術代碼

2010-04-02 13:15:01

Oracle跟蹤

2024-04-25 12:49:22

2013-06-17 17:08:47

Windows PhoWP開發共享數據方式

2022-06-20 08:50:16

TypeScript類型語法

2010-04-26 12:19:28

Oracle 數據庫

2023-10-28 16:25:17

濾波C++

2013-12-18 15:45:33

多核
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久9久| 成人精品一区亚洲午夜久久久 | 久久国产精品久久久久久 | 免费国产一区二区 | 国产成人精品一区二区三 | 日本激情视频中文字幕 | 玖玖视频免费 | 美女在线观看av | 久久久精品综合 | 碰碰视频 | 日本一二区视频 | 国产一区久久久 | 天天爱爱网| 久久国产精品免费视频 | 色综合一区二区三区 | 国产免费人成xvideos视频 | 国产精品99久久久精品免费观看 | 男人的天堂久久 | 亚洲精品免费观看 | www.中文字幕.com | 国产精品伦一区二区三级视频 | 你懂的在线视频播放 | 中文字幕一区二区三区四区五区 | 日韩中文字幕在线视频观看 | 国产国产精品久久久久 | 日韩靠逼 | 日韩成人久久 | 激情视频中文字幕 | 国产免费a | 中国大陆高清aⅴ毛片 | 精品日韩 | 日韩av在线免费 | www亚洲精品| 亚洲高清一区二区三区 | 亚洲国产精品久久 | 国产午夜视频 | 国产精品美女www爽爽爽 | 亚洲激情网站 | 国产一区二区精品 | 91精品久久久久久久久久入口 | a视频在线观看 |