Я хочу создать инструмент на Android, где пользователь может рисовать простые объекты поверх изображения (например, линию, круг или стрелку). Сначала я начал пробовать линейную часть, и мне действительно удалось ее нарисовать. Логика заключается в том, что пользователь нажимает в одной точке, а затем проводит пальцем, рисуя линию. Я использую такой класс (он основан на ответе 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));
}
При каждом движении я воссоздаю весь вид, чтобы была видна только одна линия от начальной до конечной точки. Моя первая проблема заключается в том, что я не знаю, верна ли эта реализация. Кроме того, я хочу, чтобы эти строки после создания обрабатывались как объекты. Пользователь должен иметь возможность перемещать их, вращать, удалять и т. д. Я думаю, что могу сделать это, удерживая координаты краев каждой строки в чем-то вроде буфера, и если пользователь коснется очень близко к одному краю, я могу справиться с этим жестом. Но все это звучит слишком сложно, и я не знаю, нестабильно ли это.
Есть ли какой-то другой метод, который я должен использовать для реализации чего-то подобного, что мне совершенно не хватает?
View
, переопределить его методonDraw
, обработать движения перетаскивания пользователя и соответственно вызватьView.invalidate()
. - person neevek   schedule 17.05.2012