标签:android bitmap canvas 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();
解决方法:
经过不断的挖掘,我找到了答案…似乎我喜欢在这里回答我自己的问题.
刚刚找到了电影课.我可以使用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));
}
}
...
}
标签:android,bitmap,canvas,surfaceview 来源: https://codeday.me/bug/20190621/1253661.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。