gpt4 book ai didi

使用多个路径和绘制对象时,Android Canvas 会被清理

转载 作者:行者123 更新时间:2023-11-30 03:43:48 26 4
gpt4 key购买 nike

谁能解释一下为什么这段代码没有绘制出所有的对象?

public class A extends View {
private Paint paint = new Paint();
private Path path = new Path();
ArrayList<Pair<Path, Paint>> paths = new ArrayList<Pair<Path, Paint>>();


public A(Context context) {
super(context);
}

@Override
protected void onDraw(Canvas canvas) {
for (Pair<Path, Paint> p : paths) {
canvas.drawPath(p.first, p.second);
}
canvas.drawPath(path, paint);
}



@Override
public boolean onTouchEvent(MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeWidth(3f);

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
int color = Color.rgb(new Random().nextInt(255),
new Random().nextInt(255),
new Random().nextInt(255));
paint.setColor(color);
path.reset(); //new stroke, get old one erased
int historySize = event.getHistorySize();
for (int i = 0; i > historySize; i++) {
path.moveTo(eventX, eventY);
}
path.moveTo(eventX, eventY);

return true;
case MotionEvent.ACTION_MOVE:
path.lineTo(eventX, eventY);
return true;
case MotionEvent.ACTION_UP:
path.lineTo(eventX, eventY);
// End of stroke, add this to the collection
paths.add(new Pair<Path, Paint>(path, paint));
break;
default:
break;
}
// Schedules a repaint.
invalidate();
return true;
}

我用 onTouchEvent 捕捉每一个笔画,我创建了不同的路径/绘画对象,存储在一对对象中。可悲的是,在我的 OnDraw 中,当我尝试将它们全部绘制时失败了..我已经阅读了一些主题但没有找到正确答案。每次有人建议在位图中创建和工作并将其绘制到屏幕上,但我想避免这种解决方案。

谢谢你的帮助!

最佳答案

问题是您总是使用相同的 PathPaint 对象。每次触发 MotionEvent.ACTION_DOWN 时,您都应该创建新的 PathPaint

关于使用多个路径和绘制对象时,Android Canvas 会被清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15320386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com