Java 使用多种颜色绘制路径

Java 使用多种颜色绘制路径,java,android,canvas,Java,Android,Canvas,我正在使用android.graphics.Path在android.graphics.Canvas上绘图。我想允许用户使用一系列颜色和笔划宽度进行绘制,但是,无论何时更改颜色或笔划宽度,都会使用新的颜色或笔划宽度重新绘制所有内容。我怎样才能解决这个问题 xml: java ChangeWidthColor它的my接口有2个方法changeColor() 和changeWidth() 无论何时修改与UI相关的内容,都需要在自定义视图中调用invalidate()。因此,更新的方法将是: @Ove

我正在使用android.graphics.Path在android.graphics.Canvas上绘图。我想允许用户使用一系列颜色和笔划宽度进行绘制,但是,无论何时更改颜色或笔划宽度,都会使用新的颜色或笔划宽度重新绘制所有内容。我怎样才能解决这个问题

xml:

java ChangeWidthColor它的my接口有2个方法changeColor() 和changeWidth()


无论何时修改与UI相关的内容,都需要在自定义视图中调用
invalidate()
。因此,更新的方法将是:

@Override
public void changeColor(int color) {
    paint.setColor(color);
    invalidate();

}

@Override
public void changeWidth(float width) {
    paint.setStrokeWidth(width);
    invalidate();
}

此解决方案维护用于存储颜色的路径对象列表和整数列表。这些列表是并行的-路径和颜色对的每个列表中有1个条目。onDraw迭代这些列表,用相应的颜色绘制每个路径

每次用户单击以更改颜色时,都会创建一个新路径。ACTION_DOWN和ACTION_MOVE在路径上调用moveTo(x,y)和lineTo(x,y),ACTION_UP会将路径和当前颜色添加到列表中

注意:我还没有实现笔划宽度的解决方案,但是,您应该能够按照示例自己添加这个

public class DrawLine extends View {

    private Path path = new Path();
    private Paint paint = new Paint();
    private int currentColor = Color.BLACK;
    private List<Path> paths = new ArrayList<Path>();
    private List<Integer> colors = new ArrayList<Integer>();
    private float x;
    private float y;

    public DrawLine(Context context) {
        super(context);
        init(context);
    }

