2

ユーザーが画像上にいくつかの単純なオブジェクト(線、円、矢印など)をペイントできるツールをAndroidで構築したいと思います。最初に線の部分を試し始めましたが、実際にそれを描くことに成功することができました。ロジックは、ユーザーが1つのポイントをタップしてから指をドラッグし、線を描くというものです。私はこのようなクラスを使用します(これはここでのDonGruの回答に基づいています):

public class DrawView extends View {
    Paint paint = new Paint();
    float Sx, Sy, Lx, Ly;

    public DrawView(Context context, float x1, float y1, float x2, float y2) {
        super(context);

        paint.setColor(Color.RED);
        Sx=x1;
        Sy=y1;
        Lx=x2;
        Ly=y2;   
    }

    @Override
    public void onDraw(Canvas canvas) {
            canvas.drawLine(Sx, Sy, Lx, Ly, paint);
    }
}

アクティビティコードから、次のようにonTouchリスナーを使用します。

@Override
public boolean onTouch(View view, MotionEvent event) { 
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Sx1 = event.getX();
            Sy1 = event.getY();
            return true;

        case MotionEvent.ACTION_MOVE:
            Cx1 = event.getX();
            Cy1 = event.getY();
            drawLine();
            return true;

        case MotionEvent.ACTION_UP:
            Lx1 = event.getX();
            Ly1 = event.getY();
            return true;
        }
    return false;
}

public void drawLine(){

    setContentView(R.layout.show);
    ImageView myImage = (ImageView) findViewById(R.id.lastphoto);
    myImage.setImageBitmap(rotatedPic);

    dv=new DrawView(this, Sx1, Sy1, Cx1, Cy1);

    addContentView(dv, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
            ViewGroup.LayoutParams.FILL_PARENT));

    RelativeLayout mRelativeLayout = (RelativeLayout) findViewById(R.id.linear);
    mRelativeLayout.setOnTouchListener((OnTouchListener) this);
    mRelativeLayout.addView(new Drawer(this));   
}

移動するたびに、ビュー全体を再作成して、開始点から終了点までの1本の線だけが表示されるようにします。私の最初の懸念は、この実装が正しいかどうかわからないことです。また、これらの行を作成後にオブジェクトとして処理する必要があります。ユーザーはそれらを移動、回転、削除などできるはずです。これは、各線のエッジの座標をバッファーのようなものに保持することで実行できると思います。ユーザーが1つのエッジに非常に近いところをタップすると、そのジェスチャーを処理します。しかし、これはすべて複雑すぎるように聞こえ、これが不安定かどうかはわかりません。

私が完全に欠けているこのようなものを実装するために使用する必要があるいくつかの異なる方法はありますか?

4

1 に答える 1

5

私の意見では、描画された線を保存し、ユーザーがそれらを操作できるようにすることは、それほど複雑ではありません。

Line クラスを作成します。クラスのフィールドとして開始座標と終了座標、色などを含め、削除、移動などのメソッドを含めます。また、MotionEvent 引数を取るメソッドを追加します。このメソッドでは、MotionEvent を使用して、この線がタッチされたかどうかを判断し、必要に応じて位置を調整します。

描画された (Line クラスのインスタンスとして作成された) 各線への参照を、拡張された View クラスのコレクションまたは何らかの種類のリストに格納します (ArrayList を使用する必要があります)。次に、onTouch イベントで、各行のタッチ検出メソッドを呼び出し、MotionEvent をメソッドに渡します。

最後に、View の onDraw コールバックをオーバーライドして、Line インスタンスへの参照のコレクションを反復処理することにより、各線を描画します。

長押しして削除するなどのジェスチャーを追加することもできます。これは、そのようなアプローチの(まったくテストされていない、メモリから書かれた)スケルトンです。

class Line

    public float x1, x2, y1, y2;

    public void detectTouch(MotionEvent motionEvent){

         // code to detect a touch and adjust the x and ys accordingly

    }

class DrawView extends View{

    private ArrayList<Line> lines = new ArrayList<Lines>();

    ....
    ....

@Override
public void onDraw(Canvas canvas) {

    super.onDraw();

    for (Line line : lines){
         canvas.drawLine(line.x1,line.y1,line.x2,line.y2);
    }
}

@Override
public boolean onTouch(View view, MotionEvent event) {

    ....
    ....

    for (Line line : lines){
        line.detectTouch(MotionEvent);
    }


}

楽しむ!

于 2012-05-17T16:32:55.370 に答える