所以我在绘图应用程序中遇到了这个奇怪的问题。
我从上到下,从左到右画了1到8行。
当我画线时,它显示为正在绘制所有其他线条的背后。每当我离开屏幕时,有时会弹出前面,这似乎是完全随机的。
我在任何时候都忽视了什么?
我的DrawView.java:
public class DrawView extends View implements OnTouchListener {
private Path path = new Path();
private Paint paint = new Paint();
private Map<Path, Paint> pathMap = new HashMap<Path, Paint>();
private boolean isScreenCleared = false;
public DrawView(Context context) {
super(context);
this.setOnTouchListener(this);
paint.setColor(Color.BLACK);
paint.setAntiAlias(true);
paint.setStrokeWidth(5);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
}
@Override
public void onDraw(Canvas canvas) {
if (isScreenCleared) {
pathMap.clear();
canvas.drawColor(Color.WHITE);
isScreenCleared = false;
} else {
//Current line
canvas.drawPath(path, paint);
//All other lines
for (Map.Entry<Path, Paint> p : pathMap.entrySet()) {
canvas.drawPath(p.getKey(), p.getValue());
}
}
}
public boolean onTouch(View view, MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
path = new Path();
path.reset();
path.moveTo(eventX, eventY);
return true;
case MotionEvent.ACTION_MOVE:
path.lineTo(eventX, eventY);
break;
case MotionEvent.ACTION_UP:
Paint newPaint = new Paint();
newPaint.set(paint);
pathMap.put(path, newPaint);
break;
default:
return false;
}
invalidate();
return true;
}
public float getRadius() {
return paint.getStrokeWidth();
}
public void setRadius(float radius) {
paint.setStrokeWidth(radius);
}
public void setColor(int color) {
paint.setColor(color);
System.out.println("Color set to: " + color);
}
public void clearScreen() {
isScreenCleared = true;
invalidate();
}
}
我在我的MainActivity中实例化DrawView,如下所示:
Relative layout = (RelativeLayout) findViewById(R.id.drawscreen);
DrawView dv = new DrawView(layout.getContext());
答案 0 :(得分:0)
不要使用HashMap存储路径。使用Vector并添加新路径到最后。然后,当你绘制它们并迭代你的矢量时,你将以正确的顺序绘制它们,最近的顶部。
来自HashMap文档:
Note that the iteration order for HashMap is non-deterministic.
答案 1 :(得分:0)
好吧,我发现问题归功于Spartygw但发现了比Vector
更好的东西。
有一个LinkedHashMap
是确定性的。
因此使用它可以解决问题。
同时强>
它绘制了其他所有内容而绘图是我的一个快速错误,因为我显然需要在整个(链接)HashMap之后绘制当前行。