個人Android開發之旅(二):Android三種動畫效果的淺入之View動畫

前言

在Android中動畫能夠分爲3種:View動畫、幀動畫和屬性動畫。View動畫從名字就能夠大體知道,View動畫是對View作圖形變換(平移、縮放、旋轉、透明度)從而產生動畫效果,而且View動畫支持自定義。幀動畫是經過順序播放一系列的圖片從而產生的動畫效果。屬性動畫是在API11(Android3.0)引進的動畫效果,它是經過動態地改變對象的屬性從而達到動畫效果。php

View動畫

View動畫的做用對象是View,它支持4種動畫效果,分別是平移、縮放、旋轉、透明度動畫。View動畫的四種動畫效果對應着Animation類的四個子類: TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation。這4種動畫便可以經過XML來定義,也能經過Java代碼來動態建立。對於View動畫來講,推薦使用XML來定義,可讀性高。java

名稱 標籤 子類 效果
平移動畫 < translate > TranslateAnimation 移動View
縮放動畫 < scale > ScaleAnimation 放大或縮小View
旋轉動畫 < rotate > RotateAnimation 旋轉View
透明度動畫 < alpha > AlphaAnimation 改變View的透明度

在這裏插入圖片描述

Animation類

在實現動畫效果以前,先講一下Animation類,它是一個抽象類,能夠應用於視圖、表面或其餘對象的動畫。 Animation一些經常使用的方法:android

Animation類經常使用的方法 做用
reset() 重置Animation的初始化
cancel() 取消Animation動畫
start() 開始Animation動畫
setAnimationListener() 給當前Animation設置動畫監聽
hasStarted() 判斷當前Animation是否開始
hasEnded() 判斷當前Animation是否結束

View類對Animation的經常使用方法:git

方法 做用
startAnimation(Animation animation) 對當前View開始設置的Animation動畫
clearAnimation() 取消當View在執行的Animation動畫

Animation經常使用的屬性:api

xml屬性 java方法 做用
android:duration setDuration(long) 動畫持續時間,毫秒爲單位
android:fillAfter setFillAfter(boolean) 控件動畫結束時是否保持動畫最後的狀態
android:fillBefore setDuration(long) 動畫持續時間,毫秒爲單位
android:duration setFillBefore(boolean) 控件動畫結束時是否還原到開始動畫前的狀態
android:ShareInterpolator setInterpolator(Interpolator) 設定插值器(指定的動畫效果,譬如回彈等)
android:startOffset setStartOffset(long) 調用start函數以後等待開始運行的時間,單位爲毫秒

上面的表格中涉及到 插值器 。那麼什麼是插值器呢?官方的註釋解釋道:插值器定義了動畫的變化率。這容許基本的動畫效果(透明,縮放,平移,旋轉)被加速,減速,重複等。 app

插值器介紹
經過上圖能夠看到,官方定義了一個插值器的接口,這就意味着咱們能夠本身定義或是用官方提供的插值器,官方提供的插值器以下:

xml java 做用
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator 其變化開始和結束速率較慢,中間加速
AccelerateInterpolator @android:anim/accelerate_interpolator 其變化開始速率較慢,後面加速
DecelerateInterpolator @android:anim/decelerate_interpolator 其變化開始速率較快,後面減速
LinearInterpolator @android:anim/linear_interpolator 其變化速率恆定
AnticipateInterpolator @android:anim/anticipate_interpolator 其變化開始向後甩,而後向前
AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator 其變化開始向後甩,而後向前甩,過沖到目標值,最後又回到了終值
OvershootInterpolator @android:anim/overshoot_interpolator 其變化開始向前甩,過沖到目標值,最後又回到了終值
BounceInterpolator @android:anim/bounce_interpolator 其變化在結束時反彈
CycleInterpolator @android:anim/cycle_interpolator 循環播放,其速率爲正弦曲線
TimeInterpolator 一個接口,能夠自定義插值器

1. 平移動畫

平移的動畫效果用到了 TranslateAnimation 類,TranslateAnimation屬性以下:ide

