亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

android的2種Animation模式配置

系統 1854 0

關于動畫的實現,Android提供了Animation,在Android SDK介紹了2種Animation模式:

1. Tween Animation:通過對場景里的對象不斷做圖像變換(平移、縮放、旋轉)產生動畫效果,即是一種漸變動畫;

2. Frame Animation:順序播放事先做好的圖像,是一種畫面轉換動畫。

動畫類型

下面先來看看Android提供的動畫類型。Android的animation由四種類型組成

在XML文件中:

  • alpha??????? 漸變透明度動畫效果
  • scale??????? 漸變尺寸伸縮動畫效果
  • translate? 畫面轉換位置移動動畫效果
  • rotate????? 畫面轉移旋轉動畫效果

在Java 源碼中定義了相應的類,可以使用這些類的方法來獲取和操作相應的屬性:

  • AlphaAnimation漸變透明度動畫效果
  • ScaleAnimation漸變尺寸伸縮動畫效果
  • TranslateAnimation畫面轉換位置移動動畫效果
  • RotateAnimation畫面轉移旋轉動畫效果

image

Tween Animation

一個tween動畫將對視圖對象中的內容進行一系列簡單的轉換(位置,大小,旋轉,透明性)。如果你有一個文本視圖對象,你可以移動它,旋轉它,讓它變大或讓它變小,如果文字下面還有背景圖像,背景圖像也會隨著文件進行轉換。

使用XML來定義Tween Animation

