如何更改波形颜色 Android Studio kotlin

问题描述

我一直在关注 Youtube 上的关于带有波形的录音机的教程。我想知道如何改变波形的颜色。我想要蓝色。

这是课程代码

    class WaveformView(context: Context?,attrs: AttributeSet?) : View(context,attrs) {

    private var paint = Paint()
    private var amplitudes = ArrayList<Float>()
    private var spikes = ArrayList<RectF>()

    private var radius = 6f
    private var w = 9f

    private  var sw = 0f
    private  var sh = 400f
    private  var d = 6f

    private var maxSpikes = 0


    init {
        paint.color = Color.rgb(244,81,3)

        sw  = resources.displayMetrics.widthPixels.toFloat()

        maxSpikes = (sw / (w+d)).toInt()
    }

    fun addamplitude(amp: Float){
        var norm  = (amp.toInt() / 7).coerceAtMost(400).toFloat()
        amplitudes.add(norm)

        spikes.clear()
        var amps: List<Float> = amplitudes.takeLast(maxSpikes)

        for(i in amps.indices){

            var left = sw - i*(w+d)
            var top = sh/2 - amps[i]/2
            var right: Float = left + w
            var bottom: Float = top +  amps[i]

            spikes.add(RectF(left,top,right,bottom))

        }

        invalidate()
    }

    fun clear() : ArrayList<Float>{
        var amps: ArrayList<Float> = amplitudes.clone() as ArrayList<Float>
        amplitudes.clear()
        spikes.clear()
        invalidate()

        return amps

    }

    override fun draw(canvas: Canvas?) {
        super.draw(canvas)
        spikes.forEach {
            canvas?.drawRoundRect(it,radius,paint)
        }
    }
}

我已经尝试在 XML 布局文件中更改它,但没有奏效。所以在这里粘贴它没有任何意义。

解决方法

添加一个颜色属性来改变画图的颜色:

var waveFormColor: Int
    @ColorInt get() = paint.color
    set(@ColorInt value) { paint.color = value }

然后可以在类外修改颜色:

myWaveformView.waveFormColor = Color.parseColor("#FF0080")

// or

myWaveformView.waveFormColor = "#FF0080".toColorInt()

// or

myWaveformView.waveFormColor = Color.rgb(255,128)

@ColorInt 是可选的,您可以省略它。在某些情况下,它可以帮助 Lint 防止您传递错误类型的值。

如果您想通过 XML 设置颜色,请先在 res/values 中创建一个 attrs.xml 文件(如果您还没有),然后添加一个条目来为您的自定义视图设置主题:

<resources>
   <declare-styleable name="WaveformView">
       <attr name="waveform_color" format="color"/>
   </declare-styleable>
</resources>

在您的视图布局文件中,您可以使用 app:waveform_color="@color/someColor" 使用此属性。

然后更新自定义视图的 init 块以使用该 XML 属性:

init {
    context.theme.obtainStyledAttributes(attrs,R.styleable.WaveformView,0).use {
        paint.color = it.getColor(R.styleable.WaveformView_waveform_color,Color.rgb(244,81,3))
    }

    sw  = resources.displayMetrics.widthPixels.toFloat()

    maxSpikes = (sw / (w+d)).toInt()
}