android - 绘制并填充自定义形状

标签 android

我正在尝试使用 Android 中的 Path 对象创建自定义形状,但遇到了一个奇怪的问题。
我想要实现的目标如下图所示

enter image description here

这是我用来绘制和填充形状的代码:

 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);
    } 
 }

我得到的实际结果如下所示:

enter image description here

没有填充的结果形状如下所示:

enter image description here

你能告诉我我做错了什么吗?

最佳答案

试试这个:

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);
    }
}

关于android - 绘制并填充自定义形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21002795/

相关文章:

java - 错误 : Cannot find getter for field in Android Room

javascript - 如何使用 PhoneGap 的软键盘 (org.apache.cordova.plugin.softkeyboard)?

android - 从 Android 上的 Axis 相机获取 rtsp 流

android - 在 2.x 版本上实现最近推出的 Android 设计和 UI 指南

java - 变压器异常 : Unknown Error In XPath

android - 所有线程完成后如何正确停止服务

android - 如何在 Android Studio 上配置 Ninja 安装

Android,手机重启时SharedPreference丢失

android - 如何使用 android-actionBar 启动ActivityForResult?

android - Android 应用程序上的 GPS 位置信息冲突