自定义View之TextView疯狂的前缀

Hello ,好久不见。
疯狂的TextView前缀。不知道是否遇到过这种设计图:

这也有:

新设计图又有:

看到没,金额那都有¥的符号。
不知道你在叠TextView的时候会不会疯,我反正不爽,直接自定义。
自定义的方案有两种:
1、继承ViewGroup,创建两个TextView,然后在各种onMeasure,onLayout。
嗯。可以实现,但是呢ViewGroup的存在嵌套了一层,性能肯定不是最好的啊(当然这点小性能微乎其微,CPU都不会颤抖一下)。所以使用第二种吧。

2、那就是直接继承TextView,人民币符号就在onDraw中画一个呗。

1、继承TextView

1
2
3
4
5
6
7
8
class MoneyView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : TextView(context, attrs, defStyleAttr){
private val paint = Paint()
private val text = "¥"
private val rect = Rect()

}

2、初始化方法

1
2
3
4
5
6
7
8
init {
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.MoneyView)
paint.textSize = typedArray.getDimension(R.styleable.MoneyView_money_size, 36f)//设置字符的大小
paint.color = typedArray.getColor(R.styleable.MoneyView_money_color, Color.WHITE)//设置字符的颜色
typedArray.recycle()
paint.isAntiAlias = true
paint.getTextBounds(text, 0, 1, rect)//获取字符的大小
}

3、设置TextView的最终大小

1
2
3
4
5
6
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
val w = MeasureSpec.getSize(widthMeasureSpec)
val h = MeasureSpec.getSize(heightMeasureSpec)
setMeasuredDimension(measuredWidth + rect.width(), measuredHeight)
}

4、把人民币符号画在金额前边

1
2
3
4
5
6
override fun onDraw(canvas: Canvas?) {
canvas?.drawText(text, 0f, (baseline).toFloat(), paint)//先画人民币符号
canvas?.withTranslation(rect.width().toFloat(), 0f) {//画布右移一个人民币符号宽度
super.onDraw(canvas)//画该有的文本
}
}
哇,竟然这么简单。你学会了吗?

当然,你可以把前缀后缀统统传进来。