返回

自定义View之CircleIndicatorView实现圆形指示器

Android

导言

在构建移动应用程序时,界面设计扮演着至关重要的角色。圆形指示器是一种常见且有用的UI元素,它为用户提供了有关应用程序当前状态或进度的直观视觉提示。在本指南中,我们将探讨如何从头开始创建自定义的CircleIndicatorView。

基本概念

CircleIndicatorView是一个自定义视图,用于呈现一组圆形指示器。它具有以下核心属性:

  • 指示器数量: 表示指示器元素的数量。
  • 指示器颜色: 定义指示器的填充颜色。
  • 线宽: 指示器边界的宽度。
  • 虚线间距: 指示器虚线之间的间距。

步骤指南

1. 创建自定义视图

首先,我们需要创建自定义视图类。创建一个名为CircleIndicatorView.java的新类,并将其扩展至View。

2. 定义自定义属性

接下来,需要定义CircleIndicatorView所需的自定义属性。在attrs.xml文件中添加以下代码:

<resources>
    <declare-styleable name="CircleIndicatorView">
        <attr name="indicatorCount" format="integer" />
        <attr name="indicatorColor" format="color" />
        <attr name="lineWidth" format="dimension" />
        <attr name="dashGap" format="dimension" />
    </declare-styleable>
</resources>

3. 实现测量逻辑

在onMeasure()方法中,需要计算CircleIndicatorView的测量值。宽度应为指示器数量乘以指示器直径,高度应为线宽。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int width = getIndicatorCount() * getIndicatorDiameter();
    int height = getLineWidth();

    setMeasuredDimension(width, height);
}

4. 绘制指示器

在onDraw()方法中,需要绘制圆形指示器。首先,计算每个指示器的圆心位置和半径。然后,使用Canvas绘制一个实心圆形和一个虚线圆形。

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    float cx, cy, radius;

    for (int i = 0; i < getIndicatorCount(); i++) {
        cx = i * getIndicatorDiameter() + getLineWidth() / 2;
        cy = getLineWidth() / 2;
        radius = getIndicatorDiameter() / 2;

        drawSolidCircle(canvas, cx, cy, radius);
        drawDashedCircle(canvas, cx, cy, radius);
    }
}

5. 添加getter和setter方法

最后,需要添加getter和setter方法来访问自定义属性。例如:

public int getIndicatorCount() {
    return indicatorCount;
}

public void setIndicatorCount(int indicatorCount) {
    this.indicatorCount = indicatorCount;
}