動畫的XML文件在工程中 res/anim 目錄,這個文件必須包含一個根元素,可以使<alpha><scale> <translate> <rotate>插值元素或者是把上面的元素都放入 <set> 元素組中,默認情況下,所以的動畫指令都是同時發生的,為了讓他們按序列發生,需要設置一個特殊的屬性startOffset。動畫的指令定義了你想要發生什么樣的轉換,當他們發生了,應該執行多長時間,轉換可以是連續的也可以使同時的。例如,你讓文本內容從左邊移動到右邊,然后旋轉180度,或者在移動的過程中同時旋轉,沒個轉換需要設置一些特殊的參數(開始和結束的大小尺寸的大小變化,開始和結束的旋轉角度等等,也可以設置些基本的參數(例如,開始時間與周期),如果讓幾個轉換同時發生,可以給它們設置相同的開始時間,如果按序列的話,計算開始時間加上其周期。

Tween Animation共同的節點屬性

屬性[類型] 功能 備注
Duration[long] 屬性為動畫持續時間 時間以毫秒為單位
fillAfter [boolean] 當設置為true ,該動畫轉化在動畫結束后被應用
fillBefore[boolean] 當設置為true ,該動畫轉化在動畫開始前被應用

interpolator

指定一個動畫的插入器 有一些常見的插入器
accelerate_decelerate_interpolator
加速-減速 動畫插入器
accelerate_interpolator
加速-動畫插入器
decelerate_interpolator
減速- 動畫插入器
其他的屬于特定的動畫效果
repeatCount[int] 動畫的重復次數 ?
RepeatMode[int] 定義重復的行為 1:重新開始? 2:plays backward
startOffset[long] 動畫之間的時間間隔,從上次動畫停多少時間開始執行下個動畫
zAdjustment[int] 定義動畫的Z Order的改變 0:保持Z Order不變
1:保持在最上層
-1:保持在最下層

表二

XML節點 功能說明
alpha 漸變透明度動畫效果
<alpha
android:fromAlpha=”0.1″
android:toAlpha=”1.0″
android:duration=”3000″ />
fromAlpha

屬性為動畫起始時透明度

0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之間的float數據類型的數字

duration為動畫持續時間,ms單位

toAlpha

屬性為動畫結束時透明度

表三

scale 漸變尺寸伸縮動畫效果
<scale
android:interpolator= “@android:anim/accelerate_decelerate_interpolator”
android:fromXScale=”0.0″
android:toXScale=”1.4″
android:fromYScale=”0.0″
android:toYScale=”1.4″
android:pivotX=”50%”
android:pivotY=”50%”
android:fillAfter=”false”
android:startOffset=“700”
android:duration=”700″
android:repeatCount=”10″ />
fromXScale[float] fromYScale[float] 為動畫起始時,X、Y坐標上的伸縮尺寸 0.0表示收縮到沒有
1.0表示正常無伸縮
值小于1.0表示收縮
值大于1.0表示放大
toXScale [float]
toYScale[float]
為動畫結束時,X、Y坐標上的伸縮尺寸
pivotX[float]
pivotY[float]
為動畫相對于物件的X、Y坐標的開始位置 屬性值說明:從0%-100%中取值,50%為物件的X或Y方向坐標上的中點位置
? ? ? ?

表四

translate 畫面轉換位置移動動畫效果
<translate
android:fromXDelta=”30″
android:toXDelta=”-80″
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ />
fromXDelta
toXDelta
為動畫、結束起始時 X坐標上的位置 ?
fromYDelta
toYDelta
為動畫、結束起始時 Y坐標上的位置 ?
? ? ? ?

表五

rotate 畫面轉移旋轉動畫效果
<rotate
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
android:fromDegrees=”0″
android:toDegrees=”+350″
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000″ />
fromDegrees 為動畫起始時物件的角度 說明
當角度為負數——表示逆時針旋轉
當角度為正數——表示順時針旋轉
(負數from——to正數:順時針旋轉)
(負數from——to負數:逆時針旋轉)
(正數from——to正數:順時針旋轉)
(正數from——to負數:逆時針旋轉)
toDegrees 屬性為動畫結束時物件旋轉的角度 可以大于360度
pivotX
pivotY
為動畫相對于物件的X、Y坐標的開始位 說明:以上兩個屬性值 從0%-100%中取值
50%為物件的X或Y方向坐標上的中點位置

下面給出一個完整的XML定義(SDK提供)

    
      <
    
    
      set
    
    
      android
    
    :
    
      shareInterpolator
    
    =
    
      "false"
    
    
      xmlns
    
    :
    
      android
    
    =
    
      "http://schemas.android.com/apk/res/android"
    
    
      >
    
    
      <
    
    
      scale
    
    
      android
    
    :
    
      interpolator
    
    =
    
      "@android:anim/accelerate_decelerate_interpolator"
    
    
      android
    
    :
    
      fromXScale
    
    =
    
      "1.0"
    
    
      android
    
    :
    
      toXScale
    
    =
    
      "1.4"
    
    
      android
    
    :
    
      fromYScale
    
    =
    
      "1.0"
    
    
      android
    
    :
    
      toYScale
    
    =
    
      "0.6"
    
    
      android
    
    :
    
      pivotX
    
    =
    
      "50%"
    
    
      android
    
    :
    
      pivotY
    
    =
    
      "50%"
    
    
      android
    
    :
    
      fillAfter
    
    =
    
      "false"
    
    
      android
    
    :
    
      duration
    
    =
    
      "700"
    
    
      />
    
    
      <
    
    
      set
    
    
      android
    
    :
    
      interpolator
    
    =
    
      "@android:anim/decelerate_interpolator"
    
    
      >
    
    
      <
    
    
      scale
    
    
      android
    
    :
    
      fromXScale
    
    =
    
      "1.4"
    
    
      android
    
    :
    
      toXScale
    
    =
    
      "0.0"
    
    
      android
    
    :
    
      fromYScale
    
    =
    
      "0.6"
    
    
      android
    
    :
    
      toYScale
    
    =
    
      "0.0"
    
    
      android
    
    :
    
      pivotX
    
    =
    
      "50%"
    
    
      android
    
    :
    
      pivotY
    
    =
    
      "50%"
    
    
      android
    
    :
    
      startOffset
    
    =
    
      "700"
    
    
      android
    
    :
    
      duration
    
    =
    
      "400"
    
    
      android
    
    :
    
      fillBefore
    
    =
    
      "false"
    
    
      />
    
    
      <
    
    
      rotate
    
    
      android
    
    :
    
      fromDegrees
    
    =
    
      "0"
    
    
      android
    
    :
    
      toDegrees
    
    =
    
      "-45"
    
    
      android
    
    :
    
      toYScale
    
    =
    
      "0.0"
    
    
      android
    
    :
    
      pivotX
    
    =
    
      "50%"
    
    
      android
    
    :
    
      pivotY
    
    =
    
      "50%"
    
    
      android
    
    :
    
      startOffset
    
    =
    
      "700"
    
    
      android
    
    :
    
      duration
    
    =
    
      "400"
    
    
      />
    
    
      </
    
    
      set
    
    
      >
    
    
      </
    
    
      set
    
    
      >
    
  

Tween Animation如何使用

使用AnimationUtils類的靜態方法loadAnimation()來加載XML中的動畫XML文件

      
        //main.xml中的ImageView
      
      
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);

      
        //加載動畫
      
      
Animation hyperspaceJumpAnimation =AnimationUtils.loadAnimation(
      
        this
      
      , R.anim.hyperspace_jump);

      
        //使用ImageView顯示動畫
      
      
spaceshipImage.startAnimation(hyperspaceJumpAnimation);
    

