2013-02-27 37 views
0

我試圖在canvas上繪製正方形,但只運行MotionEvent.ACTION_DOWN,然後停止listenerMotionEvents not firing

這個想法是,當用戶觸摸屏幕時,它會得到x1和y1的位置,並且每次觸發onTouch時,都必須將矩形x1 y1繪製到當前位置,最後將最後一個位置保存在x2 y2中一次用戶放開屏幕。

我的代碼如下所示:

surfaceView.setOnTouchListener(new View.OnTouchListener() 
{ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     holder = surfaceView.getHolder(); 
     canvas = holder.lockCanvas(); 
     if(event.getAction() == MotionEvent.ACTION_DOWN) 
     { 
      x1=event.getX(); 
      y1=event.getY(); 
     } 
     else if(event.getAction() == MotionEvent.ACTION_UP) 
     { 
      x2=event.getX(); 
      y2=event.getY(); 
     } 
     canvas.drawRect(x1, y1, event.getX(), event.getY(), paint); 
     holder.unlockCanvasAndPost(canvas); 
     return true; 
    } 
}); 

誰能給我一個例子。

+0

有一個問題在這裏? – GreyBeardedGeek 2013-02-27 06:11:23

+0

您是否嘗試在每個事件上記錄日誌? – NaviRamyle 2013-02-27 06:11:31

+0

是的,只有MotionEvent.ACTION_DOWN被觸發,然後停止。 – 2013-02-27 06:14:06

回答

1

ACTION_UP從上面的代碼觸發。試試下面的代碼,你會看到日誌。

我覺得你的問題可能和您的點有關。我不知道你是如何定義x1,y1,x2,y2的,但是當它們被宣佈超出範圍時,它們必須是最終的。試試這個。

final SurfaceView s = (SurfaceView) findViewById(R.id.surface); 

final RectF rect = new RectF(); 

s.setOnTouchListener(new OnTouchListener() { 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     SurfaceHolder holder = s.getHolder(); 
     Canvas canvas = holder.lockCanvas(); 

     if(event.getAction() == MotionEvent.ACTION_DOWN) { 
      Log.d("action", "down"); 
      rect.left = event.getX(); 
      rect.top = event.getY(); 
     } 
     if(event.getAction() == MotionEvent.ACTION_UP){ 
      Log.d("action", "up"); 
      rect.right = event.getX(); 
      rect.bottom = event.getY(); 

      Paint paint = new Paint(); 
      paint.setColor(Color.RED); 
      canvas.drawRect(rect, paint); 
     } 

     holder.unlockCanvasAndPost(canvas); 
     return true; 
    } 
}); 
+0

x1,y1,x2,y2並不是最終的,但我沒有把它做成最終的。但很好的答案。 – 2013-02-27 09:27:32

+0

我現在有另一個問題,即使我不擡起它仍然發送一個ACTION_CANCEL事件。你知道爲什麼會發生這種情況嗎? 日誌說: ACTION_DOWN ACTION_MOVE ACTION_MOVE ACTION_MOVE ACTION_CANCEL – 2013-02-27 11:33:37

+0

你只需要google一下。這裏解釋。 http://stackoverflow.com/questions/6018309/action-cancel-while-touching – akaya 2013-02-27 11:38:29

0

嘗試使用此。

surfaceView.setOnTouchListener(new View.OnTouchListener() 
{ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 

     if(event.getAction() == MotionEvent.ACTION_DOWN) 
     { 
      x1=event.getX(); 
      y1=event.getY(); 
     } 
     else if(event.getAction() == MotionEvent.ACTION_UP) 
     { 
      x2=event.getX(); 
      y2=event.getY(); 

      holder = surfaceView.getHolder(); 
      canvas = holder.lockCanvas(); 
      canvas.drawRect(x1, y1, x2, y2, paint); 
      holder.unlockCanvasAndPost(canvas); 
     } 

     return true; 
    } 
}); 

如果你移動你的手指,它會調用你的一舉一動。 所以這段代碼

holder = surfaceView.getHolder(); 
canvas = holder.lockCanvas(); 

和驗證碼

canvas.drawRect(x1, y1, event.getX(), event.getY(), paint); 
holder.unlockCanvasAndPost(canvas); 

將被執行,也許這就是爲什麼它停止。

所以我把drawRect放在MotionEvent.ACTION_UP的條件下,所以drawRect會執行一次。

+0

這根本不起作用。 – 2013-02-27 06:26:43