Android動畫-View Animation

jopen 9年前發布 | 36K 次閱讀 Android Android開發 移動開發

視圖動畫(View Animation),又稱補間動畫(Tween Animation),即給出兩個關鍵幀,通過一些算法將給定屬性值在給定的時間內在兩個關鍵幀間漸變。本文首先講解各種基本動畫的使用,其實介紹View動畫的工作過程。

概述

視圖動畫只能作用于View對象,是對View的變換,默認支持的類型有:

  • 透明度變化(AlphaAnimation)
  • 縮放(ScaleAnimation)
  • 位移(TranslateAnimation)
  • 旋轉(RotateAnimation)
  • </ul>

    可以使用AnimationSet讓多個動畫集合在一起運行,使用插值器(Interpolator)設置動畫的速度。

    上面說到的幾種動畫,以及AnimationSet都是Animation的之類,因此Animation中有的屬性,以及xml的配置屬性,他們都有,因此,單獨說每個動畫的時候只說其特有的方法和屬性。對于使用xml配置時需要放到res下面的animation文件夾下。

    AlphaAnimation 透明度動畫

    就是改變視圖的透明度,可以實現淡入淡出等動畫。這個動畫比較簡單只需要設置開始透明度和結束透明度即可。

                 
    Animation animation = new AlphaAnimation(0.1f, 1.0f); //fromAlpha 0.1f toAlpha 1.0f


                 
    <alpha android:fromAlpha = "0.1f" android:toAlpha="1.0f" />


    ScaleAnimation 縮放

    縮放動畫,支持設置開始x縮放(寬度縮放倍數),開始y縮放, 結束x縮放,結束y縮放,以及縮放基點x坐標,縮放基點y坐標。

    x縮放和y縮放都是相對于原始的寬度和高度的,1.0表示不縮放。

    坐標基點,同時有參數可以設置坐標基點類型,分別是:

    • Animation.ABSOLUTE(默認值) 相對于控件的0點的坐標值
    • Animation.RELATIVE_TO_SELF相對于自己寬或者高的百分比(1.0表示100%)
    • Animation.RELATIVE_TO_PARENT相對于父控件的寬或者高的百分比.
    • </ul>

      默認基點是視圖的0點,默認坐標基點類型是ABSOLUTE。

      有如下幾種構造函數

                   
      ScaleAnimation(Context context, AttributeSet attrs)
      ScaleAnimation(float fromX, float toX, float fromY, float toY)
      new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f);
      ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)
      new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f, 10, 10);
      ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
      new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); //以中心點為基點


      XML配置:

                    
      <scale
      android:fromXScale="float"
      android:toXScale="float"
      android:fromYScale="float"
      android:toYScale="float"
      android:pivotX="float"
      android:pivotY="float" />


      TranslateAnimation 位移

      平移支持x軸平移起點和y軸平移起點,以及設置結束點。同時每個點都可以設置type,type和上面縮放動畫的基點類型一樣,默認類型是ABSOLUTE.

      有以下幾個構造函數:

                   
      TranslateAnimation(Context context, AttributeSet attrs)
      TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
      TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)


      XML配置:

                    
      <translate
      android:fromXDelta="float"
      android:toXDelta="float"
      android:fromYDelta="float"
      android:toYDelta="float" />


      RoatationAnimation 旋轉

      旋轉支持設置旋轉開始角度,和旋轉結束角度,以及旋轉基點,和旋轉基點類型。類型同上面一樣,默認旋轉基點是(0,0),默認類型同上面一樣,也不多說了。

                   
      RotateAnimation(Context context, AttributeSet attrs)
      RotateAnimation(float fromDegrees, float toDegrees)
      RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)
      RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)


      XML配置:

                    
      <rotate
      android:fromDegrees="float"
      android:toDegrees="float"
      android:pivotX="float"
      android:pivotY="float" />

      AnimationSet 動畫集合

      動畫集合就是可以讓多個動畫一起運行,或者依次運行。

      通過addAnimation(Animation a)向集合中添加動畫,使用子動畫的setStartOffset(long offset)設置延時,從而實現子動畫之間的間隔。可以設置是否共享時間插值器。

      xml配置:

                    
      <set>
      <!--這里寫子動畫-->
      <rotation ..../>
      <alpha ...../>
      </set>


      屬性動畫(Property Animation)

      Animation

      單獨把Animation拿出來說,是因為前面幾個都是Animation,他們有一些屬性都是從父類繼承的。包括時常,插值器,是否重復,監聽器等。

      setFillBefore(boolean)和setFillAfter(boolean)分別是動畫開始前和動畫結束后是否保持動畫狀態,默認前者為ture,后者為false;

      xml中可以配置的屬性(這些在前面幾個動畫中省略了,也是可以使用的):

                   
      android:detachWallpaper
      android:duration
      android:fillAfter
      android:fillBefore
      android:fillEnabled
      android:interpolator
      android:repeatCount
      android:repeatMode INFINTE(無限期),RESTART(重新開始,默認值)
      android:startOffset
      android:zAdjustment ZORDER_BOTTOM,ZORDER_NORMAL, ZORDER_TOP

      啟動動畫:

                   
      view.startAnimation(animation);
      //或者這樣
      view.setAnimation(animation);
      animation.start();


      Interpolator 插值器

      通過設置插值器可以改變動畫的速度,以及最終效果。
      android sdk提供了幾種默認插值器,而且這些插值器在新的protery animation上仍然可以使用,這個后面再說。

      • AccelerateDecelerateInterpolator 先加速后減速
      • AccelerateInterpolator 加速
      • AnticipateInterPolator
      • AnticipateOvershootInterpolator
      • BounceInterpolator
      • CycleInterpolator
      • LinearInterpolator
      • OvershootInterpolator
      • PathInterpolator
      • </ul>

        當然,我們也可以自定義Interpolator,一般開始值為0,結束值為1.0,然后根據算法來改變值。

        動畫原理解析

        動畫就是根據間隔時間,不停的去刷新界面,把時間分片,在那個時間片,通過傳入插值器的值到Animation.applyTransformation(),來計算當前的值(比如旋轉角度值,透明度等).

        因此,我們也可以繼承Animation,從寫applyTransformation()來實現我們的其他的動畫。

        其他

        使用view動畫時,如果需要用到類似基點類型和基點設置的,一定要注意設置對點,不然效果恨不如意。

        另外,view動畫,若動畫前view在a點,動畫過程以及動畫后,view變化了位置,則點擊點仍然在原位置,這是個大問題,特別需要注意。

        在android apidemo中,有動畫的使用,以及自定義動畫,各種插值器效果,各位可以查看,我已經將其放到github上面了,地址:https://github.com/sangmingming/Android-ApiDemos

        原文地址:http://blog.isming.me/2015/02/01/android-view-animation/,轉載請注明出處。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!