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; 

    } 
} 
+1

'onDraw'内的'BitmapFactory.decodeResource'?你没有任何皮棉警告吗? – pskink

+0

我相信@ alex-shutov指出了为什么会发生这种情况。所以我建议你也这样做。在其他地方调用decodeResource并将位图发送到您的GameViewBug对象,然后调用invalidate()方法。 – saiful103a

的问题是,你在方法主线,这就是所谓经常从事繁重的计算操作:

bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.kletka3) 

你应该载入资源一次(建议使用Glide库来显示图像),并在后台线程上进行所有计算。

+0

到目前为止,我只是把位图= BitmapFactory.decodeResource(getResources(),R.drawable.kletka3) – Vitalii

+0

到目前为止,我只是把位图= BitmapFactory.decodeResource(getResources(),R.drawable.kletka3) )方法,它开始工作完美!谢谢!也许我将不得不更多地了解这个滑翔库,但现在问题解决了。但对我来说,这仍然不是很清楚,当我连续几次调用invalidate()时,为什么它运行良好,但这只是一种好奇心,现在并不重要。无论如何,谢谢大家!谢谢你,我的朋友们!你非常帮助我 – Vitalii