Android學習之逐幀動畫

來源:互聯網
上載者:User

動畫分為逐幀動畫(Frame)、補間動畫(Tween) 和屬性動畫。

1、逐幀動畫

通常採用XML資源檔進行定義,如下:

android:oneshot 設定是否迴圈播放動畫,false為迴圈播放為預設的設定,xml檔案定義幀動畫資源,在程式中用一個ImageView就可以顯示該動畫了。

需要指出的是AnimationDrawable代表的動畫預設是不播放的,需要在程式中啟動,調用start() 和 stop() .


子彈爆炸效果執行個體

import java.lang.reflect.Field;import android.app.Activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.drawable.AnimationDrawable;import android.media.MediaPlayer;import android.os.Bundle;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.FrameLayout;import android.widget.ImageView;public class Blast extends Activity{private MyView myView;private AnimationDrawable anim;private MediaPlayer bomb;public void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);// 使用FrameLayout布局管理器,它允許組件自己控制位置FrameLayout frame = new FrameLayout(this);setContentView(frame);// 設定使用背景frame.setBackgroundResource(R.drawable.back);// 載入音效bomb = MediaPlayer.create(this, R.raw.bomb);myView = new MyView(this);// 設定myView用於顯示blast動畫myView.setBackgroundResource(R.anim.blast);// 設定myView預設為隱藏myView.setVisibility(View.INVISIBLE);// 擷取動畫對象anim = (AnimationDrawable) myView.getBackground();frame.addView(myView);frame.setOnTouchListener(new OnTouchListener(){public boolean onTouch(View source, MotionEvent event){// 只處理按下事件(避免每次產生兩個動畫效果)if (event.getAction() == MotionEvent.ACTION_DOWN){// 先停止動畫播放anim.stop();float x = event.getX();float y = event.getY();// 控制myView的顯示位置myView.setLocation((int) y - 40, (int) x - 20);myView.setVisibility(View.VISIBLE);// 啟動動畫anim.start();// 播放音效bomb.start();}return false;}});}// 定義一個自訂View,該自訂View用於播放“爆炸”效果class MyView extends ImageView{public MyView(Context context){super(context);}// 定義一個方法,該方法用於控制MyView的顯示位置public void setLocation(int top, int left){this.setFrame(left, top, left + 40, top + 40);}// 重寫該方法,控制如果動畫播放至最後一幀時,隱藏該Viewprotected void onDraw(Canvas canvas) {try{Field field = AnimationDrawable.class.getDeclaredField("mCurFrame");field.setAccessible(true);// 擷取anim動畫的當前幀int curFrame = field.getInt(anim);// 如果已經到了最後一幀if (curFrame == anim.getNumberOfFrames() - 1){// 讓該View隱藏setVisibility(View.INVISIBLE);}}catch (Exception e){}super.onDraw(canvas);}}}
blast.xml





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.