绘制自定义视图

Drawing Custom View

我想创建一个在圆圈内有复选标记的自定义视图。参考下图。

画圆很容易。我需要一些关于绘制刻度线的建议。

感谢任何帮助。

使用 LayerDrawable 您可以绘制一个可绘制对象数组,其中具有最大索引的元素将被绘制在顶部。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/circle" />
    <item android:drawable="@drawable/check" />
</layer-list>

或者您可以使用 VectorDrawable,右键单击可绘制文件夹 > 新建 > 矢量资产 > 图标 > 搜索 "check circle"。

如果您没有创建自定义视图的特定要求,我建议您只使用矢量可绘制对象:

<?xml version="1.0" encoding="utf-8"?>
<vector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">

    <path
        android:pathData="M0 12a12 12 0 1 1 0 0.01z"
        android:fillColor="#8ab88c"/>

    <path
        android:pathData="M5.25 12l4.5 4.5l9 -9"
        android:strokeColor="#ffffff"
        android:strokeWidth="2.5"/>

</vector>

第一个<path>元素使用椭圆弧命令绘制圆,第二个使用两个"lineto"命令绘制检查

这可以在 ImageView 中使用,具有您喜欢的任何尺寸,并且可以很好地缩放。

如果您必须实现自定义视图,我会在 onDraw() 实现中使用相同的通用技术:

@Override
protected void onDraw(Canvas canvas) {
    rectF.set(getLeft(), getTop(), getRight(), getBottom());
    canvas.drawOval(rectF, fillPaint);

    float checkmarkWidth = getWidth() * 0.5626f;
    float delta = checkmarkWidth / 3.0f;

    float initialX = (getWidth() - checkmarkWidth) / 2.0f;
    float initialY = getHeight() / 2.0f;

    path.reset();
    path.moveTo(initialX, initialY);
    path.rLineTo(delta, delta);
    path.rLineTo(2 * delta, -2 * delta);

    strokePaint.setStrokeWidth(getWidth() / 9);
    canvas.drawPath(path, strokePaint);
}