gpt4 book ai didi

android - 如何将 AnimationDrawable 放置在 SurfaceView Canvas 上

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:28 25 4
gpt4 key购买 nike

游戏开发新手,我无法将 AnimationDrawable 放置到 SurfaceView Canvas 上。这是一个简单游戏的一部分,用户触摸屏幕,动画 gif 被放置在看起来像爆炸的那个位置。我可以使用下面显示的代码通过位图完成此操作,但是将其转换为 AnimationDrawable 是我遇到的困难。我可以从 ImageView 创建 AnimationDrawable,但我也找不到将 ImageView 放到 Canvas 上的方法...

我是不是用错了方法?有没有更简单的方法让动画 gif 显示在 SurfaceView Canvas 上的 x、y 坐标处?

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

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

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

最佳答案

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

刚找到 Movie 类。我可以使用 InputStream 将我的动画 gif 加载到其中,然后在我的 onDraw() 中一点一点地播放电影,因为 Movie 类支持 draw() 方法,我可以在其中提供我的 Canvas 和 x、y 坐标。

下面是代码 fragment :

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

关于android - 如何将 AnimationDrawable 放置在 SurfaceView Canvas 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6960932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com