gpt4 book ai didi

java - 如何防止 onDraw 的 Paint 影响 ArrayList 中的所有矩形?

转载 作者:行者123 更新时间:2023-12-02 05:59:00 25 4
gpt4 key购买 nike

我为绘图应用程序编写了一些代码,以在 Android 环境中学习 Java。我可以选择徒手画矩形、椭圆形。我还可以更改 Paint 属性,例如线宽、颜色等。

为了防止形状消失,每次绘制新形状时,都会将其添加到 ArrayList 或 ArrayList(椭圆形)中

但是,当我使用其他代码来更改例如线宽或填充时,它会影响所有已存在的形状,而不仅仅是我当前正在绘制的形状。

如果没有数组列表,如果我从绘制矩形切换到椭圆形,形状就会消失。

float pointX;
float pointY;
float startX;
float startY;
private ArrayList<Rect> rectangles = new ArrayList<Rect>(); //rectangle array




@Override
protected void onDraw(Canvas canvas) {
// draw background
canvas.drawBitmap(bitmap, 0, 0, paintScreen);


for(Rect rect : rectangles){
canvas.drawRect(rect,paintLine);

//other additional drawMethods exist here for ovals and freehand pathmap





@Override
public boolean onTouchEvent(MotionEvent event) {

if(rectangleDraw){

pointX = event.getX();
pointY = event.getY();
// Checks for the event that occurs
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = pointX;
startY = pointY;
return true;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
rectangles.add(new Rect((int)startX, (int)startY, (int)pointX, (int)pointY));
break;
default:
return false;
}
// Force a view to draw again
invalidate();
return true;
}

问题是添加到数组列表中时采用矩形.add(new Rect(startX,startY,pointX,pointY) 的形式,并且 Paint 没有第五个参数来保存特定矩形的样式选择,也不允许那。我假设现在 onDraw 方法采用整个数组列表,并在整个事物上应用一个当前的 Paint 样式。

那么我应该使用什么替代方案?

First shape with a set style

The issue: second shape with a new color also changes first shape.

我尝试使用 Hashmap 将 Rect 存储为键,将 Paint 对象存储为值,然后在 onDraw() 中对其进行迭代,但当绘制的设置更改时,它仍然会不断切换样式。 (引用图片)

@Override
protected void onDraw(Canvas canvas) {

canvas.drawBitmap(bitmap, 0, 0, paintScreen);


for(Rect rect : rectanglePaint.keySet()){


canvas.drawRect(rect, rectanglePaint.get(rect));
}



@Override
public boolean onTouchEvent(MotionEvent event) {

if(rectangleDraw){

pointX = event.getX();
pointY = event.getY();
// Checks for the event that occurs
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = pointX;
startY = pointY;
return true;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:

Rect rectX = (new Rect((int)startX, (int)startY, (int)pointX, (int)pointY));
rectanglePaint.put(rectX, paintLine);

break;
default:
return false;
}
// Force a view to draw again
invalidate();
return true;
}

最佳答案

好吧,看来我已经解决了我自己的问题。除了使用 HashMap 之外,似乎关键是在触摸事件中创建一个新的 Paint 实例,并将其作为值附加到 hashmap。

像这样的东西(所有 setter/getter 尚未完全准备好,但可以工作):

case MotionEvent.ACTION_UP:


Paint paintRectangle = new Paint();
paintRectangle.setAntiAlias(true);
paintRectangle.setColor(paintLine.getColor());
paintRectangle.setStyle(Paint.Style.STROKE);
paintRectangle.setStrokeWidth(paintLine.getStrokeWidth());
paintRectangle.setStrokeCap(Paint.Cap.ROUND);

Rect rectX = (new Rect((int)startX, (int)startY, (int)pointX, (int)pointY));
rectanglePaint.put(rectX, paintRectangle);
break;

关于java - 如何防止 onDraw 的 Paint 影响 ArrayList<Rect> 中的所有矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55990280/

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