首页 > 解决方案 > 在 setClickListener 期间以编程方式设置渐变不起作用。为什么?

问题描述

我以编程方式设置渐变(根据https://stackoverflow.com/a/52289927/3286489中共享的方法)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setTextGradient()  // Set here, and it is working
    btn_press_me.setOnClickListener {
       // Do nothing
    }
}

private fun setTextGradient() {
    val paint: TextPaint = text_happy.paint
    val width = paint.measureText(text_happy.text.toString())

    val textShader: Shader = LinearGradient(
        0f, 0f, width, text_happy.textSize, intArrayOf(
            Color.parseColor("#F97C3C"),
            Color.parseColor("#FDB54E"),
            Color.parseColor("#64B678"),
            Color.parseColor("#478AEA"),
            Color.parseColor("#8446CC")
        ), null, TileMode.CLAMP
    )
    text_happy.paint.shader = textShader
}

这行得通。但是,如果我搬进setTextGradient()setOnCLickListner,为什么它不起作用?

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    btn_press_me.setOnClickListener {
        setTextGradient()  // Move here and it is not working.
    }
}

private fun setTextGradient() {
    val paint: TextPaint = text_happy.paint
    val width = paint.measureText(text_happy.text.toString())

    val textShader: Shader = LinearGradient(
        0f, 0f, width, text_happy.textSize, intArrayOf(
            Color.parseColor("#F97C3C"),
            Color.parseColor("#FDB54E"),
            Color.parseColor("#64B678"),
            Color.parseColor("#478AEA"),
            Color.parseColor("#8446CC")
        ), null, TileMode.CLAMP
    )
    text_happy.paint.shader = textShader
}

标签: androidgradient

解决方案


显然,我需要在设置后使其无效

    private fun setTextGradient() {
        val paint: TextPaint = text_happy.paint
        val width = paint.measureText(text_happy.text.toString())

        val textShader: Shader = LinearGradient(
            0f, 0f, width, text_happy.textSize, intArrayOf(
                Color.parseColor("#F97C3C"),
                Color.parseColor("#FDB54E"),
                Color.parseColor("#64B678"),
                Color.parseColor("#478AEA"),
                Color.parseColor("#8446CC")
            ), null, TileMode.CLAMP
        )
        text_happy.paint.shader = textShader
        text_happy.invalidate()  // Add the invalidation here
    }

推荐阅读