Android的 - 用户油漆用他们的手指线(Android - User paints lines

2019-09-17 07:55发布

我想建立在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));   
}

在一举一动我重新创建整个视图,以便从起点到终点只有一条线是可见的。 我首先考虑的是,我不知道这是否实施是正确的。 另外,我想作为创建对象后,这些线路进行处理。 用户应该能够将它们移动,旋转它们,删除等等。我认为,我可以通过按住每条线的边缘的坐标就像一个缓冲器做到这一点,如果用户点击非常接近边缘,我可以处理手势。 但所有这一切听起来太复杂,我不知道这是否是不稳定的。

有,我应该用它来实现这样的事情,我完全错过了一些不同的方法?

Answer 1:

为了存储所绘制的线条,以及使用户能够操纵它们,只有中等复杂,在我看来。

创建一个Line类。 包括开始和结束坐标,颜色等作为类的字段和方法来删除,移动等。另外添加,这需要MotionEvent参数的方法。 在这种方法中,您使用MotionEvent,以确定是否该行已被触碰,并调整它的位置,因为你需要。

到一个集合或某种在你的扩展视图类的列表中所绘制的线路(如Line类的实例创建)店铺参考,ArrayList中应该做的。 然后,在事件onTouch,调用触摸检测每行的方法和MotionEvent传递给方法。

最后,覆盖视图的回调的onDraw通过对线路实例的引用的集合迭代绘制每一行。

你也可以添加更多的动作,比如长按删除等。这里是这种方法的(没有经过测试,从内存中写的)骨架。

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);
    }


}

玩得开心!



文章来源: Android - User paints lines with their finger