xml屬性 java方法 做用
android:fromXDelta TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) 起始點X軸座標,數值,百分比,百分比p
android:toXDelta TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) 結束點X軸座標,數值,百分比,百分比p
android:fromYDelta TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) 起始點Y軸座標,這裏能夠是數值,百分比,百分比p
android:toYDelta TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) 結束點Y軸座標,這裏能夠是數值,百分比,百分比p

數值、百分數、百分數p,譬如50表示以當前View左上角座標加50px爲初始點、50%表示以當前View的左上角加上當前View寬高的50%作爲初始點、50%p表示以當前View的左上角加上父控件寬高的50%作爲初始點。若是不太明白,能夠本身動手試試,看看效果。函數

首先要建立XML文件,咱們須要在res下新建anim文件夾,接着在anim下建立animation resource file的xml文件,而後新建一個 translate_anim.xml 佈局

在這裏插入圖片描述
編輯 translate_anim.xml 文件以下:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000">
    <translate android:fromXDelta="0" android:toXDelta="0" android:fromYDelta="0" android:toYDelta="800"/>
</set>
複製代碼

接着咱們打開 activity_main.xml 文件,添加 Button 和 TextView。 Button 用來開啓動畫效果, TextView 用來顯示動畫效果。動畫

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" tools:context=".MainActivity">

    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:gravity="center" android:orientation="horizontal">

        <Button android:id="@+id/btnTranslation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="向下平移" />
        
    </LinearLayout>

    <TextView android:id="@+id/tvAnimation" android:layout_width="200dp" android:layout_height="50dp" android:background="#2196F3" android:gravity="center" android:text="動畫效果" />

</LinearLayout>
複製代碼

佈局設置好以後咱們再到 MainActivity.java 文件中給 btnTranslation 添加點擊事件,實現向下平移的效果。

這裏我推薦你們用 ButterKnife 經過註解的方式綁定 View 就不須要 findByid() 了,配合插件(butterknife-zelezny)控件的綁定和點擊事件代碼一鍵生成,提升你的工做效率,美滋滋。

/** * @author Leung * @date 2020/4/16 16:52 */
public class MainActivity extends AppCompatActivity {

    @BindView(R.id.tvAnimation)
    TextView tvAnimation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    @OnClick(R.id.btnTranslation)
    public void onViewClicked(View view) {
        // 方法一:經過xml方式實現動畫效果
        Animation animation = null;
        switch (view.getId()) {
            case R.id.btnTranslation:
                animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);
                break;
            default:
        }
        tvAnimation.startAnimation(animation);
// // 方法二:經過代碼動態的實現動畫效果
// TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, 800);
// translateAnimation.setDuration(2000);
// tvAnimation.startAnimation(translateAnimation);
    }
}
複製代碼

動畫效果:

向下平移效果

2. 縮放動畫

縮放的動畫效果用到了 ScaleAnimation 類,ScaleAnimation屬性以下:

xml屬性 java方法 做用
android:fromXScale ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY) X軸開始的縮放比例,1.0表示無變化
android:toXScale ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY) X軸結束的縮放比例
android:fromYScale ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY) Y軸開始的縮放比例,1.0表示無變化
android:toYScale ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY) Y軸結束的縮放比例
android:pivotX ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY) X軸的縮放起始點(當對象改變大小時,這個點保持不變)==這裏能夠是數值,百分比,百分比p==
android:pivotY ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY) Y軸的縮放起始點(當對象改變大小時,這個點保持不變)==這裏能夠是數值,百分比,百分比p==

數值、百分數、百分數p,譬如50表示以當前View左上角座標加50px爲初始點、50%表示以當前View的左上角加上當前View寬高的50%作爲初始點、50%p表示以當前View的左上角加上父控件寬高的50%作爲初始點。若是不太明白,能夠本身動手試試,看看效果。

縮放動畫效果的建立也是同樣,這裏我就不詳細說明了,建立 scale_anim.xml 和 修改 activity_main.xml、MainActivity.java ,代碼以下:

