ユーザーが画像上にいくつかの単純なオブジェクト(線、円、矢印など)をペイントできるツールを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つのエッジに非常に近いところをタップすると、そのジェスチャーを処理します。しかし、これはすべて複雑すぎるように聞こえ、これが不安定かどうかはわかりません。
私が完全に欠けているこのようなものを実装するために使用する必要があるいくつかの異なる方法はありますか?