1. 程式人生 > >Android——View動畫

Android——View動畫

補間動畫

  • 漸變
  • 縮放
  • 平移
  • 旋轉
Java類 XML標籤 效果
AlphaAnimation alpha 讓透明度漸變
ScaleAnimation scale 放大或縮小
TranslateAnimation translate 移動位置
RotateAnimation rotate 繞某一點旋轉

兩種使用方式

  • 第一種:

1、在res中新建anim資料夾,建立xml動畫檔案,如:res/anim/anim_test.xml
2、在java檔案中用這個xml檔案生成Animation類
3、呼叫View的startAnimation來啟動動畫

  • 第二種:

直接在Java檔案中new一個 Animation 的子類,然後呼叫View的startAnimation啟動動畫

final RotateAnimation animation = new RotateAnimation(0, 180, 50, 50);
animation.setDuration(2000);

btnRun.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ivIc.startAnimation(animation);
    }
});

一般推薦使用XML來寫補間動畫,有以下好處

  • xml檔案以配置的形式,讓動畫看起來更直觀,可讀性強
  • 一個動畫檔案可以被多個View使用,重用性強
  • 便於更換動畫,更換一個View的動畫只要更換load的xml檔案就行

Animation的屬性

四個子類獨有的屬性不多,大部分是繼承父類Animation的,所以先看Animation的屬性

Animation的屬性 含義
android:detachWallpaper 針對Window的動畫屬性。當一個window在桌面上動畫時,是否讓桌面桌布跟著動畫,預設是false
android:duration 動畫執行的時間
android:fillAfter 如果為true,那麼動畫執行完就會定格在執行完的那個畫面,不會恢復到原位
android:interpolator 設定插值器,來控制動畫在不同時間段的速度。預設是加速減速插值器
android:repeatCount 動畫重複的次數,所以總共會執行的動畫次數是這個重複次數+1
android:repeatMode 動畫重複的方式,有兩個值,reverse和restart。reverse表示動畫會正反輪流執行,restart會正方向一直執行
android:startOffset 動畫延遲執行的時間,單位是毫秒
android:zAdjustment 可以取三個值,normal:0,top:1,bottom:-1.代表可以在動畫過程中調整z軸的順序。

AlphaAnimation的獨有屬性

AlphaAnimation的獨有屬性 含義
android:fromAlpha 動畫開始時的透明度,從0-1,0表示完全透明,1表示完全不透明
android:toAlpha 動畫結束時的透明度

5秒從全透明變成完全不透明

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="5000">
    <alpha
        android:fromAlpha="0"
        andorid:toAlpha />
</set>

ScaleAnimation的獨有屬性

ScaleAnimation的獨有屬性 含義
android:pivotX 縮放原點的x軸座標,縮放圍繞這個點執行,預設是View的左上角(0, 0)
android:pivotY 縮放原點的y軸座標,XML中的值有三種寫法,數值:50;百分數:50%;百分數p:50%p。如果是數值,表示以View的左上角為(0, 0),然後加上數值,以這個點為縮放中心。如果是百分數,表示加上自身高度的50%,作為所放電。如果是百分數p,如50%p,表示加上父控制元件高度的50%,作為所放電
android:fromXScale 動畫開始時,X軸上縮放的比例。1表示本身大小
android:fromYScale 動畫開始時,Y軸上縮放的比例。1表示本身大小
android:toXScale 動畫結束時,X軸上縮放的比例。1表示本身大小
android:toYScale 動畫結束時,Y軸上縮放的比例。1表示本身大小

從圖片的右下角縮放,寬高各從原來的2倍縮放到原來的十分之一

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000">
    <scale
        android:pivotX="100%"
        andorid:pivotY="100%"
        andorid:fromXScale="2"
        android:fromYScale="2"
        android:toXScale="0.1"
        android:toYScale="0.1" />
</set>

TranslateAnimation的獨有屬性

TranslateAnimation的獨有屬性 含義
android:fromXDelta 動畫開始時,View左上角的X座標,也有三種寫法,同pivotX
android:fromYDelta 動畫開始時,View左上角的Y座標,也有三種寫法,同pivotX
android:toXDelta 動畫結束時,View左上角的X座標,也有三種寫法,同pivotX
android:toYDelta 動畫結束時,View左上角的Y座標,也有三種寫法,同pivotX

從自身的左上角移到自身的右下角

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000">
    <translate
        andorid:fromXDelta="-100%"
        android:fromYDelta="-100%"
        android:toXDelta="100%"
        android:toYDelta="100%" />
</set>

RotateAnimation的獨有屬性

RotateAnimation的獨有屬性 含義
android:pivotX 旋轉動畫的中心的X座標,旋轉圍繞這個點進行,也有三種寫法
android:pivotY 旋轉動畫的中心的Y座標,旋轉圍繞這個點進行,也有三種寫法
android:fromDegrees 動畫開始時的旋轉角度,順序針轉增加,逆時針轉減少,360度為一圈
android:toDegrees 動畫結束時的旋轉角度

從360度轉到-90度

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000">
    <rotate
        andorid:pivotX="50%"
        android:pivotY="50%"
        android:fromDegrees="360"
        android:toDegrees="-90" />
</set>

組合動畫

旋轉的同時,改變透明度

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="3000">
    <rotate
        andorid:pivotX="50%"
        android:pivotY="50%"
        android:fromDegrees="360"
        android:toDegrees="-90" />
    <alpha
        android:fromAlpha="1"
        android:toAlpha="0.2" />
</set>

插值器

AnimationSet(動畫集合類)可以設定集合中的動畫是否共享同一個插值器

//true or false
android:shareInterpolator

Interpolator

Interpolator繼承自 TimeInterpolator ,用來定義動畫在不同的時間有不同的速度,也叫插補器。
插值器可以在xml檔案中用 android:interpolator 設定,也可以在java中通過 animation.setInterpolator 來設定
在java中設定可以傳一些引數,對插值器進行更詳細的設定,比較靈活。

插值器 XML中的值 作用
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator 加速減速插值器,動畫先加速,再減速
AccelerateInterpolator @android:anim/accelerate_interpolator 加速插值器
DecelerateInterpolator @android:anim/decelerate_interpolator 減速插值器
BounceInterpolator @android:anim/bounce_interpolator 回彈插值器,動畫結束會回彈幾下
CycleInterpolator @android:anim/cycle_interpolator 圓插值器,動畫會重複幾次,速度沿著正弦曲線變化
LinearInterpolator @android:anim/linear_interpolator 線性插值器,保持勻速
AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator 預期超調插值器,動畫開始時往前甩一下,動畫結束時往後甩一下
AnticipateInterpolator @android:anim/anticipate_interpolator 預期插值器,動畫開始時會往前甩一下
OvershootInterpolator @android:anim/overshoot_interpolator 超調插值器,動畫結束時往後甩一下

對View動畫的監聽

AnimationListener提供對動畫開始,重複和結束的監聽

animation.setAnimationListener(new Animation.AnimationListener(){
    @Override
    public void onAnimationStart(Animation animation) {
        Log.i(TAG, "動畫開始時的操作");
    }
    
    @Override
    public void onAnimationRepeat(Animation animation) {
        Log.i(TAG, "動畫重複時的操作");
    }
    
    @Override
    public void onAnimationEnd(Animation animation) {
        Log.i(TAG, "動畫結束時的操作");
    }
});