scale_anim.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000">
    <scale android:fromXScale="1.0" android:toXScale="2.0" android:fromYScale="1.0" android:toYScale="2.0" android:pivotX="50%" android:pivotY="50%"/>

</set>
複製代碼

activity_main.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" tools:context=".MainActivity">

    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:gravity="center" android:orientation="horizontal">

        <Button android:id="@+id/btnTranslation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="向下平移" />

        <Button android:id="@+id/btnScale" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="縮放動畫" />
    </LinearLayout>

    <TextView android:id="@+id/tvAnimation" android:layout_width="200dp" android:layout_height="50dp" android:background="#2196F3" android:gravity="center" android:text="動畫效果" />

</LinearLayout>
複製代碼

MainActivity.java 文件

/** * @author Leung * @date 2020/4/16 16:52 */
public class MainActivity extends AppCompatActivity {

    @BindView(R.id.tvAnimation)
    TextView tvAnimation;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
    }

    @OnClick({R.id.btnTranslation, R.id.btnScale})
    public void onViewClicked(View view) {
        // 方法一:經過xml方式實現動畫效果
        Animation animation = null;
        switch (view.getId()) {
            case R.id.btnTranslation:
                animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);
                break;
            case R.id.btnScale:
                animation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);
            default:
        }
        tvAnimation.startAnimation(animation);
        // 方法二:經過代碼動態的實現動畫效果
// TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, 800);
// translateAnimation.setDuration(2000);
// tvAnimation.startAnimation(translateAnimation);
// ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f, tvAnimation.getWidth() / 2, tvAnimation.getHeight() / 2);
// scaleAnimation.setDuration(2000);
// tvAnimation.startAnimation(scaleAnimation);
    }
}
複製代碼

動畫效果:

縮放動畫效果

3. 旋轉動畫

旋轉的動畫效果用到了 RotateAnimation 類,RotateAnimation屬性以下:

xml屬性 java方法 做用
android:fromDegrees RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) 動畫開始時的角度,正數表明順時針,負數表明逆時針
android:toDegrees RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) 動畫結束時的角度,正數表明順時針,負數表明逆時針
android:pivotX RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) X軸的旋轉起始點,==這裏能夠是數值,百分比,百分比p==
android:pivotY RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY) Y軸的旋轉起始點,==這裏能夠是數值,百分比,百分比p==

rotate_anim.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000">
    <rotate android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%"/>
</set>
複製代碼

activity_main.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" tools:context=".MainActivity">

    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:gravity="center" android:orientation="horizontal">

        <Button android:id="@+id/btnTranslation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="向下平移" />

        <Button android:id="@+id/btnScale" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="縮放動畫" />

        <Button android:id="@+id/btnRotate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="旋轉動畫" />
    </LinearLayout>

    <TextView android:id="@+id/tvAnimation" android:layout_width="200dp" android:layout_height="50dp" android:background="#2196F3" android:gravity="center" android:text="動畫效果" />

</LinearLayout>
複製代碼

MainActivity.java 文件

@OnClick({R.id.btnTranslation, R.id.btnScale, R.id.btnRotate})
    public void onViewClicked(View view) {
        // 方法一:經過xml方式實現動畫效果
        Animation animation = null;
        switch (view.getId()) {
            case R.id.btnTranslation:
                animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);
                break;
            case R.id.btnScale:
                animation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);
                break;
            case R.id.btnRotate:
                animation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);
                break;
            default:
        }
        tvAnimation.startAnimation(animation);
        // 方法二:經過代碼動態的實現動畫效果
// TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, 800);
// translateAnimation.setDuration(2000);
// tvAnimation.startAnimation(translateAnimation);
// ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f, tvAnimation.getWidth() / 2, tvAnimation.getHeight() / 2);
// scaleAnimation.setDuration(2000);
// tvAnimation.startAnimation(scaleAnimation);
// RotateAnimation rotateAnimation = new RotateAnimation(0, 360, tvAnimation.getWidth() / 2, tvAnimation.getHeight() / 2);
// rotateAnimation.setDuration(2000);
// tvAnimation.startAnimation(rotateAnimation);
    }
