[英]Get data from ArrayList in Android
我正在绘图应用程序中,我在ArrayList
保存了每个路径和绘制,但是我不知道我在做什么,无法按预期访问结果。
这是我的代码:
// Class extend from SurfaceView
private ArrayList<Drawing> drawingList;
// inner class
public class Drawing {
private Path path;
private Paint paint;
public Drawing(Path path, Paint paint){
this.path = path;
this.paint = paint;
}
public Path getPath() {
return path;
}
public Paint getPaint() {
return paint;
}
}
// inside setup function initialize ArrayList
drawingList = new ArrayList<Drawing>();
// Actual working function
@Override
public boolean onTouchEvent(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawCanvas = surfaceHolder.lockCanvas();
drawPath.moveTo(touchX, touchY);
break;
case MotionEvent.ACTION_MOVE:
drawPath.lineTo(touchX, touchY);
break;
case MotionEvent.ACTION_UP:
drawingList.add(new Drawing(drawPath, drawPaint));
for(Drawing drawing : drawingList) {
if(drawing.getPath() != null) {
drawCanvas.drawPath(drawing.getPath(), drawing.getPaint());
}
}
drawPath.reset();
surfaceHolder.unlockCanvasAndPost(drawCanvas);
break;
default:
return false;
}
invalidate();
return true;
}
问题:如果我绘制路径,则在绘制新路径时,一次只能绘制一个路径,而上一个则自动删除。 如果删除drawPath.reset();
从代码绘制路径开始工作正常,您可以绘制任意数量的路径。 但是,当您更改drawPaint
的颜色(例如drawPaint.setColor(paintColor);
时,就会出现另一个问题drawPaint.setColor(paintColor);
颜色设置为所有路径而不是最后一个
花了一些时间后,我认为问题的原因是删除了drawPath.reset();
码。 因为当我们删除Java时,只考虑一条路径而不是多路径,这就是为什么更改颜色时将其设置为整个路径的原因。 但是我不知道我是对还是错。
尝试克服情况为了克服这种情况,我创建了ArrayList
来存储每个路径并在其中绘制,并且每次用户绘制新路径时都会重新绘制所有路径。 但这不是可行的问题是相同的,您一次只能绘制一条路径,而前一条则被删除。
你能让我知道我在想什么。
更新资料
每次创建新的Path
和Paint
对象并将其保存在drawingList
@Override
public boolean onTouchEvent(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
Path path = new Path();
Paint paint = new Paint();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawCanvas = surfaceHolder.lockCanvas();
paint.setColor(paintColor);
paint.setAntiAlias(true);
paint.setStrokeWidth(20);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(brushSize);
path.moveTo(touchX, touchY);
break;
case MotionEvent.ACTION_MOVE:
path.lineTo(touchX, touchY);
break;
case MotionEvent.ACTION_UP:
drawingList.add(new Drawing(path, paint));
for(Drawing drawing : drawingList) {
if(drawing.getPath() != null) {
drawCanvas.drawPath(drawing.getPath(), drawing.getPaint());
}
}
surfaceHolder.unlockCanvasAndPost(drawCanvas);
break;
default:
return false;
}
invalidate();
return true;
}
没问题画
原因我想这个原因是drawingList
保存的参考path
和paint
每个用户的触摸path
和paint
初始化新。 这就是为什么drawingList
丢失引用而无法绘制任何内容的原因。
克服情况的想法如果我们将原始值保存在drawingList
而不是参考中,我认为我们可以克服这种情况。 但是,我们该怎么做呢?
之所以不起作用,是因为您要在drawingList
中保存空path
和paint
如果您仔细查看代码,就在onTouchEvent
内初始化path
并进行paint
,则可以在ACTION_DOWN
分配这些变量。您知道ACTION_DOWN
仅在用户按住触摸时发生,这意味着只调用一次才能绘制一条路径,而onTouchEvent
却在用户移动。 这是第二次在onTouchEvent
调用path
和paint
初始化但未赋值时onTouchEvent
的问题 ,这就是为什么在ACTION_UP
调用时只有空变量,而您将空变量放入drawingList
。
为了克服这种情况,只需在onTouchEvent
外部初始化变量
像这样。
Path path;
Paint paint;
@Override
public boolean onTouchEvent(MotionEvent event) {
float touchX = event.getX();
float touchY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawCanvas = surfaceHolder.lockCanvas();
path = new Path();
paint = new Paint();
paint.setColor(paintColor);
paint.setAntiAlias(true);
paint.setStrokeWidth(20);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(brushSize);
path.moveTo(touchX, touchY);
break;
case MotionEvent.ACTION_MOVE:
path.lineTo(touchX, touchY);
break;
case MotionEvent.ACTION_UP:
drawingList.add(new Drawing(path, paint));
for(Drawing drawing : drawingList) {
if(drawing.getPath() != null) {
drawCanvas.drawPath(drawing.getPath(), drawing.getPaint());
}
}
surfaceHolder.unlockCanvasAndPost(drawCanvas);
break;
default:
return false;
}
invalidate();
return true;
}
drawCanvas.drawPath(drawing.getPath(),drawing.getPaint())
而不是使用drawing.getPath()使用drawing.get(position).getPath(),并且对于drawing.get(position).getPaint()相同
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.