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