複製代碼

動畫效果:

旋轉動畫效果

4. 透明動畫

透明的動畫效果用到了 AlphaAnimation 類,AlphaAnimation屬性以下:

xml屬性 java方法 做用
android:fromAlpha AlphaAnimation(float fromAlpha, float toAlpha) 動畫開始時的透明度(範圍:0.0-1.0,1.0不透明,0.0全透明)
android:toAlpha AlphaAnimation(float fromAlpha, float toAlpha) 動畫結束時的透明度(範圍:0.0-1.0,1.0不透明,0.0全透明)

alpha_anim.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="2000">
    <alpha android:fromAlpha="1" android:toAlpha="0"/>
</set>
複製代碼

activity_main.xml 文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" tools:context=".MainActivity">

    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:gravity="center" android:orientation="horizontal">

        <Button android:id="@+id/btnTranslation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="向下平移" />

        <Button android:id="@+id/btnScale" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="縮放動畫" />

        <Button android:id="@+id/btnRotate" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="旋轉動畫" />

        <Button android:id="@+id/btnAlpha" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="透明動畫" />
    </LinearLayout>

    <TextView android:id="@+id/tvAnimation" android:layout_width="200dp" android:layout_height="50dp" android:background="#2196F3" android:gravity="center" android:text="動畫效果" />

</LinearLayout>
複製代碼

MainActivity.java 文件

@OnClick({R.id.btnTranslation, R.id.btnScale, R.id.btnRotate, R.id.btnAlpha})
    public void onViewClicked(View view) {
        // 方法一:經過xml方式實現動畫效果
        Animation animation = null;
        switch (view.getId()) {
            case R.id.btnTranslation:
                animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);
                break;
            case R.id.btnScale:
                animation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);
                break;
            case R.id.btnRotate:
                animation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);
                break;
            case R.id.btnAlpha:
                animation = AnimationUtils.loadAnimation(this, R.anim.alpha_anim);
                break;
            default:
        }
        tvAnimation.startAnimation(animation);
        // 方法二:經過代碼動態的實現動畫效果
// TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, 800);
// translateAnimation.setDuration(2000);
// tvAnimation.startAnimation(translateAnimation);
// ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f, tvAnimation.getWidth() / 2, tvAnimation.getHeight() / 2);
// scaleAnimation.setDuration(2000);
// tvAnimation.startAnimation(scaleAnimation);
// RotateAnimation rotateAnimation = new RotateAnimation(0, 360, tvAnimation.getWidth() / 2, tvAnimation.getHeight() / 2);
// rotateAnimation.setDuration(2000);
// tvAnimation.startAnimation(rotateAnimation);
// AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
// alphaAnimation.setDuration(2000);
// tvAnimation.setAnimation(alphaAnimation);
    }
複製代碼

動畫效果:

透明動畫效果

AnimationSet 動畫集合

相信你們對4個動畫效果的使用有初步的瞭解了,那麼如今你可能會問:若是我想把4是個動畫效果集成在一塊兒呢?應該如何實現? 若是你有細心觀察的話,會發現咱們在建立完一個 animation resource file的xml文件以後打開會發現有個 < set >標籤,表示動畫集合,對應 AnimationSet類,有多個動畫構成。

AnimationSet類繼承自Animation類,是上面四種的組合容器管理類,沒有本身特有的屬性,他的屬性繼承自Animation類。當咱們對set標籤使用Animation類的屬性時會對該標籤下的全部子控件都產生影響。譬如咱們在set標籤下加入duration=「1000」,子控件的duration屬性會失效。

那麼咱們如今把剛剛學到的4個動畫效果集成在一塊兒,看看會是什麼樣子的。

  1. 新建一個 animation resource file 的xml文件 ,命名爲 set_anim.xml,這裏我給動畫集合時間設置了4秒,還添加了一個開始速率較快,後面減速的插值器:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:duration="4000" android:shareInterpolator="@android:anim/decelerate_interpolator">
    <!-- 向下平移 -->
    <translate android:fromXDelta="0" android:toXDelta="0" android:fromYDelta="0" android:toYDelta="800"/>
    <!-- 縮小控件 -->
    <scale android:fromXScale="1.0" android:toXScale="0.0" android:fromYScale="1.0" android:toYScale="0.0" android:pivotX="50%" android:pivotY="50%"/>
    <!-- 旋轉360度 -->
    <rotate android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%"/>
    <!-- 逐漸透明 -->
    <alpha android:fromAlpha="1" android:toAlpha="0"/>
