2012-02-14 117 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是否执行过(在其中插入一个断点)。

此外,你应该接受一些答案。