Android视图中带有背景的onTouchEvent响应缓慢
all! 我想弄清楚为什么我在Android视图中的onTouchEvent方法有一个缓慢的响应。这是一个简单的TicTacToe游戏,我删除了所有逻辑,只留下与问题有关的事情。 到目前为止onTouchEvent方法获取坐标,然后调用只绘制一个圆圈的onDraw方法。 onDraw方法也绘制背景,即大小为366 kB的960x1280 jpg文件。它的工作原理,但我有触摸屏幕和绘制圆圈之间的延迟。在仿真器上几秒钟,在我的三星上约0.5秒。我注意到,没有背景它完美的作品。但与此同时,这个问题似乎不在勾画背景。我的意思是,如果我连续多次调用invalidate()几次,他们都是即刻绘制的,我们只有在第一个数字之前才会延迟。因此,据我所知,onTouchEvent方法反应有所不同,具体取决于是否有背景。 我一直在寻找,但我发现的唯一的东西是添加16毫秒的延迟(它在代码中,评论),但它没有帮助。
如果要拍一张较小的照片,我有更好的回应,但我需要这张大照片来适应不同的手机。 所以最后,问题是响应时间取决于背景图片的大小,但同时它不是绘制这张大图片的问题,仅仅是为了让onTouchEvent停止。我很困惑 - )这怎么可能? 请帮助我,如果你可以。Android视图中带有背景的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;
}
}
的问题是,你在方法主线,这就是所谓经常从事繁重的计算操作:
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.kletka3)
你应该载入资源一次(建议使用Glide库来显示图像),并在后台线程上进行所有计算。
到目前为止,我只是把位图= BitmapFactory.decodeResource(getResources(),R.drawable.kletka3) – Vitalii
到目前为止,我只是把位图= BitmapFactory.decodeResource(getResources(),R.drawable.kletka3) )方法,它开始工作完美!谢谢!也许我将不得不更多地了解这个滑翔库,但现在问题解决了。但对我来说,这仍然不是很清楚,当我连续几次调用invalidate()时,为什么它运行良好,但这只是一种好奇心,现在并不重要。无论如何,谢谢大家!谢谢你,我的朋友们!你非常帮助我 – Vitalii
'onDraw'内的'BitmapFactory.decodeResource'?你没有任何皮棉警告吗? – pskink
我相信@ alex-shutov指出了为什么会发生这种情况。所以我建议你也这样做。在其他地方调用decodeResource并将位图发送到您的GameViewBug对象,然后调用invalidate()方法。 – saiful103a