Android用户用手指画线条

Android用户用手指画线条,android,android-canvas,draw,touch-event,ontouchlistener,Android,Android Canvas,Draw,Touch Event,Ontouchlistener,我想在Android上建立一个工具,用户可以在图片上绘制一些简单的对象(如线、圆或箭头)。我首先开始尝试线条部分,事实上我可以成功地画出它。逻辑是,用户在一个点上轻敲,然后拖动手指,绘制线条。我使用这样的类(它基于): 从活动代码中,我使用onTouch侦听器,如下所示: @Override public boolean onTouch(View view, MotionEvent event) { switch (event.getAction()) { case M

我想在Android上建立一个工具,用户可以在图片上绘制一些简单的对象(如线、圆或箭头)。我首先开始尝试线条部分,事实上我可以成功地画出它。逻辑是,用户在一个点上轻敲,然后拖动手指,绘制线条。我使用这样的类(它基于):

从活动代码中,我使用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));   
}
每次移动时,我都会重新创建整个视图,这样从起点到终点只有一条线是可见的。我首先担心的是,我不知道这个实现是否正确。此外,我希望这些线在创建后作为对象处理。用户应该能够移动、旋转、删除等。我认为我可以通过在缓冲区中保持每行边的坐标来实现这一点,如果用户点击非常接近一条边,我可以处理该手势。但所有这些听起来都太复杂了,我不知道这是否不稳定


我是否应该使用一些不同的方法来实现我完全不知道的东西?

在我看来,存储绘制的线条并让用户能够操纵它们只是稍微复杂一些

创建一个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);
    }


}
类行
公众浮标x1、x2、y1、y2;
公共无效检测按钮(MotionEvent MotionEvent){
//编码以检测触摸并相应调整x和ys
}
类DrawView扩展了视图{
私有ArrayList行=新建ArrayList();
....
....
@凌驾
公共空白onDraw(画布){
super.onDraw();
用于(行:行){
帆布画线(线x1,线y1,线x2,线y2);
}
}
@凌驾
公共布尔onTouch(视图、运动事件){
....
....
用于(行:行){
line.detectTouch(运动事件);
}
}

玩得开心!

你的实现很奇怪。要实现这样一个程序,你需要一个
视图
,覆盖它的
onDraw
方法,处理用户的拖动动作,并调用
视图。invalidate()
相应地。您的意思是创建一个扩展view的对象?就像我作为绘制类使用的DrawView?但是对该对象的实例调用invalidate不会删除以前的行。您是否有指向某个示例的链接,以便我能理解您的意思?这看起来很有希望,谢谢!我会尝试并让您知道根据你的建议,我成功地使它工作得非常好,直到现在!非常感谢!嘿,乔治。很高兴听到它的帮助。祝你好运,,,嘿,你能给出演示的完整代码吗..要从左到右移动动画,在左边添加新行..我想这样发展::
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);
    }


}