如何在Java代碼中定義動畫

    
      //在代碼中定義 動畫實例對象 
    
    
      private
    
     Animation myAnimation_Alpha; 


    
      private
    
     Animation myAnimation_Scale; 


    
      private
    
     Animation myAnimation_Translate; 


    
      private
    
     Animation myAnimation_Rotate; 

    
    
      //根據各自的構造方法來初始化一個實例對象 
    
    

myAnimation_Alpha=
    
      new
    
     AlphaAnimation(0.1f, 1.0f); 

myAnimation_Scale =
    
      new
    
     ScaleAnimation(0.0f, 1.4f, 0.0f, 1.4f, 

             Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 

myAnimation_Translate=
    
      new
    
     TranslateAnimation(30.0f, -80.0f, 30.0f, 300.0f); 

myAnimation_Rotate=
    
      new
    
     RotateAnimation(0.0f, +350.0f,

 Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF, 0.5f);

  

interpolator的解釋

interpolator定義一個動畫的變化率(the rate of change)。這使得基本的動畫效果(alpha, scale, translate, rotate)得以加速,減速,重復等。

?

AccelerateDecelerateInterpolator 在動畫開始與介紹的地方速率改變比較慢,在中間的時候加速
AccelerateInterpolator 在動畫開始的地方速率改變比較慢,然后開始加速
CycleInterpolator 動畫循環播放特定的次數,速率改變沿著正弦曲線
DecelerateInterpolator 在動畫開始的地方速率改變比較慢,然后開始減速
LinearInterpolator 在動畫的以均勻的速率改變

?

XML屬性 說明
drawable 當前幀引用的drawable資源
duration 當前幀顯示的時間(毫秒為單位)
oneshot 如果為true,表示動畫只播放一次停止在最后一幀上,如果設置為false表示動畫循環播放。
variablePadding If true, allows the drawable’s padding to change based on the current state that is selected.
visible 規定drawable的初始可見性,默認為flase;

?

AnimationDrawable

獲取、設置動畫的屬性 ?
int getDuration() 獲取動畫的時長
int getNumberOfFrames() 獲取動畫的幀數
boolean isOneShot()

?

Void setOneShot(boolean oneshot)

獲取oneshot屬性
設置oneshot屬性
void inflate(Resurce r,XmlPullParser p,
AttributeSet attrs)
?
增加、獲取幀動畫
Drawable getFrame(int index) 獲取某幀的Drawable資源
void addFrame(Drawable frame,int duration) 為當前動畫增加幀(資源,持續時長)
動畫控制
void start() 開始動畫
void run() 外界不能直接掉調用,使用start()替代
boolean? isRunning() 當前動畫是否在運行
void stop() 停止當前動畫

下面就給個具體的XML例子,來定義一幀一幀的動畫:

    
      <animation-list
    
    
    
    
      xmlns:android
    
    
      =
    
    
      "http://schemas.android.com/apk/res/android"
    
    
      
??? 
    
    
      android:oneshot
    
    
      =
    
    
      "true"
    
    
      >
    
    
      
??? 
    
    
      <item
    
    
    
    
      android:drawable
    
    
      =
    
    
      "@drawable/rocket_thrust1"
    
    
    
    
      android:duration
    
    
      =
    
    
      "200"
    
    
    
    
      />
    
    
      
??? 
    
    
      <item
    
    
    
    
      android:drawable
    
    
      =
    
    
      "@drawable/rocket_thrust2"
    
    
    
    
      android:duration
    
    
      =
    
    
      "200"
    
    
    
    
      />
    
    
      
??? 
    
    
      <item
    
    
    
    
      android:drawable
    
    
      =
    
    
      "@drawable/rocket_thrust3"
    
    
    
    
      android:duration
    
    
      =
    
    
      "200"
    
    
    
    
      />
    
    
    
    
      </animation-list>
    
  

上面的XML就定義了一個Frame Animation,其包含3幀動畫,3幀動畫中分別應用了drawable中的3張圖片:rocket_thrust1,rocket_thrust2,rocket_thrust3,每幀動畫持續200毫秒。

然后我們將以上XML保存在 res/anim/文 件夾下,命名為rocket_thrust.xml,顯示動畫的代碼:

    
      AnimationDrawable
    
    
       rocketAnimation
    
    
      ;
    
    
    
    
      public
    
    
    
    
      void
    
    
       onCreate
    
    
      (
    
    
      Bundle
    
    
       savedInstanceState
    
    
      )
    
    
    
    
      {
    
    
      
? 
    
    
      super
    
    
      .
    
    
      onCreate
    
    
      (
    
    
      savedInstanceState
    
    
      );
    
    
      
? setContentView
    
    
      (
    
    
      R
    
    
      .
    
    
      layout
    
    
      .
    
    
      main
    
    
      );
    
    
      

? 
    
    
      ImageView
    
    
       rocketImage 
    
    
      =
    
    
    
    
      (
    
    
      ImageView
    
    
      )
    
    
       findViewById
    
    
      (
    
    
      R
    
    
      .
    
    
      id
    
    
      .
    
    
      rocket_image
    
    
      );
    
    
      
? rocketImage
    
    
      
        .
      
      
        setBackgroundResource
      
    
    
      (
    
    
      R
    
    
      .
    
    
      anim
    
    
      .
    
    
      rocket_thrust
    
    
      );
    
    
      
? rocketAnimation 
    
    
      =
    
    
    
    
      (
    
    
      AnimationDrawable
    
    
      )
    
    
      
         rocketImage
      
      
        .
      
      
        getBackground
      
    
    
      ();
    
    
    
    
      }
    
    
    
    
      public
    
    
    
    
      boolean
    
    
       onTouchEvent
    
    
      (
    
    
      MotionEvent
    
    
    
    
      event
    
    
      )
    
    
    
    
      {
    
    
      
? 
    
    
      if
    
    
    
    
      (
    
    
      event
    
    
      .
    
    
      getAction
    
    
      ()
    
    
    
    
      ==
    
    
    
    
      MotionEvent
    
    
      .
    
    
      ACTION_DOWN
    
    
      )
    
    
    
    
      {
    
    
      
??? 
      
        rocketAnimation
      
    
    
      
        .
      
      
        start
      
      
        ();
      
    
    
      
??? 
    
    
      return
    
    
    
    
      true
    
    
      ;
    
    
      
? 
    
    
      }
    
    
      
? 
    
    
      return
    
    
    
    
      super
    
    
      .
    
    
      onTouchEvent
    
    
      (
    
    
      event
    
    
      );
    
    
    
    
      }
    
  

代碼運行的結果:3張圖片按照順序的播放一次.

有一點需要強調的是:啟動Frame Animation動畫的代碼rocketAnimation.start();不能在OnCreate()中,因為在OnCreate()中AnimationDrawable還沒有完全的與ImageView綁定,在OnCreate()中啟動動畫,就只能看到第一張圖片。這里實在拖曳事件中實現的。

下面,閱讀Android SDK中對AnimationDrawable的介紹,有個簡單的了解:

?

Frame Animation

Frame Animation是順序播放事先做好的圖像,跟電影類似。不同于animation package, Android SDK提供了另外一個類AnimationDrawable來定義、使用Frame Animation。

Frame Animation可以在XML Resource定義(還是存放到 res\anim 文件夾下),也可以使用 AnimationDrawable中的API定義 。由于Tween Animation與Frame Animation有著很大的不同,因此XML定義的格式也完全不一樣,其格式是: 首先是animation-list根節點,animation-list根節點中包含多個item子節點,每個item節點定義一幀動畫,當前幀的drawable資源和當前幀持續的時間。 下面對節點的元素加以說明: ?

Interpolator 定義了動畫的變化速度,可以實現勻速、正加速、負加速、無規則變加速等。Interpolator 是基類,封裝了所有 Interpolator 的共同方法,它只有一個方法,即 getInterpolation (float input),該方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation。Android 提供了幾個 Interpolator 子類,實現了不同的速度曲線,如下:

android的2種Animation模式配置


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日韩a级片视频 | 国产精品久久久久久久久久日本 | 久久网免费视频 | 99视频精品免费99在线 | 久久这里只有精品视频99 | 亚洲国产精品综合久久2007 | 国产美女a做受大片在线观看 | 国产毛片一区二区三区 | 一级毛片www| 很狠操| 日本伊人精品一区二区三区 | 国产成人一区二区三区免费观看 | 亚洲人人草| 国产三级做爰在线观看∵ | 色播影音 | 国产成年 | 天天射天天干天天 | 伊人久久在线观看 | 亚洲图片色图 | 91尤物视频在线观看 | 久久久久99| 天天亚洲综合 | 香蕉视频网站在线观看 | 国产护士资源总站 | 国产日韩欧美精品在线 | 四虎免费播放观看在线视频 | 特黄特级a级黄毛片免费观看多人 | 亚洲国产精品久久久天堂麻豆 | 久久久久久久影院 | 黄色成人在线播放 | 色之综合网| 99精品视频在线视频免费观看 | 久久久久夜色精品波多野结衣 | 亚洲精品久久久久午夜 | 亚洲第一成人在线 | 天天色天天舔 | 亚洲夂夂婷婷色拍ww47 | 日韩欧美一二区 | 五月激情综合网 | 久久精品这里热有精品 | 国产九九在线观看播放 |