如何防止onDraw的Paint影响ArrayList <rect>中的所有矩形?

时间:2019-05-05 08:50:51

标签: java android

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

为了防止形状消失,每次绘制新形状时,将其添加到ArrayList或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;
}

问题是添加到arraylist中的形式为长方体。add(new Rect(startX,startY,pointX,pointY),Paint没有第五个参数来保存该特定矩形的样式选择,也不允许那。 我现在假设onDraw方法采用整个arraylist,然后将一种当前的Paint样式应用于整个对象。

那我应该用什么替代方法呢?

First shape with a set style

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

我尝试使用Hashmap将Rect作为键存储,并将Paint对象存储为值,然后在onDraw()中对其进行迭代,但是当更改paint的设置时,它仍保持切换样式。 (请参阅图片)

@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;
}

1 个答案:

答案 0 :(得分:0)

好吧,看来我设法解决了自己的问题。除了使用HashMap之外,关键似乎在于在touch事件内创建一个新的Paint实例,并将其作为值附加到哈希图中。

所以这样的东西(尚未在所有吸气剂中完全准备好,但可以使用):

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;