绘制多条线并记住它们的厚度

时间:2013-05-08 23:24:12

标签: android path drawing hashmap paint

可能是因为我度过了漫长的一天而已经很晚了,但我似乎无法弄清楚我做错了什么。

我只是希望能够在每个线条的手指位置画线,以获得不同的宽度/颜色等。

每当触发ACTION_DOWN时,我都会创建一个新的Path并继续将其附加到ACTION_MOVE。当ACTION_UP被触发时,我将当前的PathPaint放在我的HashMap中,从而保存Path使用哪个Paint,对吗?

当我从这个课程外面拨打setRadius(float radius)时,我会调用paint.setStrokeWidth(radius),从而更改当前Paint的笔画宽度。

但是出于某种原因,我每次拨打setStrokeWidth(radius) 所有我的Map.Entry的变化?从而使每个 Paint的笔画宽度成为'新'笔画宽度,并使用新的笔画宽度重新绘制所有内容。

这可能非常明显,但我似乎无法找到错误。

这是我的DrawView.java。

package com.example.paintandprint;

import java.util.HashMap;
import java.util.Map;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class DrawView extends View implements OnTouchListener {
    Path path = new Path();
    Paint paint = new Paint();

    Map<Path, Paint> pathMap = new HashMap<Path, Paint>();

    public DrawView(Context context) {
        super(context);
        setFocusable(true);
        setFocusableInTouchMode(true);

        this.setOnTouchListener(this);

        paint.setColor(Color.BLACK);
        paint.setAntiAlias(true);
        paint.setStrokeWidth(5);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
    }

    @Override
    public void onDraw(Canvas canvas) {
        canvas.drawPath(path, paint);

        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:
            pathMap.put(path, paint);
            break;
        default:
            return false;
        }

        invalidate();
        return true;
    }

    public float getRadius() {
        return paint.getStrokeWidth();
    }

    public void setRadius(float radius) {
        paint.setStrokeWidth(radius);
    }
}

提前致谢!

1 个答案:

答案 0 :(得分:3)

在这些方面:

case MotionEvent.ACTION_UP:
    pathMap.put(path, paint);
    break;

你在“油漆”中发送什么?它不是指向填充了预设值的结构的指针。是不是每个pathMap.put都发送指向相同数据的相同指针?这就是为什么如果你改变一次,你就到处改变它。

您需要为您创建的每个pathMap.put创建一个新的Paint,并将类的绘制的当前值复制到它。

case MotionEvent.ACTION_UP:
    Paint newPaint = new Paint();
    newPaint.set(paint); //copies the values over from the current class's paint
    pathMap.put(path, newPaint);
    break;