如何将AnimationDrawable放在SurfaceView画布上

时间:2011-08-05 18:25:53

标签: android canvas bitmap surfaceview

Noob进行游戏开发,我无法将AnimationDrawable放到SurfaceView画布上。它是一个简单游戏的一部分,用户触摸屏幕,并在该位置放置一个看起来像爆炸的动画gif。我可以使用下面显示的代码使用Bitmap完成此操作,但将其转换为AnimationDrawable是我陷入困境的地方。我可以从ImageView创建AnimationDrawable,但我找不到将ImageView放到画布上的方法......

我是以错误的方式解决这个问题吗?是否有更简单的方法可以在SurfaceView画布上的x,y坐标处显示动画gif?

Bitmap explodeBmp = BitmapFactory.decodeResource(getResources(), R.drawable.explode4);
canvas.drawBitmap(explodeBmp, coords.getX()-(explodeBmp.getWidth()/2), coords.getY()-(explodeBmp.getHeight()/2), paint);

如果我尝试将Bitmap转换为AnimationDrawable并启动它,则抛出ClassCastException:

AnimationDrawable explosionAnimation = (AnimationDrawable) ((Drawable) new BitmapDrawable(explodeBmp));
explosionAnimation.start();

1 个答案:

答案 0 :(得分:5)

经过不断的挖掘,我找到了答案......似乎我喜欢在这里回答我自己的问题。

刚刚找到了电影课。我可以使用InputStream将我的动画gif加载到它中,然后在我的onDraw()中逐位播放电影,因为Movie类支持draw()方法,我可以提供画布和x,y坐标。

以下是代码snippit:

InputStream is = context.getResources().openRawResource(R.drawable.dotz_explosion);
Movie explodeGif = Movie.decodeStream(is);

...

@Override
protected void onDraw(Canvas canvas) {
    ...
      GraphicObject explosion = (GraphicObject)ex.next();

      long now = android.os.SystemClock.uptimeMillis();
      if (explosion.getMovieStart() == 0) { // first time
         explosion.setMovieStart(now);
      }

      int relTime = (int)((now - explosion.getMovieStart()) % explodeGif.duration());
      if ((now - explosion.getMovieStart()) >= explodeGif.duration()) {
         removeArrayExplosions.add(removeIndex);
         explosion.setMovieStart(0);
      } else {
         explodeGif.setTime(relTime);
         explodeGif.draw(canvas, explosion.getX()-(explodeGif.width()/2), explosion.getY()-(explodeGif.height()/2));
      }
    }
   ...
}