Android 结束画布与润色

Android 结束画布与润色,android,canvas,graphic,Android,Canvas,Graphic,我用画布和触摸画线 但我的问题是,当我们再次打开屏幕时,前一行被删除了 我想用触摸画一条新的线,但最后一条线不会被删除 Tnx 受保护的void onDraw(画布){ super.onDraw(帆布); //在绘制时使用画布上的mPaint绘制mPath 帆布抽绳(sX、sY、eX、eY、mPaint); } 画布和绘图的一个很好的示例下面是一些示例代码,让您开始学习。每次用户触摸时,都会创建一个新的行,并将其添加到行的列表中 main活动 public class MainActivity

我用画布和触摸画线 但我的问题是,当我们再次打开屏幕时,前一行被删除了 我想用触摸画一条新的线,但最后一条线不会被删除 Tnx 受保护的void onDraw(画布){ super.onDraw(帆布); //在绘制时使用画布上的mPaint绘制mPath 帆布抽绳(sX、sY、eX、eY、mPaint); }


画布和绘图的一个很好的示例

下面是一些示例代码,让您开始学习。每次用户触摸时,都会创建一个新的
,并将其添加到
行的列表中

main活动

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    DrawLineView drawLineView = new DrawLineView(this);
    setContentView(drawLineView);
  }
}
DrawLineView

public class DrawLineView extends View {

  List<Line> lines;
  Paint black;

  public DrawLineView(Context context) {
    super(context);

    // sets up a new list of Lines
    lines = new ArrayList<>(); 

    black = new Paint();
    black.setColor(Color.BLACK);
    black.setStrokeWidth(5);
  }

  @Override
  public void onDraw(Canvas canvas) {
    // for each of your Lines, draw them on the canvas
    for (Line line : lines) { 
      canvas.drawLine(line.xStart, line.yStart, line.xEnd, line.yEnd, black);
    }

    invalidate();
  }


  @Override
  public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {

      case MotionEvent.ACTION_DOWN:
        Line line = new Line(event.getX(), event.getY(), event.getX(), event.getY());
        lines.add(line);
        break;

      case MotionEvent.ACTION_MOVE:
        lines.get(lines.size() - 1).xEnd = event.getX();
        lines.get(lines.size() - 1).yEnd = event.getY();
        break;
    }
    return true;
  }

  class Line {
    public float xStart;
    public float yStart;
    public float xEnd;
    public float yEnd;

    public Line(float xStart, float yStart, float xEnd, float yEnd) {
      this.xStart = xStart;
      this.yStart = yStart;
      this.xEnd = xEnd;
      this.yEnd = yEnd;
    }
  }
}
公共类DrawLineView扩展视图{
列出行;
漆成黑色;
公共DrawLineView(上下文){
超级(上下文);
//设置新的行列表
行=新的ArrayList();
黑色=新油漆();
黑色。设置颜色(颜色。黑色);
黑色。设定行程宽度(5);
}
@凌驾
公共空白onDraw(画布){
//对于每条线,在画布上绘制它们
对于(行:行){
canvas.drawLine(line.xStart、line.yStart、line.xEnd、line.yEnd、黑色);
}
使无效();
}
@凌驾
公共布尔onTouchEvent(运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
Line Line=新行(event.getX(),event.getY(),event.getX(),event.getY());
行。添加(行);
打破
case MotionEvent.ACTION\u移动:
get(lines.size()-1).xEnd=event.getX();
get(lines.size()-1).yEnd=event.getY();
打破
}
返回true;
}
班级线{
公共浮动xStart;
公共艺术;
公共浮点数;
公众游船;
公用线路(浮点xStart、浮点yStart、浮点xEnd、浮点yEnd){
this.xStart=xStart;
this.yStart=yStart;
this.xEnd=xEnd;
this.yEnd=yEnd;
}
}
}

Tnx对于您的答案,我以前在上面的链接中看到过,请在upTouch中使用:mPath.LineTo(mx,my);但我不能用这个,因为我画了一条线,而不是路径,我在第一篇文章中附加了它,这是我在这个网站上第二次提问,我想在帖子中插入我的全部代码,但网站erorI很抱歉,但这仍然不够,当你使用这些sX,eX等变量时,我至少需要所有的位置。。。或者我可以为您搜索其他教程:/I插入所有使用sX、sY、eX、eY、和sry的地方,因为我的英语不好。我认为您的问题是您总是重写存储触摸开始和触摸的变量,您应该将它们放在上面示例中的列表中。请粘贴一些code.tnx作为您的答案,但我非常简单,如果有可能用我自己的代码tnxSure解决我的问题,我不会从ebove代码中下载任何东西。您的代码的问题是,每次用户触摸时,应用程序都会覆盖sX、sY、eX和eY的值。我的代码之所以有效,是因为每次触摸屏幕时,我都会创建四个新变量(存储在我的Line类中):xStart、yStart、xEnd、yEnd,并将它们添加到值列表中。这样,我就不会覆盖以前的值。您需要创建一个值列表,每次用户触摸时,您都必须在此列表中添加一个条目。非常感谢,我不知道问题出在哪里,但是这个链接呢?这与我的代码(upTouch除外)完全相同,工作正常
public class DrawLineView extends View {

  List<Line> lines;
  Paint black;

  public DrawLineView(Context context) {
    super(context);

    // sets up a new list of Lines
    lines = new ArrayList<>(); 

    black = new Paint();
    black.setColor(Color.BLACK);
    black.setStrokeWidth(5);
  }

  @Override
  public void onDraw(Canvas canvas) {
    // for each of your Lines, draw them on the canvas
    for (Line line : lines) { 
      canvas.drawLine(line.xStart, line.yStart, line.xEnd, line.yEnd, black);
    }

    invalidate();
  }


  @Override
  public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {

      case MotionEvent.ACTION_DOWN:
        Line line = new Line(event.getX(), event.getY(), event.getX(), event.getY());
        lines.add(line);
        break;

      case MotionEvent.ACTION_MOVE:
        lines.get(lines.size() - 1).xEnd = event.getX();
        lines.get(lines.size() - 1).yEnd = event.getY();
        break;
    }
    return true;
  }

  class Line {
    public float xStart;
    public float yStart;
    public float xEnd;
    public float yEnd;

    public Line(float xStart, float yStart, float xEnd, float yEnd) {
      this.xStart = xStart;
      this.yStart = yStart;
      this.xEnd = xEnd;
      this.yEnd = yEnd;
    }
  }
}