【问题标题】:How to fill a Path with linear gradient in an Android custom view如何在 Android 自定义视图中使用线性渐变填充路径
【发布时间】:2018-11-08 06:44:14
【问题描述】:

我已经使用 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 中看到的,绘制对象的shader 属性设置为LinearGradient(0f, 0f, 0f, height.toFloat(), Color.YELLOW, Color.WHITE, Shader.TileMode.MIRROR),所以我应该期望形状被渐变填充。

但问题是我只得到一个实心填充星而不是渐变,如图所示:

现在的问题是,为什么我在星形中得到纯色而不是渐变?

感谢您的关注。

【问题讨论】:

标签: android graphics kotlin android-custom-view linear-gradients


【解决方案1】:

此时视图的高度未知:

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

【讨论】:

    猜你喜欢
    • 2011-02-19
    • 2011-11-12
    • 2011-02-28
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    相关资源
    最近更新 更多