返回

项目实践 - 仿 B 站刷新按钮的妙招

Android

重构经典:打造一个活力四射的 Android 刷新按钮

引领设计风潮

B 站的刷新按钮并非只是一个普通按钮,它以其独特的动态圆环视觉效果脱颖而出。这种设计不仅美观,更重要的是,它直观地传达了刷新操作的进行状态。本篇文章将深入剖析这种令人印象深刻的按钮背后的技术原理,并提供详细的代码指南,帮助开发者轻松复刻这一创新设计。

揭秘技术奥秘

实现 B 站刷新按钮的关键在于充分利用自定义 View 和属性动画。

  • 自定义 View: 我们创建一个自定义 RefreshView,它继承自 View 并重写 onDraw() 方法。在 onDraw() 方法中,我们绘制一个圆形进度条,并在进度条更新时重绘视图。
  • 属性动画: 接下来,我们使用属性动画来更新圆形进度条的进度。在动画过程中,圆形进度条逐渐从 0% 增长到 100%,营造出刷新操作正在进行中的视觉效果。

代码实践

以下是实现 RefreshView 的 Kotlin 代码:

class RefreshView : View {

    private var progress = 0f
    private val paint = Paint().apply {
        color = Color.BLUE
        strokeWidth = 10f
        style = Paint.Style.STROKE
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)
        val centerX = width / 2f
        val centerY = height / 2f
        val radius = (width / 2f) - 10f
        canvas.drawCircle(centerX, centerY, radius, paint)
        canvas.drawArc(centerX - radius, centerY - radius, centerX + radius, centerY + radius, -90f, 360f * progress, false, paint)
    }

    fun setProgress(progress: Float) {
        this.progress = progress
        invalidate()
    }
}

在布局文件中,添加 RefreshView 如下:

<com.example.myapp.RefreshView
    android:id="@+id/refreshView"
    android:layout_width="50dp"
    android:layout_height="50dp" />

最后,通过属性动画控制圆形进度条的动画:

val refreshView = findViewById<RefreshView>(R.id.refreshView)
val animation = ValueAnimator.ofFloat(0f, 1f).apply {
    duration = 1000L
    addUpdateListener { animation ->
        refreshView.setProgress(animation.animatedValue as Float)
    }
    repeatCount = ValueAnimator.INFINITE
    repeatMode = ValueAnimator.RESTART
}
animation.start()

更上层楼

仿制 B 站的刷新按钮不仅让我们掌握了自定义 View 和属性动画的使用,还加深了我们对界面交互设计的理解。在未来的开发中,我们期待发现更多有趣且有挑战性的技术点,为我们的技术技能添砖加瓦。

常见问题解答

  1. 为什么选择自定义 View?
    自定义 View 允许我们完全控制绘制过程,这是实现圆形进度条等复杂 UI 元素的必要条件。

  2. 如何自定义属性动画?
    通过使用 ValueAnimator.ofFloat() 方法,我们可以创建属性动画并指定动画的持续时间、更新监听器和重复模式。

  3. 如何实现无限循环动画?
    将 repeatCount 设置为 ValueAnimator.INFINITE 并将 repeatMode 设置为 ValueAnimator.RESTART 可以创建无限循环动画。

  4. 如何响应按钮点击事件?
    可以在 RefreshView 中重写 onClick() 方法来响应按钮点击事件。

  5. 这种技术适用于其他平台吗?
    虽然本教程重点介绍 Android,但相同的原理也可以应用于其他平台,如 iOS 和 Web。