0

私は上に正方形を描こうとしてcanvasMotionEvent.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_UPdrawRect

于 2013-02-27T06:18:52.973 に答える