【问题标题】:MotionEvents not firingMotionEvents 未触发
【发布时间】:2013-02-27 05:55:51
【问题描述】:

我试图在canvas 上画一个正方形,但只运行MotionEvent.ACTION_DOWN,然后listener 停止。

这个想法是,当用户触摸屏幕时,它会获取 x1 和 y1 位置,并且每次触发 onTouch 时,它必须将 rect frim 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;
    }
});

谁能给我一个例子。

【问题讨论】:

  • 这里有问题吗?
  • 您是否尝试为每个事件记录日志?
  • 是的,只有 MotionEvent.ACTION_DOWN 被触发然后停止。
  • 向你的类添加实现回调,就像这个最终类 Surface 扩展 SurfaceView 实现回调
  • 需要检查与此侦听器相关的所有代码,因为您提供的部分在一般情况下工作正常。

标签: java android motionevent


【解决方案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;
    }
});

【讨论】:

  • x1, y1, x2, y2 不是最终的,但我让它在没有最终的情况下工作。但很好的答案。
  • 我现在有另一个问题,即使我不抬起它仍然会发送一个 ACTION_CANCEL 事件。你知道为什么会这样吗?日志说: ACTION_DOWN ACTION_MOVE ACTION_MOVE ACTION_MOVE ACTION_CANCEL
  • 你只需要谷歌它。这里解释一下。 stackoverflow.com/questions/6018309/…
  • 找不到。不过还是谢谢。
【解决方案2】:

试试这个。

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 将被执行一次。

【讨论】:

    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2020-11-26
    • 2013-08-28
    相关资源
    最近更新 更多