一切!
我试图找出为什么我在onTouchEvent方法中的Android视图中响应缓慢。这是一个简单的TicTacToe游戏,我删除了所有的逻辑,只留下与问题有关的事情。
到目前为止,onTouchEvent方法获取坐标,然后调用onDraw方法,该方法只绘制一个圆。 onDraw方法还绘制了背景,即960x1280 jpg文件,大小为366 kB。它工作但我在触摸屏幕和绘制圆圈之间有一个延迟。这是模拟器上的几秒钟,我的三星上约0.5秒。我注意到没有背景它完美地工作。但与此同时,问题似乎并非在于背景。我的意思是,如果我连续多次调用invalidate()绘制更多的数字,它们都会立即绘制,我们只在第一个数字之前延迟。所以据我所知,onTouchEvent方法的反应有所不同,具体取决于是否有背景。
我一直在寻找,但我发现的唯一的事情是添加一个16毫秒的延迟(它在代码中,评论)但它没有帮助。
如果拍摄较小的照片,我会有更好的响应,但我需要这张大图来适应不同的手机。
总而言之,问题在于响应时间取决于背景图片的大小,但与此同时,绘制这个大图片并不是问题,只有onTouchEvent才能使用。我很困惑 - )怎么会这样?
如果可以,请帮助我。
以下是代码:
public class GameViewBug extends View {
private Paint mCirclePaint;
private Bitmap bitmap;
private float touchX;
private float touchY;
public GameViewBug(Context context) {
super(context);
init();
}
public void init() {
mCirclePaint = new Paint();
mCirclePaint.setColor(Color.RED);
mCirclePaint.setStrokeWidth(10);
mCirclePaint.setStyle(Paint.Style.STROKE);
}
@Override
protected void onDraw(Canvas canvas) {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.kletka3);
canvas.drawBitmap(bitmap, 0, 0, null);
//canvas.drawColor(Color.WHITE);
canvas.drawCircle(touchX, touchY, 50, mCirclePaint);
}
public boolean onTouchEvent(MotionEvent event) {
// try {
// Thread.sleep(16);
// }catch (InterruptedException e) {}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
touchX = event.getX();
touchY = event.getY();
}
invalidate();
return true;
}
}
答案 0 :(得分:0)
问题是,你在方法中对主线程执行繁重的计算操作,这经常被调用:
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.kletka3)
您应该加载一次该资源(建议使用Glide库显示图像),并在后台线程上进行所有计算。