android - 如何在 Android 自定义视图中使用线性渐变填充路径
问题描述
我已经使用 Kotlin 创建了一个 Android 自定义视图来绘制一个 Star,它将用于在未来创建一个自定义 RatingBar;所以我扩展了 View 类并重写了它的draw()
方法来绘制一颗星,考虑到谷歌的这个指南:
https ://developer.android.com/training/custom-views/custom-drawing
之后,我尝试用线性渐变填充星形路径以实现星形填充效果,遵循这篇博文: How to fill a Path in Android with a linear gradient?
class CustomStar constructor(context: Context, attr: AttributeSet) : View(context, attr) {
private var paint: Paint = Paint(Paint.FILTER_BITMAP_FLAG)
private var path: Path = Path()
init {
paint.shader = LinearGradient(0f, 0f, 0f, height.toFloat(), Color.YELLOW, Color.WHITE, Shader.TileMode.MIRROR)
}
override fun draw(canvas: Canvas?) {
super.draw(canvas)
// draw the star.
val min = Math.min(width, height).toFloat()
// top left
path.moveTo(0f, min * 0.3819901313f)
// top right
path.lineTo(min, min * 0.3819901313f)
// bottom left
path.lineTo(min * 0.1910982479f, min)
// top tip
path.lineTo(min * 0.5f, 0f)
// bottom right
path.lineTo(min*0.8089799735f, min)
// top left
path.lineTo(0f, min * 0.3819901313f)
path.close()
canvas?.drawPath(path, paint)
}
}
正如您在 中看到的init
,paint 对象的shader
属性设置为, LinearGradient(0f, 0f, 0f, height.toFloat(), Color.YELLOW, Color.WHITE, Shader.TileMode.MIRROR)
所以我应该期望形状被渐变填充。
但问题是我只得到一个实心填充的星星而不是渐变,如图所示:
现在的问题是,为什么我在星形中得到纯色而不是渐变?
感谢您的关注。
解决方案
此时视图的高度未知:
init {
paint.shader = LinearGradient(0f, 0f, 0f, height.toFloat(), Color.YELLOW, Color.WHITE, Shader.TileMode.MIRROR)
}
而是覆盖 onSizeChanged 并在那里创建 LinearGradient:
override fun onSizeChanged(w: Int, h: Int, oldW: Int, oldH: Int) {
paint.shader = LinearGradient(0f, 0f, 0f, h.toFloat(), Color.YELLOW, Color.WHITE, Shader.TileMode.MIRROR)
}
推荐阅读
- c# - ModelState.IsValid 对于发送带有隐藏输入的 Id 为 false
- javascript - 自定义排序,未显示更新数据的组件做出反应
- python - 当我想检查 Dataframe 是否为空时,“list”对象没有属性“isEmpty”
- sql - 与系统表的内部联接
- sql - 无法识别的姓名:[9:8] 的员工
- winapi - 如何从 windcodecs api IWICBitmapDecoder、IWICBitmap 或 IWICImagingFactory 获取 GDI 兼容位图?
- python - 尝试在概念表中显示带有 yfinance 和 notion-py 的股息
- assembly - 指令解码器如何区分前缀和主操作码?
- python - 从网站python美丽汤中刮取表格数据 - 访问所有表格条目
- excel - Powershell:使用 SendGrid 发送带附件的邮件