2012-02-14 62 views
0

我想要在觸摸視圖時執行操作。但是,觸動沒有迴應。該應用程序不會崩潰,它似乎忽略它。Android:OnTouch沒有響應。

public class CustomDrawableView extends View implements OnTouchListener 
{ 
    static final int width = 100; 
    static final int height = 50; 

    public CustomDrawableView(Context context) 
    { 
     super(context); 
     setFocusable(true); 
     setOnTouchListener(mCustomDrawableView);    
     mDrawable = new ShapeDrawable(new OvalShape()); 
     mDrawable.getPaint().setColor(0xff74AC23); 
     mDrawable.setBounds(x, y, x + width, y + height); 
    } 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if(event.getAction()==MotionEvent.ACTION_DOWN) 
     { 

     x = 400; 
     return true; 
     } 
     else { 
      x = 300; 
      return false; 
     } 
    } 

    protected void onDraw(Canvas canvas) 
    {  
     int mCanvasHeight = canvas.getHeight(); 
     int mCanvasWidth = canvas.getWidth(); 
     canvas.save(); 
     canvas.rotate(R,x,y); 


     if (y >= mCanvasHeight-100) { 
      y = 0; 
     } 
     RectF oval = new RectF(x, y, x + width, y 
       + height); // set bounds of rectangle 
     Paint p = new Paint(); // set some paint options 
     p.setColor(Color.BLUE); 
     canvas.drawOval(oval, p); 
     canvas.restore(); 

     invalidate(); 


    } 
} 

我試了一堆不同的代碼來修復它。除了將setOnTouchListener(mCustomDrawable)更改爲mCustomDrawableView.setOnTouchListener(this)應用程序崩潰之外,它沒有任何功能。活動中還有更多的代碼,我沒有提出。

+0

什麼說logcat? – poitroae 2012-02-14 19:29:50

回答

1

我猜你相信onTouch()沒有啓動,因爲你沒有看到你的圖形變化,以響應x或其他任何變化。如果是這樣,看起來你錯過了在你的觸摸處理程序中呼叫invalidate(),導致View重新自我重繪(通過呼叫onDraw())。

此外,你有一個invalidate()其實onDraw()其本身真的不應該在那裏。這肯定會導致你的View反覆重繪自己 - 我想 - 實際上,我想你應該看到更新,因爲那裏。但這不是你應該製作一個View動畫的方式;您應該使用ThreadHandler來安排定期的定期invalidate()或其他一些方法來定期安排更新。

此外,您應該不需要實施「OnTouchListener」,只需按照以上步驟覆蓋onTouch()即可。有幾種方法可以檢測View的觸摸事件:(1)覆蓋onTouch(),就像您已完成的那樣,獲取該觸摸事件View。 (2)使用​​註冊偵聽器。後一個選項使您可以讓聽衆傾聽來自一個View或多個View的觸摸事件,並且在註冊的View自己的看到它們之前,它還「看到」觸摸事件。

我看到的另一件事是,當你得到一個ACTION_DOWN事件時,你將x設置爲400,但是對於任何其他類型的事件,比如ACTION_MOVE,你將它設置爲300。考慮到在ACTION_DOWN之後,保持足夠的手指仍然不會立即產生一串ACTION_MOVE事件實際上是非常困難的,也許您在x處於400或其他時候從未看到圖形。

您確實需要發佈一個完整的示例(例如,您發佈的代碼有setOnTouchListener(mCustomDrawableView),其中mCustomDrawableView尚未在任何地方定義)以及來自Logcat的特定錯誤。此外,您應該使用調試器來查看您的onTouch是否執行過(在其中插入一個斷點)。

此外,你應該接受一些答案。