Android提供了2種動畫:
1> Tween動畫,通過對 View 的內容進行一系列的圖形變換 (包括平移、縮放、旋轉、改變透明度)來實現動畫效果。動畫效果的定義可以采用XML來做也可以采用編碼來做。Tween動畫有4種類型:AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation。
2> Frame動畫,即順序播放事先做好的圖像,跟電影類似。開發步驟:
(1)把準備好的圖片放進項目res/ drawable下。
(2)在項目的res目錄下創建文件夾anim,然后在anim文件夾下面定義動畫XML文件,文件名稱可以自定義。當然也可以采用編碼方式定義動畫效果(使用AnimationDrawable類)。
(3)為View控件綁定動畫效果。調用代表動畫的AnimationDrawable的start()方法開始動畫。
本例要實現對ImageView對象進行漸變尺寸縮放動畫效果
1> 在項目的res目錄下創建文件夾anim,然后在anim文件夾下面定義動畫XML文件,文件名稱可以自定義,如:scale.xml,內容如下:
1 <?xml version="1.0" encoding="utf-8"?>
2 <set xmlns:android="http://schemas.android.com/apk/res/android">
3 <scale android:interpolator="@android:anim/accelerate_decelerate_interpolator"
4 android:fromXScale="0.0"
5 android:toXScale="5"
6 android:fromYScale="0.0"
7 android:toYScale="5"
8 android:pivotX="50%"
9 android:pivotY="50%"
10 android:fillAfter="false"
11 android:duration="5000"
12 />
13 </set>
動畫的進度使用interpolator控制,android提供了幾個Interpolator 子類,實現了不同的速度曲線,如LinearInterpolator實現了勻速效果、Accelerateinterpolator實現了加速效果、DecelerateInterpolator實現了減速效果等。還可以定義自己的Interpolator子類,實現拋物線、自由落體等物理效果。
fromXScale(浮點型) 屬性為動畫起始時X坐標上的縮放尺寸
fromYScale(浮點型) 屬性為動畫起始時Y坐標上的縮放尺寸
toXScale(浮點型) 屬性為動畫結束時X坐標上的縮放尺寸
toYScale(浮點型) 屬性為動畫結束時Y坐標上的縮放尺寸
說明: 以上四種屬性值
0.0表示收縮到沒有
1.0表示正常無縮放
值小于1.0表示收縮
值大于1.0表示放大
pivotX(浮點型) 屬性為動畫相對于物件的X坐標的開始位置
pivotY(浮點型) 屬性為動畫相對于物件的Y坐標的開始位置
說明:
以上兩個屬性值 從0%-100%中取值
50%為物件的X或Y方向坐標上的中點位置
duration(長整型)屬性為動畫持續時間 。說明: 時間以毫秒為單位
fillAfter(布爾型)屬性當設置為true,該動畫轉化在動畫結束后被應用
2> 在layout文件添加<ImageView>節點:
1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:orientation="horizontal"
4 android:layout_width="fill_parent"
5 android:layout_height="fill_parent"
6 >
7 <ImageView
8 android:layout_width="wrap_content"
9 android:layout_height="wrap_content"
10 android:src="@drawable/icon"
11 android:id="@+id/imageView"
12 />
13 </LinearLayout>
說明:除了可以對<ImageView>實現動畫效果,其實也可以對其他View實現動畫效果,如:<TextView>
3>在Activity里對ImageView使用前面定義好的動畫效果:
1 public class AnimationActivity extends Activity {
2 @Override
3 public void onCreate(Bundle savedInstanceState) {
4 super.onCreate(savedInstanceState);
5 setContentView(R.layout.main);
6 ImageView imageView = (ImageView)this.findViewById(R.id.imageView);
7 //加載動畫XML文件,生成動畫指令
8 Animation animation = AnimationUtils.loadAnimation(this, R.anim.scale);
9 //開始執行動畫
10 imageView.startAnimation(animation);
11 }
12 }
13
備注:上面采用的是xml文件定義動畫效果,作為代替,也可以采用編碼方式實現。下面采用編碼方式實現上述例子同樣的效果:
1 public class AnimationActivity extends Activity {
2 @Override
3 public void onCreate(Bundle savedInstanceState) {
4 super.onCreate(savedInstanceState);
5 setContentView(R.layout.main);
6 ImageView imageView = (ImageView)this.findViewById(R.id.imageView);
7 ScaleAnimation animation = new ScaleAnimation(0.0f, 5f, 0.0f, 5f,
8 Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
9 animation.setDuration(5000); //設置持續時間5秒
10 imageView.startAnimation(animation);
11 }
12 }
===================== Frame動畫例子 ===============================
(1)把準備好的圖片放進項目res/ drawable下。
圖片有:girl_1.gif, girl_2.gif, girl_3.gif
(2)在項目的res目錄下創建文件夾anim,然后在anim文件夾下面定義動畫XML文件,文件名稱可以自定義,如:frame.xml。
1 <?xml version="1.0" encoding="utf-8"?>
2 <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
3 android:oneshot="false">
4 <item android:drawable="@drawable/girl_1" android:duration="200" />
5 <item android:drawable="@drawable/girl_2" android:duration="200" />
6 <item android:drawable="@drawable/girl_3" android:duration="200" />
7 </animation-list>
上面的XML就定義了一個Frame動畫,其包含3幀動畫,3幀動畫中分別應用了drawable中的3張圖片:girl_1.gif, girl_2.gif, girl_3.gif,每幀動畫持續200毫秒。android:oneshot屬性如果為true,表示動畫只播放一次停止在最后一幀上,如果設置為false表示動畫循環播放。
(3)為View控件綁定動畫效果,調用代表動畫的AnimationDrawable的start()方法開始動畫。
1 public class FrameActivity extends Activity {
2 private AnimationDrawable animationDrawable;
3 @Override
4 public void onCreate(Bundle savedInstanceState) {
5 super.onCreate(savedInstanceState);
6 setContentView(R.layout.main);
7 ImageView imageView = (ImageView)this.findViewById(R.id.imageView);
8 imageView.setBackgroundResource(R.anim.frame);
9 animationDrawable = (AnimationDrawable) imageView.getBackground();
10 }
11 @Override
12 public boolean onTouchEvent(MotionEvent event) {
13 if (event.getAction() == MotionEvent.ACTION_DOWN) {//按下
14 animationDrawable.start();
15 return true;
16 }
17 return super.onTouchEvent(event);
18 }
19 }
有一點需要強調的是:啟動Frame動畫的代碼animationDrawable.start();不能應用在OnCreate()方法中,因為在OnCreate()中 AnimationDrawable還沒有完全的與ImageView綁定。在OnCreate()中啟動動畫,只能看到第一張圖片。這里在拖曳事件中實現的。