Android:OnTouch没有响应。

时间:2012-02-14 19:23:40

标签: android

我希望在触摸视图时执行操作。但是,触摸不响应。该应用程序不会崩溃,它似乎只是忽略它。

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)应用程序崩溃。活动中有很多代码我没有提到。

1 个答案:

答案 0 :(得分:1)

我猜你相信onTouch()没有被触发,因为你没有看到你的图形因x或其他任何变化而发生变化。如果是这种情况,您似乎错过了触摸处理程序中invalidate()的调用,导致View再次重绘(通过调用onDraw())。

此外,您实际上invalidate()内部onDraw()本身不应该存在。它肯定会导致你的View一遍又一遍地重绘 - 我想 - 实际上,我猜你应该看到更新,因为那就是那里。但这不是你应该制作View动画的方式;您应该使用ThreadHandler来安排定期,定期invalidate() - 或其他一些方法来定期安排更新。

当你可以像你一样覆盖onTouch()时,也不需要实现'OnTouchListener'。您可以通过以下几种方法检测View的触摸事件:(1)覆盖onTouch(),以便在View上获取触摸事件。 (2)使用setOnTouchListener()注册听众。后一个选项使您能够拥有一个侦听来自一个View或多个View的触摸事件的侦听器,并且它还会在注册的View拥有{之前'看到'触摸事件' {1}}看到了他们。

我看到的另一件事是,当您收到ACTION_DOWN事件时,您将onTouch()设置为400,但是对于任何其他类型的事件(例如ACTION_MOVE),您将其设置为300。考虑到实际上很难保持足够的手指,以便在ACTION_DOWN之后不会立即引起一串ACTION_MOVE事件,也许你只是在x处于400或者什么时才看到图形。

您确实需要发布一个完整的示例(例如您发布的代码x,其中setOnTouchListener(mCustomDrawableView)未在任何地方定义)以及来自Logcat的特定错误。此外,您应该使用调试器来查看您的mCustomDrawableView是否曾执行过(在其中插入断点)。

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