播放動畫用過的2中方式html
1.using the AnimationDrawable
classjava
2.用android sdk提供的Movie類實現android
第一種方法能夠參見http://developer.android.com/guide/topics/graphics/drawable-animation.html
canvas
這個方法缺點是和美工配合起來不是很方便,並且幀多了,要打包的圖片也多了api
第二種方式改自android sdk提供的例子,直接播放gifide
sdk\samples\android-18\legacy\ApiDemos\src\com\example\android\apis\graphics\BitmapDecode.java動畫
private static class SampleView extends View { private Movie mMovie; private long mMovieStart = 0; //Set to false to use decodeByteArray private static final boolean DECODE_STREAM = true; private static byte[] streamToBytes(InputStream is) { ByteArrayOutputStream os = new ByteArrayOutputStream(1024); byte[] buffer = new byte[1024]; int len; try { while ((len = is.read(buffer)) >= 0) { os.write(buffer, 0, len); } } catch (java.io.IOException e) { } return os.toByteArray(); } public SampleView(Context context) { super(context); setFocusable(true); java.io.InputStream is; is = context.getResources().openRawResource(R.drawable.start_up); if (DECODE_STREAM) { mMovie = Movie.decodeStream(is); } else { byte[] array = streamToBytes(is); mMovie = Movie.decodeByteArray(array, 0, array.length); } // 高版本的android系統須要這麼處理,才能顯示動畫 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB){ setLayerType(View.LAYER_TYPE_SOFTWARE, null); } setBackgroundColor(0x91CB58); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(0xFF91CB58); long now = android.os.SystemClock.uptimeMillis(); if (mMovieStart == 0) { // first time mMovieStart = now; } if (mMovie != null) { int dur = mMovie.duration(); if (dur == 0) { dur = 1000; } // 只播放一次 int relTime = (int)((now - mMovieStart) /*% dur*/); if (relTime <= dur){ mMovie.setTime(relTime); } else{ mMovie.setTime(dur); } mMovie.draw(canvas, (getWidth() - mMovie.width()) / 2, (getHeight() - mMovie.height()) / 2); invalidate(); } } }
public class WelcomeActivity extends Activity{ ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new SampleView(this)); NecessaryInitialization task = new NecessaryInitialization(); task.setActivity(this); task.execute(); } ... }