Android 绘制和填充自定义形状
我试图在Android中使用Path对象创建自定义形状,但遇到了一个奇怪的问题。Android 绘制和填充自定义形状,android,Android,我试图在Android中使用Path对象创建自定义形状,但遇到了一个奇怪的问题。 我试图实现的目标如下图所示 下面是我用来绘制和填充形状的代码: public class BallView extends RelativeLayout { .... protected void onDraw(Canvas canvas) { ... PaintArc(canvas); } private void PaintArc(Canvas
我试图实现的目标如下图所示 下面是我用来绘制和填充形状的代码:
public class BallView extends RelativeLayout {
....
protected void onDraw(Canvas canvas) {
...
PaintArc(canvas);
}
private void PaintArc(Canvas canvas) {
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setAntiAlias(true);
p.setStyle(Paint.Style.FILL_AND_STROKE);
p.setStrokeWidth(2);
p.setColor(Color.RED);
RectF oval = new RectF(20, 20, getWidth() - 20, getHeight() - 20);
RectF oval2 = new RectF(0, 0, getWidth(), getHeight());
Path path = new Path();
path.setFillType(Path.FillType.EVEN_ODD);
path.addArc(oval, 0, 180);
path.addArc(oval2, 0, 180);
float y=20+oval.height()/2;
float x=20;
path.moveTo(x,y);
path.lineTo(x - 20, y);
x=oval.width()+20;
path.moveTo(x,y);
path.lineTo(x+20,y);
path.close();
canvas.drawPath(path, p);
}
}
我得到的实际结果如下所示:
未填充的结果形状如下所示:
你能告诉我我做错了什么吗
- I have just edited my answer
and i add below code
RectF oval3=新的RectF(10,20,getWidth()-10,getHeight()-10)
/**
*现在检查这段代码输出是否与您的想法一致
*/
RectF oval3=新的RectF(10,20,getWidth()-10,getHeight()-10)
/**
*现在检查这段代码输出是否与您的想法一致
*/
试试这个:
class MyView extends View {
private Path mPath;
private Paint mPaint;
private RectF mOval;
public MyView(Context context) {
super(context);
mPath = new Path();
mPaint = new Paint();
mPaint.setColor(0xffff0000);
mOval = new RectF();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
int dx = w / 4;
mOval.set(0, 0, w, w);
mPath.reset();
mPath.moveTo(0, w / 2f);
mPath.arcTo(mOval, 180, 180);
mPath.rLineTo(-dx, 0);
mOval.inset(dx, dx);
mPath.addArc(mOval, 0, -180);
mPath.rLineTo(-dx, 0);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(0xffffffff);
mPaint.setStyle(Style.FILL);
canvas.drawPath(mPath, mPaint);
canvas.translate(0, getWidth() / 2);
mPaint.setStyle(Style.STROKE);
canvas.drawPath(mPath, mPaint);
}
}
试试这个:
class MyView extends View {
private Path mPath;
private Paint mPaint;
private RectF mOval;
public MyView(Context context) {
super(context);
mPath = new Path();
mPaint = new Paint();
mPaint.setColor(0xffff0000);
mOval = new RectF();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
int dx = w / 4;
mOval.set(0, 0, w, w);
mPath.reset();
mPath.moveTo(0, w / 2f);
mPath.arcTo(mOval, 180, 180);
mPath.rLineTo(-dx, 0);
mOval.inset(dx, dx);
mPath.addArc(mOval, 0, -180);
mPath.rLineTo(-dx, 0);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(0xffffffff);
mPaint.setStyle(Style.FILL);
canvas.drawPath(mPath, mPaint);
canvas.translate(0, getWidth() / 2);
mPaint.setStyle(Style.STROKE);
canvas.drawPath(mPath, mPaint);
}
}
为什么这么复杂?你可以用一条路径做你想做的事情。AddArc我想用一条圆弧做形状,增加线条的大小,但我只是在试验,试图理解框架。我想知道如何填充使用路径对象构建的自定义形状。好的,我明白了,也许可以尝试arcTo而不是addArc?不幸的是,这也不起作用。我最初认为路径没有闭合,默认情况下,当我使用填充样式“绘制”它时,系统会自动闭合该形状,最终生成一个半圆。但事实并非如此。第三个图像是在闭合路径上使用具有笔划样式的绘画绘制形状的结果,显然该路径看起来不像半圆。我只是不明白为什么形状的内部没有填充,为什么整个半圆都被填充为什么这么复杂?你可以用一条路径做你想做的事情。AddArc我想用一条圆弧做形状,增加线条的大小,但我只是在试验,试图理解框架。我想知道如何填充使用路径对象构建的自定义形状。好的,我明白了,也许可以尝试arcTo而不是addArc?不幸的是,这也不起作用。我最初认为路径没有闭合,默认情况下,当我使用填充样式“绘制”它时,系统会自动闭合该形状,最终生成一个半圆。但事实并非如此。第三个图像是在闭合路径上使用具有笔划样式的绘画绘制形状的结果,显然该路径看起来不像半圆。我只是不明白为什么形状的内部没有填充,而是为什么整个半圆被填充Hi Max。谢谢你的回复。不幸的是,这对我没有帮助。通过将样式更改为笔划,我将在第三幅图像中获得结果。我想要的是第一张图片中的结果(用油漆制作)Hi Max。感谢您提供的示例和解释。不幸的是,这仍然不能回答我的问题。我发送的图像可能不是最好的例子。我想要的是填充这个形状,我不想要白色的边框。正如我向pskink提到的,我知道我可能可以使用更大厚度的笔划样式来绘制曲线,但我想填充使用路径对象构建的自定义形状。我想知道这是否可能,如果可能,我的方法有什么问题。嗨,Max。谢谢你的回复。不幸的是,这对我没有帮助。通过将样式更改为笔划,我将在第三幅图像中获得结果。我想要的是第一张图片中的结果(用油漆制作)Hi Max。感谢您提供的示例和解释。不幸的是,这仍然不能回答我的问题。我发送的图像可能不是最好的例子。我想要的是填充这个形状,我不想要白色的边框。正如我向pskink提到的,我知道我可能可以使用更大厚度的笔划样式来绘制曲线,但我想填充使用路径对象构建的自定义形状。我想知道这是否可能,如果可能,我的方法有什么问题。谢谢你的回复和样品。现在看起来很开心,但我真的不明白为什么。据我所知,两个代码示例生成的形状都是闭合的,它们应该填充相同的形状。由于某种原因,你的样品有效,而我的样品无效。“我会再多挖一点,如果我发现了什么,我会回来的。”安德烈:这和顶点排序有关吗?只是好奇,嘿,亲爱的。谢谢你的回复和样品。现在看起来很开心,但我真的不明白为什么。据我所知,两个代码示例生成的形状都是闭合的,它们应该填充相同的形状。由于某种原因,你的样品有效,而我的样品无效。“我会再多挖一点,如果我发现了什么,我会回来的。”安德烈:这和顶点排序有关吗?只是好奇。