Java 如何从android中撤消路径?
我正在尝试删除画布上绘制的最后一条路径。到目前为止,我尝试在ArrayList中添加路径,但没有找到任何方法可以轻松地从画布中删除路径Java 如何从android中撤消路径?,java,android,Java,Android,我正在尝试删除画布上绘制的最后一条路径。到目前为止,我尝试在ArrayList中添加路径,但没有找到任何方法可以轻松地从画布中删除路径 public class PaintView extends View { private Bitmap mBitmap; private Canvas mCanvas; private Path mPath; private Paint mPaint; private static final int TOUCH_TO
public class PaintView extends View {
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mPaint;
private static final int TOUCH_TOLERANCE_DP = 20;
private static final int BACKGROUND = Color.TRANSPARENT;
private List<Point> mPoints = new ArrayList<Point>();
private int mLastPointIndex = 0;
private int mTouchTolerance;
private boolean isPathStarted = false;
private boolean canCreatePoints = true;
private Polygon poly;
private Builder build;
private ArrayList<Polygon> polyList;
private ArrayList<Path> undoPath, redoPath;
public PaintView(Context context) {
super(context);
mCanvas = new Canvas();
mPath = new Path();
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(Color.BLACK);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(12);
mTouchTolerance = dp2px(TOUCH_TOLERANCE_DP);
polyList = new ArrayList<Polygon>();
undoPath = new ArrayList<Path>();
redoPath = new ArrayList<Path>();
}
@Override
protected void onSizeChanged(int width, int height, int oldWidth,
int oldHeight) {
super.onSizeChanged(width, height, oldWidth, oldHeight);
clear();
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(BACKGROUND);
canvas.drawBitmap(mBitmap, 0, 0, null);
canvas.drawPath(mPath, mPaint);
for(Path p : undoPath) {
canvas.drawPath(p, mPaint);
}
for (Point point : mPoints) {
canvas.drawPoint(point.x, point.y, mPaint);
}
}
贝娄:我通过按钮的动作使我的多边形变成芬兰语。我创建了一条从最后一点到第一点的路径,并将其绘制在画布上
public void finnishDraw(){
if( mPoints.size() > 1 )
{
// start point
Point p = mPoints.get(0);
mPath.moveTo(p.x, p.y);
// end point
p = mPoints.get( mPoints.size() - 1);
mPath.lineTo(p.x, p.y);
mCanvas.drawPath(mPath, mPaint);
mPath.reset();
invalidate();
int x[] = new int[mPoints.size()];
int y[] = new int[mPoints.size()];
build = new Builder();
for(int i=0 ; i<mPoints.size() ; i++)
{
p = mPoints.get(i);
x[i] = p.x;
y[i] = p.y;
build.addVertex(new Points(x[i],y[i]));
Log.i("TEST","Adaug la builder punctele "+x[i]+" si "+y[i]);
}
poly = build.build();
polyList.add(poly);
mPoints.clear();
mLastPointIndex = 0;
}
}
public void finnishDraw(){
如果(mPoints.size()>1)
{
//起点
点p=mPoints.get(0);
百万帕移动到(每年,每年);
//终点
p=mPoints.get(mPoints.size()-1);
英里/小时线路至(年、月、日);
mCanvas.drawPath(mPath,mPaint);
mPath.reset();
使无效();
int x[]=新的int[mPoints.size()];
int y[]=新的int[mPoints.size()];
build=newbuilder();
对于(int i=0;i您无法撤消画布上的绘图路径。从:
通过画布,您的绘图实际上是在基础图形上执行的
位图,放置在窗口中
正如您所说,在绘制当前位图之前,您需要一个备份位图来保存当前位图的状态,例如使用
看看和(最后一个是针对iPhone的,但基本思想是一样的)
另一种减少内存消耗的方法是保存要在画布上绘制的对象的状态,并按需绘制(当需要显示部分或全部结果时)。要删除最后一条路径,请仅应用此功能:
public void clearLast(){
if(!paths.isEmpty()) {
backgroundColor = DEFAULT_BG_COLOR;
int size = paths.size();
paths.remove(paths.get(size-1));
normal();
invalidate();
}
}
public void clearLast(){
if(!paths.isEmpty()) {
backgroundColor = DEFAULT_BG_COLOR;
int size = paths.size();
paths.remove(paths.get(size-1));
normal();
invalidate();
}
}