繁体   English   中英

Android:OnTouch没有响应。

[英]Android: OnTouch not responding.

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

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)以外,其他任何操作均不起作用。 活动中还有很多我没有提出的代码。

我猜您相信onTouch()不会触发,因为您没有看到图形响应x或其他任何变化而改变。 如果是这种情况,似乎您缺少在触摸处理程序中对invalidate()的调用,从而导致View再次重绘自身(通过调用onDraw() )。

另外,实际上在onDraw()本身中有一个invalidate()实际上不应该在其中。 我想,这肯定会导致您的View地重绘自身,因此,实际上,我想您应该看到更新,因为在那里。 但这不是使View动画的方式; 您应该改为使用ThreadHandler来安排定期的,定期的invalidate() -或通过其他方式来定期安排更新。

同样,当您可以像完成操作一样覆盖onTouch()时,也无需实现“ OnTouchListener”。 您可以通过以下两种方法来检测View触摸事件:(1)像这样覆盖onTouch() ,以获取该View触摸事件。 (2)使用setOnTouchListener()注册一个侦听器。 后者的选择使您能够侦听从一个触摸事件的侦听器View或多个View S,同时也“看到”触摸注册前的事件View自己的onTouch()看到他们。

我看到的另一件事是,当您收到ACTION_DOWN事件时,将x设置为400,但是对于其他任何类型的事件,例如ACTION_MOVE,则将其设置为300。 考虑到实际上很难保持手指足够静止以致在ACTION_DOWN之后永远不会立即引起一连串的ACTION_MOVE事件,也许当x等于400时您永远都看不到图形。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM