【发布时间】:2014-07-16 17:20:12
【问题描述】:
我正在为 android 制作一个绘图应用程序,我需要一些帮助来添加填充工具。
我希望该工具能够填充填充,并像在 Microsoft Paint 中一样运行,但在手机上。
我有一个在画布上绘制路径的自定义视图。我为不同的钢笔和画笔绘制不同的路径,并允许用户选择线条粗细和颜色。
当我这样做时:
paint.setStyle(Paint.Style.FILL);
我画画,我没有得到我想要的填充。
我收到了一些使用“Flood Fill Algorithm”的建议,但我不知道如何在我的代码中实现它。
我可以去哪里查看我正在尝试做的事情的示例?有没有人有示例代码向我展示如何使该工具与我的 android 视图一起使用?
编辑:
CartoonView.java:
public class CartoonView extends View {
ArrayList<Paint> paints = new ArrayList<Paint>();
ArrayList<Path> paths = new ArrayList<Path>();
int color;
int thickness;
boolean pencilSelected;
public boolean isPencilSelected() {
return pencilSelected;
}
public void setPencilSelected(boolean pencilSelected) {
this.pencilSelected = pencilSelected;
}
public ArrayList<Paint> getPaints() {
return paints;
}
public void setPaints(ArrayList<Paint> paints) {
this.paints = paints;
}
public ArrayList<Path> getPaths() {
return paths;
}
public void setPaths(ArrayList<Path> paths) {
this.paths = paths;
}
public int getThickness() {
return thickness;
}
public int getColor() {
return color;
}
public CartoonView(Context context, AttributeSet attrs) {
super(context, attrs);
color = Color.BLACK;
thickness = 3;
pencilSelected = true;
createPaint();
}
@Override
protected void onDraw(Canvas canvas) {
for (Path path : paths) {
canvas.drawPath(path, paints.get(paths.indexOf(path)));
}
}
public void setPaintColor(int newColor) {
color = newColor;
createPaint();
}
public void setPaintThickness(int newThickness) {
thickness = newThickness;
createPaint();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.isEnabled()) {
Path path;
if (paths.size() == 0) {
path = new Path();
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(5f);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setColor(color);
paint.setStrokeWidth(thickness);
thickness = (int) paint.getStrokeWidth();
paths.add(path);
paints.add(paint);
} else {
path = paths.get(paths.size() - 1);
}
float eventX = event.getX();
float eventY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
path.moveTo(eventX, eventY);
return true;
case MotionEvent.ACTION_MOVE:
path.lineTo(eventX, eventY);
break;
default:
return true;
}
invalidate();
}
return true;
}
public void createPaint() {
Path path = new Path();
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(5f);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setColor(color);
paint.setStrokeWidth(thickness);
paths.add(path);
paints.add(paint);
}
public void clearView(){
paths.clear();
paints.clear();
invalidate();
}
}
【问题讨论】:
-
用颜色填充封闭区域?
-
使用洪水填充算法
-
@Raghunandan 好的,我会试试的。
-
请展示您目前拥有的代码 - 如何实现洪水填充取决于您的数据结构
-
@user3771655 抱歉,但如果你自己做更多的工作,请阅读en.wikipedia.org/wiki/Flood_fill - 尝试理解它并提出具体问题 - 不要像这个那样太宽泛
标签: android android-canvas android-view