Android開發之View動畫

YungFan發表於2017-12-13

Android動畫主要分為3種

  • View動畫
  • 幀動畫
  • 屬性動畫

何為View動畫?

View動畫主要是對View物件進行變換所達到的動畫效果,如平移、縮放、旋轉和透明度等,下面寫個簡單案例。

動畫檔案

首先在res目錄下新建一個anim資料夾,然後新建4個動畫檔案,如下:

動畫檔案.PNG
然後在Activity佈局中放入一張圖片:

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/football"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/football" />
</RelativeLayout>
複製程式碼

Activity程式碼

    private ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        img = (ImageView) findViewById(R.id.football);

    }
複製程式碼

1、平移動畫

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate
        android:duration="3000" 
        android:fromXDelta="0"  //x的起始值
        android:fromYDelta="0"  //y的起始值
        android:toXDelta="400" //x的結束值
        android:toYDelta="400" /> //y的結束值

</set>
複製程式碼

android:fromXDelta:x的起始值 android:toXDelta:x的結束值 android:fromYDelta:y的起始值 android:toYDelta:y的結束值

核心程式碼

private void translateAnim() {
        Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.translateanim);
        img.startAnimation(animation);
    }
複製程式碼

測試執行

translate.gif

2、縮放動畫

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <scale
        android:duration="3000"
        android:fromXScale="0.5"
        android:fromYScale="0.5"
        android:toXScale="1.0"
        android:toYScale="1.0" />

</set>
複製程式碼

android:fromXScale:水平方向縮放的起始值 android:toXScale:水平方向縮放的結束值 android:fromYScale:垂直方向縮放的起始值 android:toYScale:垂直方向縮放的結束值

核心程式碼

private void scaleAnim() {
        Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.scaleanim);
        img.startAnimation(animation);
    }
複製程式碼

測試執行

scale.gif

3、旋轉動畫

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

    <rotate
        android:duration="3000"
        android:fromDegrees="0"
        android:toDegrees="360" />


</set>
複製程式碼

android:fromDegrees:旋轉開始的角度 android:toDegrees:旋轉結束的角度

核心程式碼

private void roteteAnim() {
        Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.rotateanim);
        img.startAnimation(animation);
    }
複製程式碼

測試執行

rotate.gif

4、透明度動畫

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">

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

</set>
複製程式碼

android:fromAlpha:起始透明度 android:toAlpha:結束透明度

核心程式碼

private void alphaAnim() {
        Animation animation = AnimationUtils.loadAnimation(MainActivity.this, R.anim.alphaanim);
        img.startAnimation(animation);
    }
複製程式碼

測試執行

alpha.gif

注意點

1、動畫集合 <set xmlns:android="http://schemas.android.com/apk/res/android"> 中可以設定一些屬性值,重要屬性說明:

  • android:interpolator:動畫集合插值器,主要影響動畫的速度,預設為加速減速插值器,還有線性插值器、減速插值器等等
  • android:shareInterpolator:動畫集合中的動畫是否與幾何共享同一個插值器
  • android:duration:動畫集合執行時間
  • android:fillAfter:動畫結束以後View是否停在結束位置,預設是false不停留,但是該屬性需要設定在動畫集合中才有效果,設在單獨的動畫中是無效的

2、View動畫並沒有真正改變View的位置,也就是說就算你看到了動畫最終停留在了某個位置,它的真身還是在原來的位置,有點像神話小說的元神出竅,所以使用的時候要特別注意,如給Button設定點選事件,就會發現新位置的Button並不會出發click事件,原始位置卻能響應,不知道原因的同學肯定入坑~~

相關文章