0

我试图在 a 上画一个正方形,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;
    }
});

谁能给我一个例子。

4

2 回答 2

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;
    }
});
于 2013-02-27T08:26:50.363 回答
0

尝试使用这个。

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

于 2013-02-27T06:18:52.973 回答