1

タッチを使用して、ユーザーがイメージビューに複数の円を描画できるようにしようとしています。これまでのところ、一度に 1 つずつ描くことができました。タッチ ポイントを保存し、invalidate() を呼び出した後にすべての円を再描画する必要があることは理解していますが、それを行う方法はわかりません。

これが私のコードです。誰かが私が追加/変更しなければならないことを指摘したり、これを実装する方法についてアドバイスを与えたりしていただければ幸いです:

public class ImageView1 extends ImageView {

public int x;
public int y;

ImageView1 img = (ImageView1) findViewById (R.id.imageView1);


    public ImageView1(Context context, AttributeSet attrs) {
       super(context, attrs); 
       setFocusable(true);

    } 

    public boolean onTouchEvent(MotionEvent event){

       x = (int) event.getX();
       y = (int) event.getY();


    return true;
    }

    @Override   
    public void onDraw(Canvas canvas){
       super.onDraw(canvas);
       Paint p = new Paint();

   p.setAntiAlias(true);
   p.setColor(Color.RED);
   p.setStyle(Paint.Style.STROKE); 
   p.setStrokeWidth(1);

   canvas.drawCircle(x, y, 20, p);
       invalidate();
}

 }
4

1 に答える 1

1

私は通常SparseArray、ポインターIDをキーとしてポインター位置情報を収集しています。

private SparseArray<PointF> mPointers = new SparseArray<PointF>();

@Override
public boolean onTouchEvent(MotionEvent me) {
    switch (me.getActionMasked()) {
    case MotionEvent.ACTION_DOWN:
    case MotionEvent.ACTION_POINTER_DOWN: {
        int ai = me.getActionIndex();
        PointF pt = new PointF(me.getX(ai), me.getY(ai));
        mPointers.put(me.getPointerId(ai), pt);
        return true;
    }
    case MotionEvent.ACTION_UP:
    case MotionEvent.ACTION_POINTER_UP: {
        int pid = me.getPointerId(me.getActionIndex());
        mPointers.remove(pid);
        return true;
    }
    case MotionEvent.ACTION_MOVE: {
        for (int i = 0; i < me.getPointerCount(); ++i) {
            PointF pt = mPointers.get(me.getPointerId(i));
            pt.set(me.getX(i), me.getY(i));
        }
        return true;
    }
    }
    return false;
}

次に、個別のタッチ ポイントをレンダリングするために、mPointers値を反復処理できます。

于 2012-10-29T17:43:48.393 に答える