Как разместить AnimationDrawable на холсте SurfaceView - PullRequest
4 голосов
/ 05 августа 2011

Нуб к разработке игр, и у меня возникают проблемы с размещением AnimationDrawable на холсте SurfaceView. Это часть простой игры, пользователь касается экрана, и в это место помещается анимированный GIF, похожий на взрыв. Я могу сделать это с помощью растрового изображения, используя код, показанный ниже, но я застрял в конвертации в AnimationDrawable. Я мог бы создать AnimationDrawable из ImageView, но я также не могу найти способ вывести ImageView на холст ...

Я поступаю неправильно? Есть ли более простой способ заставить анимированный GIF-файл отображаться в координатах x, y на холсте SurfaceView?

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

Это вызывает исключение ClassCastException, если я пытаюсь преобразовать растровое изображение в AnimationDrawable и запустить его:

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

1 Ответ

5 голосов
/ 09 августа 2011

После продолжительных раскопок я нашел ответ ... кажется, мне нравится отвечать на мои собственные вопросы здесь.

Только что нашел класс Кино. Я могу загрузить свой анимированный GIF-файл в него с помощью InputStream, а затем воспроизвести фильм постепенно в моем onDraw (), потому что класс Movie поддерживает метод draw (), в котором я могу предоставить свои данные canvas и координаты x, y.

Ниже приведен фрагмент кода:

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));
      }
    }
   ...
}
...