Как заполнить контур линейным градиентом в пользовательском представлении Android - PullRequest
0 голосов
/ 29 мая 2018

Я создал пользовательский вид Android с помощью Kotlin, чтобы нарисовать звезду, которая будет использоваться для создания пользовательского RatingBar в будущем;Поэтому я расширил класс View и переопределил его метод draw(), чтобы нарисовать одну звезду, учитывая это руководство от Google: https://developer.android.com/training/custom-views/custom-drawing

После этого я попытался заполнить траекторию звезды линейным градиентом, чтобы добиться ее заполнения.эффект, следующий за этим сообщением: Как заполнить контур в Android линейным градиентом?

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), поэтому я должен ожидать, что форма будет заполнена градиентом.

Но проблема в том, что я получаю только сплошную звезду, заполненную вместо градиента, как показано на фотографии:

Solid Filled Star

Теперь вопрос, почему я получаю сплошной цвет вместо градиента на звезде?

Спасибо за ваше внимание.

1 Ответ

0 голосов
/ 29 мая 2018

Высота представления в данный момент неизвестна:

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...