如何改变波形颜色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, radius, paint)
}
}
}

我已经试图改变它在XML布局文件,但它没有工作。所以把它粘贴到这里就没有任何意义了

添加一个color属性来改变Paint的颜色:

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, 0, 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, 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()
}

最新更新