AndroidcanvasdrawLine

我有一个自定义的布局,根据触摸input绘制一条线。 我已经画出了这条线,但是当用户触摸屏幕时,线条消失了,并且画了一条新线。 我想要它做的是画一条新的线,并把上一行留在那里。 这是我的代码:

import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; public class DrawView extends View { Paint paint = new Paint(); float startX; float startY; float stopX; float stopY; public DrawView(Context context, AttributeSet attrs) { super(context, attrs); paint.setAntiAlias(true); paint.setStrokeWidth(6f); paint.setColor(Color.BLACK); paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); } @Override protected void onDraw(Canvas canvas) { canvas.drawLine(startX, startY, stopX, stopY, paint); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startX = event.getX(); startY = event.getY(); return true; case MotionEvent.ACTION_MOVE: stopX = event.getX(); stopY = event.getY(); break; case MotionEvent.ACTION_UP: stopX = event.getX(); stopY = event.getY(); break; default: return false; } Invalidate(); return true; } } 

Solutions Collecting From Web of "AndroidcanvasdrawLine"

你需要存储所有的行而不是最后一行。
下面的代码是完全未经testing的,但希望给你一个总的想法。

 import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import java.util.ArrayList; class Line { float startX, startY, stopX, stopY; public Line(float startX, float startY, float stopX, float stopY) { this.startX = startX; this.startY = startY; this.stopX = stopX; this.stopY = stopY; } public Line(float startX, float startY) { // for convenience this(startX, startY, startX, startY); } } public class DrawView extends View { Paint paint = new Paint(); ArrayList<Line> lines = new ArrayList<Line>(); public DrawView(Context context, AttributeSet attrs) { super(context, attrs); paint.setAntiAlias(true); paint.setStrokeWidth(6f); paint.setColor(Color.BLACK); paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); } @Override protected void onDraw(Canvas canvas) { for (Line l : lines) { canvas.drawLine(l.startX, l.startY, l.stopX, l.stopY, paint); } } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { lines.add(new Line(event.getX(), event.getY())); return true; } else if ((event.getAction() == MotionEvent.ACTION_MOVE || event.getAction() == MotionEvent.ACTION_UP) && lines.size() > 0) { Line current = lines.get(lines.size() - 1); current.stopX = event.getX(); current.stopY = event.getY(); Invalidate(); return true; } else { return false; } } } 

Android框架API提供了一套2D绘图API,允许您将自己的自定义graphics渲染到canvas上,或者修改现有视图来自定义其外观和风格。 绘制2Dgraphics时,通常可以通过以下两种方式之一来完成:

从您的布局绘制您的graphics或animation到视图对象。 通过这种方式,您的graphics绘制由系统的正常View层次结构绘制过程来处理 – 您只需定义要在View内部的graphics。 直接绘制您的graphics到canvas。 这样,你可以亲自调用相应的类的onDraw()方法(将Canvas传递给它),或者调用其中一个Canvas draw …()方法(如drawPicture())。 这样做,你也可以控制任何animation。