Как разместить анимацию на холсте SurfaceView

Noob для разработки игр, и мне не удается разместить AnimationDrawable на холсте SurfaceView. Это часть простой игры, пользователь прикасается к экрану, а анимированный gif размещается в том месте, которое выглядит как взрыв. Я могу выполнить это с помощью Bitmap, используя приведенный ниже код, но преобразование этого в 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, если я попытаюсь преобразовать Bitmap в AnimationDrawable и запустить его:

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

После непрерывного рытья я нашел ответ … Кажется, мне нравится отвечать на мои вопросы здесь.

Просто нашел класс фильма. Я могу загрузить мой анимированный gif в него с помощью InputStream, а затем поиграть в бит бит в моем onDraw (), потому что класс Movie поддерживает метод draw (), где я могу предоставить свои холсты и 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)); } } ... }