提供了三種動畫效果:逐幀動畫(frame-by-frame animation),這種動畫和GIF一樣,一幀一幀的顯示來組成動畫效果;佈局動畫(layout animation),這種動畫用來設置layout內的所有UI控件;控件動畫(view animation),這種是應用到具體某個view上的動畫。
- <animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
- <item android:drawable="@drawable/qq001" android:duration="80"/>
- <item android:drawable="@drawable/qq002" android:duration="80"/>
- <item android:drawable="@drawable/qq003" android:duration="80"/>
- <item android:drawable="@drawable/qq004" android:duration="80"/>
- <item android:drawable="@drawable/qq005" android:duration="80"/>
- <item android:drawable="@drawable/qq006" android:duration="80"/>
- <item android:drawable="@drawable/qq007" android:duration="80"/>
- <item android:drawable="@drawable/qq008" android:duration="80"/>
- </animation-list>
- <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/qq001" android:duration="80"/> <item android:drawable="@drawable/qq002" android:duration="80"/> <item android:drawable="@drawable/qq003" android:duration="80"/> <item android:drawable="@drawable/qq004" android:duration="80"/> <item android:drawable="@drawable/qq005" android:duration="80"/> <item android:drawable="@drawable/qq006" android:duration="80"/> <item android:drawable="@drawable/qq007" android:duration="80"/> <item android:drawable="@drawable/qq008" android:duration="80"/> </animation-list>
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <ImageView
- android:id="@+id/animation_view"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:src="@drawable/qq_animation" />
- <Button
- android:id="@+id/animation_btn"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/start_animation" />
- <Button
- android:id="@+id/one_shot_btn"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/play_once" />
- </LinearLayout>
- <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ImageView android:id="@+id/animation_view" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/qq_animation" /> <Button android:id="@+id/animation_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/start_animation" /> <Button android:id="@+id/one_shot_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/play_once" /> </LinearLayout>
下面就是控制動畫播放的類代碼(src\org\goodev\animation\AnimActivity.java):
- public class AnimActivity extends Activity {
- /** Called when the activity is first created. */
- AnimationDrawable mAd;
- Button mPlayBtn;
- Button mOneShotBtn;
- boolean mIsOneShot;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ImageView iv = (ImageView) findViewById(R.id.animation_view);
- mAd = (AnimationDrawable) iv.getDrawable();
- mPlayBtn = (Button) findViewById(R.id.animation_btn);
- mPlayBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- startAnimation();
- }
- });
- mOneShotBtn = (Button) findViewById(R.id.one_shot_btn);
- mOneShotBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- if (mIsOneShot) {
- mOneShotBtn.setText("Play Once");
- } else {
- mOneShotBtn.setText("Play Repeatly");
- }
- mAd.setOneShot(!mIsOneShot);
- mIsOneShot = !mIsOneShot;
- }
- });
- }
- /**
- * 通過AnimationDrawable的start函數播放動畫,
- * stop函數停止動畫播放,
- * isRunning來判斷動畫是否正在播放。
- */
- public void startAnimation() {
- if (mAd.isRunning()) {
- mAd.stop();
- } else {
- mAd.stop();
- mAd.start();
- }
- }
- }
- public class AnimActivity extends Activity { /** Called when the activity is first created. */ AnimationDrawable mAd; Button mPlayBtn; Button mOneShotBtn; boolean mIsOneShot; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ImageView iv = (ImageView) findViewById(R.id.animation_view); mAd = (AnimationDrawable) iv.getDrawable(); mPlayBtn = (Button) findViewById(R.id.animation_btn); mPlayBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { startAnimation(); } }); mOneShotBtn = (Button) findViewById(R.id.one_shot_btn); mOneShotBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { if (mIsOneShot) { mOneShotBtn.setText("Play Once"); } else { mOneShotBtn.setText("Play Repeatly"); } mAd.setOneShot(!mIsOneShot); mIsOneShot = !mIsOneShot; } }); } /** * 通過AnimationDrawable的start函數播放動畫, * stop函數停止動畫播放, * isRunning來判斷動畫是否正在播放。 */ public void startAnimation() { if (mAd.isRunning()) { mAd.stop(); } else { mAd.stop(); mAd.start(); } } }
- l AlphaAnimation:實現alpha漸變,可以使界面逐漸消失或者逐漸顯現
- l TranslateAnimation:實現位置移動漸變,需要指定移動的開始和結束座標
- l ScaleAnimation: 實現縮放漸變,可以指定縮放的參考點
- l RotateAnimation:實現旋轉漸變,可以指定旋轉的參考點,默認值爲(0,0)左上角。
- l AnimationSet: 代表上面的漸變組合
- <set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/decelerate_interpolator">
- <alpha
- android:fromAlpha="0.0"
- android:toAlpha="1.0"
- android:duration="1000" />
- </set>
- <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/decelerate_interpolator"> <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="1000" /> </set>
- <alpha
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/accelerate_interpolator"
- android:fromAlpha="0.0"
- android:toAlpha="1.0"
- android:duration="1000" />
- <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="1000" />
- <scale
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/accelerate_interpolator"
- android:fromXScale="1"
- android:toXScale="1"
- android:fromYScale="0.1"
- android:toYScale="1.0"
- android:duration="500"
- android:pivotX="50%"
- android:pivotY="50%"
- android:startOffset="100" />
- <scale xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" android:fromXScale="1" android:toXScale="1" android:fromYScale="0.1" android:toYScale="1.0" android:duration="500" android:pivotX="50%" android:pivotY="50%" android:startOffset="100" />
- <rotate
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/accelerate_interpolator"
- android:fromDegrees="0.0"
- android:toDegrees="360"
- android:pivotX="50%"
- android:pivotY="50%"
- android:duration="500" />
- <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" android:fromDegrees="0.0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:duration="500" />
- <translate
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/accelerate_interpolator"
- android:fromYDelta="-100%"
- android:toYDelta="0"
- android:duration="500" />
- <translate xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator" android:fromYDelta="-100%" android:toYDelta="0" android:duration="500" />
- <set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/decelerate_interpolator">
- <translate
- android:fromYDelta="-100%"
- android:toYDelta="0"
- android:duration="500" />
- <alpha
- android:fromAlpha="0.0"
- android:toAlpha="1.0"
- android:duration="500" />
- </set>
- <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/decelerate_interpolator"> <translate android:fromYDelta="-100%" android:toYDelta="0" android:duration="500" /> <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:duration="500" /> </set>
- LayoutAnimationController,該文件同樣位於res/anim/目錄下,下面是一個示例(res\anim\layout_anim_ctrl.xml):
- <layoutAnimation
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:delay="30%"
- android:animationOrder="reverse"
- android:animation="@anim/translate_alpha_anim" />
- LayoutAnimationController,該文件同樣位於res/anim/目錄下,下面是一個示例(res\anim\layout_anim_ctrl.xml): <layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android" android:delay="30%" android:animationOrder="reverse" android:animation="@anim/translate_alpha_anim" />
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <ListView
- android:id="@+id/list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:persistentDrawingCache="animation|scrolling"
- android:layoutAnimation="@anim/layout_anim_ctrl" />
- </LinearLayout>
- <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" android:persistentDrawingCache="animation|scrolling" android:layoutAnimation="@anim/layout_anim_ctrl" /> </LinearLayout>
- public class ListActivity extends Activity {
- String[] mListItems =
- { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5"};
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.list);
- ArrayAdapter<String> listItemAdapter =
- new ArrayAdapter<String>(this,
- android.R.layout.simple_list_item_1, mListItems);
- ListView lv = (ListView) this.findViewById(R.id.list);
- lv.setAdapter(listItemAdapter);
- }
- }
- public class ListActivity extends Activity { String[] mListItems = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5"}; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list); ArrayAdapter<String> listItemAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, mListItems); ListView lv = (ListView) this.findViewById(R.id.list); lv.setAdapter(listItemAdapter); } }
- class ViewAnimation extends Animation {
- public ViewAnimation() {
- }
- @Override
- public void initialize(int width, int height, int parentWidth, int parentHeight) {
- super.initialize(width, height, parentWidth, parentHeight);
- setDuration(2500);
- setFillAfter(true);
- setInterpolator(new LinearInterpolator());
- }
- @Override
- protected void applyTransformation(float interpolatedTime,
- Transformation t) {
- final Matrix matrix = t.getMatrix();
- matrix.setScale(interpolatedTime, interpolatedTime);
- }
- }
- class ViewAnimation extends Animation { public ViewAnimation() { } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); setDuration(2500); setFillAfter(true); setInterpolator(new LinearInterpolator()); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { final Matrix matrix = t.getMatrix(); matrix.setScale(interpolatedTime, interpolatedTime); } }
- public class ViewAnimActivity extends Activity {
- Button mPlayBtn;
- ImageView mAnimImage;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.view_anim_layout);
- mAnimImage = (ImageView) this.findViewById(R.id.anim_image);
- mPlayBtn = (Button) findViewById(R.id.play_btn);
- mPlayBtn.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View view) {
- mAnimImage.startAnimation(new ViewAnimation());
- }
- });
- }
- }
- public class ViewAnimActivity extends Activity { Button mPlayBtn; ImageView mAnimImage; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.view_anim_layout); mAnimImage = (ImageView) this.findViewById(R.id.anim_image); mPlayBtn = (Button) findViewById(R.id.play_btn); mPlayBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { mAnimImage.startAnimation(new ViewAnimation()); } }); } }
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <Button
- android:id="@+id/play_btn"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="Start Animation"
- />
- <ImageView
- android:id="@+id/anim_image"
- android:persistentDrawingCache="animation|scrolling"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:src="@drawable/ophone"
- />
- </LinearLayout>
- <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/play_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Start Animation" /> <ImageView android:id="@+id/anim_image" android:persistentDrawingCache="animation|scrolling" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/ophone" /> </LinearLayout>
- class ViewAnimation extends Animation {
- int mCenterX;//記錄View的中間座標
- int mCenterY;
- public ViewAnimation() {
- }
- @Override
- public void initialize(int width, int height, int parentWidth, int parentHeight) {
- super.initialize(width, height, parentWidth, parentHeight);
- //初始化中間座標值
- mCenterX = width/2;
- mCenterY = height/2;
- setDuration(2500);
- setFillAfter(true);
- setInterpolator(new LinearInterpolator());
- }
- @Override
- protected void applyTransformation(float interpolatedTime,
- Transformation t) {
- final Matrix matrix = t.getMatrix();
- matrix.setScale(interpolatedTime, interpolatedTime);
- //通過座標變換,把參考點(0,0)移動到View中間
- matrix.preTranslate(-mCenterX, -mCenterY);
- //動畫完成後再移回來
- matrix.postTranslate(mCenterX, mCenterY);
- }
- }
- class ViewAnimation extends Animation { int mCenterX;//記錄View的中間座標 int mCenterY; public ViewAnimation() { } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); //初始化中間座標值 mCenterX = width/2; mCenterY = height/2; setDuration(2500); setFillAfter(true); setInterpolator(new LinearInterpolator()); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { final Matrix matrix = t.getMatrix(); matrix.setScale(interpolatedTime, interpolatedTime); //通過座標變換,把參考點(0,0)移動到View中間 matrix.preTranslate(-mCenterX, -mCenterY); //動畫完成後再移回來 matrix.postTranslate(mCenterX, mCenterY); } }
- Reset():重置該矩陣
- setScale():設置矩陣縮放
- setTranslate():設置矩陣移動
- setRotate():設置矩陣旋轉
- setSkew(): 使矩陣變形(扭曲)
- class ViewAnimation extends Animation {
- int mCenterX;//記錄View的中間座標
- int mCenterY;
- Camera camera = new Camera();
- public ViewAnimation() {
- }
- @Override
- public void initialize(int width, int height, int parentWidth,
- int parentHeight) {
- super.initialize(width, height, parentWidth, parentHeight);
- //初始化中間座標值
- mCenterX = width/2;
- mCenterY = height/2;
- setDuration(2500);
- setFillAfter(true);
- setInterpolator(new LinearInterpolator());
- }
- @Override
- protected void applyTransformation(float interpolatedTime,
- Transformation t) {
- // final Matrix matrix = t.getMatrix();
- // matrix.setScale(interpolatedTime, interpolatedTime);
- // //通過座標變換,把參考點(0,0)移動到View中間
- // matrix.preTranslate(-mCenterX, -mCenterY);
- // //動畫完成後再移回來
- // matrix.postTranslate(mCenterX, mCenterY);
- final Matrix matrix = t.getMatrix();
- camera.save();
- camera.translate(0.0f, 0.0f, (1300 - 1300.0f * interpolatedTime));
- camera.rotateY(360 * interpolatedTime);
- camera.getMatrix(matrix);
- matrix.preTranslate(-mCenterX, -mCenterY);
- matrix.postTranslate(mCenterX, mCenterY);
- camera.restore();
- }
- }
- class ViewAnimation extends Animation { int mCenterX;//記錄View的中間座標 int mCenterY; Camera camera = new Camera(); public ViewAnimation() { } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); //初始化中間座標值 mCenterX = width/2; mCenterY = height/2; setDuration(2500); setFillAfter(true); setInterpolator(new LinearInterpolator()); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { // final Matrix matrix = t.getMatrix(); // matrix.setScale(interpolatedTime, interpolatedTime); // //通過座標變換,把參考點(0,0)移動到View中間 // matrix.preTranslate(-mCenterX, -mCenterY); // //動畫完成後再移回來 // matrix.postTranslate(mCenterX, mCenterY); final Matrix matrix = t.getMatrix(); camera.save(); camera.translate(0.0f, 0.0f, (1300 - 1300.0f * interpolatedTime)); camera.rotateY(360 * interpolatedTime); camera.getMatrix(matrix); matrix.preTranslate(-mCenterX, -mCenterY); matrix.postTranslate(mCenterX, mCenterY); camera.restore(); } }