</set>
複製代碼
  1. 在界面中添加一個控件,用於控制動畫效果:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout...>

    <LinearLayout...>

    <Button android:id="@+id/btnSet" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="動畫集合"/>

    <TextView android:id="@+id/tvAnimation" android:layout_width="200dp" android:layout_height="50dp" android:background="#2196F3" android:gravity="center" android:text="動畫效果" />

</LinearLayout>
複製代碼
  1. 給btnSet添加點擊事件:
@OnClick({R.id.btnTranslation, R.id.btnScale, R.id.btnRotate, R.id.btnAlpha, R.id.btnSet})
    public void onViewClicked(View view) {
        // 方法一:經過xml方式實現動畫效果
        Animation animation = null;
        switch (view.getId()) {
            case R.id.btnTranslation:
                animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);
                break;
            case R.id.btnScale:
                animation = AnimationUtils.loadAnimation(this, R.anim.scale_anim);
                break;
            case R.id.btnRotate:
                animation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);
                break;
            case R.id.btnAlpha:
                animation = AnimationUtils.loadAnimation(this, R.anim.alpha_anim);
                break;
            case R.id.btnSet:
                animation = AnimationUtils.loadAnimation(this, R.anim.set_anim);
            default:
        }
        tvAnimation.startAnimation(animation);
        // 方法二:經過代碼動態的實現動畫效果
// TranslateAnimation translateAnimation = new TranslateAnimation(0, 0, 0, 800);
// ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 0.0f, 1.0f, 0.0f, tvAnimation.getWidth() / 2, tvAnimation.getHeight() / 2);
// RotateAnimation rotateAnimation = new RotateAnimation(0, 360, tvAnimation.getWidth() / 2, tvAnimation.getHeight() / 2);
// AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.0f);
// AnimationSet animationSet = new AnimationSet(true);
// animationSet.setDuration(4000);
// animationSet.setInterpolator(new DecelerateInterpolator());
// animationSet.addAnimation(translateAnimation);
// animationSet.addAnimation(scaleAnimation);
// animationSet.addAnimation(rotateAnimation);
// animationSet.addAnimation(alphaAnimation);
// tvAnimation.startAnimation(animationSet);
    }
複製代碼
  • 動畫效果:
    動畫集合效果

自定義View動畫

系統提供的4種動畫效果已經能夠知足絕大部分的動畫效果了,但有特殊要求,咱們也是能夠自定義View動畫效果的。那麼如何自定義View動畫效果呢?咱們從前面的Animation類的介紹瞭解到,它是一個抽象類,咱們只須要繼承它,並覆寫它的initialize和applyTransformation方法。在initialize中作初始化工做,在applyTransformation中作相應的矩陣變換(須要用到Camera來簡化矩陣的變化過程),須要用到數學知識。這裏參考了 Android 的 apidemo 中自定義View動畫 Rotate3dAnimation。Rotate3dAnimation 能夠圍繞Y軸旋轉而且同時沿着Z軸平移從而實現一種相似3D的效果。具體的代碼和使用能夠參考這篇文章:翻牌(翻轉)動畫-Rotate3dAnimation的應用

補充

  • 在動畫效果執行完成以後,並無改變View的位置。如,我左上角有一個Button,我把往下平移,並保持動畫結束後的狀態,此時你再點擊左上角Button位置時,依舊能響應Button的點擊事件。而你點擊平移後的Button是沒有任何反應的。

  • 在進行動畫的時候,儘可能使用dp,由於px會致使適配問題。

  • 項目代碼下載地址:碼雲

相關文章
相關標籤/搜索