    public DrawLine(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public DrawLine(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    public void init(Context context) {
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.MITER);
        paint.setColor(currentColor);
    }

    public void changeColor(int color) {
        currentColor = color;
        path = new Path();
    }

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (int x = 0; x < paths.size(); x++) {
            paint.setColor(colors.get(x));
            canvas.drawPath(paths.get(x), paint);
        }
    }

    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                x = event.getX();
                y = event.getY();
                path.moveTo(x, y);
                break;
            case MotionEvent.ACTION_MOVE:
                x = event.getX();
                y = event.getY();
                path.lineTo(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                paths.add(path);
                colors.add(currentColor);
                invalidate();
                break;
        }
        invalidate();
        return true;
    }
}
公共类抽绳扩展视图{
私有路径路径=新路径();
私人油漆=新油漆();
private int currentColor=Color.BLACK;
私有列表路径=新的ArrayList();
私有列表颜色=新的ArrayList();
私人浮动x;
私人游船;
公共抽绳(上下文){
超级(上下文);
init(上下文);
}
公共绘制线(上下文、属性集属性){
超级(上下文,attrs);
init(上下文);
}
公共绘制线(上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
init(上下文);
}
公共void init(上下文){
绘制.设置样式(绘制.样式.笔划);
绘制.设置行程连接(绘制.连接.斜接);
paint.setColor(当前颜色);
}
公共void changeColor(int-color){
当前颜色=颜色;
路径=新路径();
}
受保护的void onDraw(画布){
super.onDraw(帆布);
对于(int x=0;x
`

公共类DrawlineExtends视图实现了ChangeWidthColor{
私有路径路径=新路径();
私人油漆=新油漆();
private int currentColor=Color.BLACK;
专用浮动宽度=1f;
公共浮动x;
公众浮躁;
private LinkedList color=new LinkedList();
私有LinkedList widthSize=新LinkedList();
私有LinkedList路径=新LinkedList();
公共抽绳(上下文){
超级(上下文);
init(上下文);
}
公共绘制线(上下文、属性集属性){
超级(上下文,attrs);
init(上下文);
}
公共绘制线(上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
init(上下文);
}
公共void init(上下文){
绘制.设置样式(绘制.样式.笔划);
绘制.设置行程连接(绘制.连接.斜接);
paint.setColor(当前颜色);
油漆。设置行程宽度(5f);
}
@凌驾
公共void changeColor(int-color){
当前颜色=颜色;
路径=新路径();
}
@凌驾
公共空隙宽度(浮动宽度){
这个。宽度=宽度;
路径=新路径();
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
对于(int i=0;i
如果我画的线的默认颜色是黑色,我单击按钮“蓝色”,我的第一行和第二行是蓝色。但第一个必须是黑色(默认值),第二个必须是蓝色。为什么有两条线是蓝色的?每次单击都会用新的油漆重新绘制整个路径。一种方法是维护一个路径和绘制对象的列表,然后在onDraw中迭代。@burntsugar您可以一步一步地告诉我该怎么做,我是android新手
public class DrawLine extends View implements ChangeWidthColor {

    private Paint paint = new Paint();
    private Path path = new Path();
    public float x;
    public float y;

    public DrawLine(Context context) {
        super(context);
        init(context);

    }

    public DrawLine(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public DrawLine(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    public void init(Context context) {

        //paint.setColor(Color.BLACK);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.MITER);
        //paint.setStrokeWidth(5f);

    }

    @Override
    public void changeColor(int color) {
        paint.setColor(color);


    }

    @Override
    public void changeWidth(float width) {
        paint.setStrokeWidth(width);

    }


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

    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {


        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                x= event.getX();
                y= event.getY();
                path.moveTo(x, y);
                break;
            case MotionEvent.ACTION_MOVE:
                x= event.getX();
                y= event.getY();
                path.lineTo(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                invalidate();
                break;
        }
        invalidate();
        return true;
    }
}
@Override
public void changeColor(int color) {
    paint.setColor(color);
    invalidate();

}

@Override
public void changeWidth(float width) {
    paint.setStrokeWidth(width);
    invalidate();
}
public class DrawLine extends View {

    private Path path = new Path();
    private Paint paint = new Paint();
    private int currentColor = Color.BLACK;
    private List<Path> paths = new ArrayList<Path>();
    private List<Integer> colors = new ArrayList<Integer>();
    private float x;
    private float y;

    public DrawLine(Context context) {
        super(context);
        init(context);
    }

    public DrawLine(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public DrawLine(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    public void init(Context context) {
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.MITER);
        paint.setColor(currentColor);
    }

    public void changeColor(int color) {
        currentColor = color;
        path = new Path();
    }

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (int x = 0; x < paths.size(); x++) {
            paint.setColor(colors.get(x));
            canvas.drawPath(paths.get(x), paint);
        }
    }

    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                x = event.getX();
                y = event.getY();
                path.moveTo(x, y);
                break;
            case MotionEvent.ACTION_MOVE:
                x = event.getX();
                y = event.getY();
                path.lineTo(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                paths.add(path);
                colors.add(currentColor);
                invalidate();
                break;
        }
        invalidate();
        return true;
    }
}
public class DrawLine extends View implements ChangeWidthColor {


    private Path path = new Path();
    private Paint paint = new Paint();
    private int currentColor = Color.BLACK;
    private float width = 1f;
    public float x;
    public float y;

    private LinkedList<Integer> color = new LinkedList<Integer>();
    private LinkedList<Float> widthSize = new LinkedList<Float>();
    private LinkedList<Path> paths = new LinkedList<Path>();

    public DrawLine(Context context) {
        super(context);
        init(context);


    }

    public DrawLine(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public DrawLine(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    public void init(Context context) {
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.MITER);
        paint.setColor(currentColor);
        paint.setStrokeWidth(5f);

    }

    @Override
    public void changeColor(int color) {
        currentColor = color;
        path = new Path();


    }

    @Override
    public void changeWidth(float width) {
        this.width = width;
        path = new Path();


    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        for (int i = 0; i < paths.size(); i++) {
            paint.setStrokeWidth(widthSize.get(i));
            paint.setColor(color.get(i));
            canvas.drawPath(paths.get(i), paint);
        }


    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                x = event.getX();
                y = event.getY();
                path.moveTo(x, y);
                break;

            case MotionEvent.ACTION_MOVE:
                x = event.getX();
                y = event.getY();
                path.lineTo(x, y);
                invalidate();

                break;
            case MotionEvent.ACTION_UP:

                color.add(currentColor);
                paths.add(path);
                widthSize.add(width);
                break;
            default:
                return false;
        }
        invalidate();
        return true;
    }


}