2016-11-19 105 views
0

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

回答

0

的問題是,你在方法主線,這就是所謂經常從事繁重的計算操作:

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