最近在项目中遇到一个这样的需求:一个显示金额的view,给定最大的字号,需根据view的宽高使金额字体显示地尽量大、务必完整,且小数位要比整数位小几个字号。
基本的分析思路是这样的:金额其实也就是文本,画文本Canvas有drawText方法可以使用;不同字号的字体,通过调用Paint的setTextSize方法传入不同的参数可以实现;而怎么才能使文本字体尽量大呢?
之前在学自定义控件的时候,记得有一个Paint的getTextBounds方法可以在文本画出之前计算出Text的边界数值(left,top,right,bottom)。
接下来是具体实现:
1. 自定义属性
首先根据需求考虑需要哪些自定义属性呢?没必要,一次性就想全,一步一步做,想到什么有必要的就加上。其实也没几个,下面是,我想到的属性及其含义:
属性 | 含义 |
---|---|
maxTextSize | 需求中描述的“给定的最大字号” |
diffTextSizeScale | 小数位字号等于整数位字号*diffTextSizeScale,范围为(0,1] |
textColor | 字体颜色 |
text | 字体内容 |
怎么自定义属性呢?
首先,在values目录下创建属性文件: attrs.xml
,然后在该文件中设置如下内容:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="AutoAdjustView">
<attr name="maxTextSize" format="float" />
<attr name="diffTextSizeScale" format="float" />
<attr name="textColor" format="color" />
<attr name="text" format="string" />
</