AnimationDrawable 代表動(dòng)畫資源。Android 既支持逐幀動(dòng)畫,也支持補(bǔ)間動(dòng)畫。
定義補(bǔ)間動(dòng)畫的 XML 資源文件以 <set> 元素作為根元素,該元素可以設(shè)定如下 4 個(gè)元素:
- alpha:透明度;
- scale:縮放;
- translate:位移;
- rotate:旋轉(zhuǎn)。
定義動(dòng)畫的 XML 資源文件應(yīng)該放在 /res/anim 路徑下。
<set>、<alpha>、<scale>、<translate>、<rotate> 都可以指定 android:interpolator 屬性,該屬性指定動(dòng)畫的變化速度,可以實(shí)現(xiàn)勻速、正加速、負(fù)加速、無規(guī)則變加速等,Android 系統(tǒng)的 R.anim 對(duì)象中包含了定制常量,它們定義了不同的動(dòng)畫速度,例如:
- linear_interpolator: 勻速
- accelerate_interpolator: 加速
- decelerate_interpolator: 減速
如果程序需要讓 <set> 元素下的所有變換效果使用相同的動(dòng)畫速度,則可以指定 android:shareInterpolator="true"。
我們可以通過兩張方式訪問動(dòng)畫資源文件:
- 在 XML 中
@[<package_name>:]anim/file_name
- 在 Java 中
[<package_name.>]R.anim.file_name
下面是一個(gè)簡(jiǎn)單的使用示例:
首先是自定義的 test_anim01.xml 文件的代碼:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/linear_interpolator"
android:duration="5000"
>
<scale android:fromXScale="1.0"
android:toXScale="1.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="true"
android:duration="2000"
/>
<translate android:fromXDelta="10"
android:toXDelta="130"
android:fromYDelta="30"
android:toYDelta="-80"
android:duration="2000"
/>
</set>
之后是主布局文件的代碼:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorGray"
android:orientation="vertical"
android:gravity="center_horizontal"
>
<ImageView
android:id="@+id/imageAnim"
android:layout_width="400dp"
android:layout_height="400dp"
android:scaleType="fitCenter"
android:src="@drawable/img07"
android:layout_marginTop="20dp"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/start"
android:onClick="start"
/>
</LinearLayout>
接下來是主程序文件的源代碼:
package com.toby.personal.testlistview;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
public class MainActivity extends AppCompatActivity {
final private static String TAG = "Toby_Test";
private ImageView imageView;
private Animation animation;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.imageAnim);
animation = AnimationUtils.loadAnimation(this, R.anim.test_anim01);
animation.setFillAfter(true);
}
public void start(View view) {
imageView.startAnimation(animation);
}
}
本示例的運(yùn)行效果,各位可以自行運(yùn)行測(cè)試,如果出現(xiàn)運(yùn)行不了等問題,可以給我留言。本文參考文獻(xiàn):《瘋狂Android講義(第2版)》