一、前言
最近项目添加了一项调整应用字体大小功能,做完后空闲之余总结一下。本功能仿照微信应用“设置” - “通用” - “字体大小”功能,又有一点区别。据我所知,常见改变全局字体大小方法有两种,我把这两种分为可控和不可控,为什么这么分呢,当然不是为了方便记忆。那么简单说下两者方式的实现过程:
1、不可控:通过重写Actiivity的getResources()方法更新应用的字体倍数来调整全局字体大小
优点:实现简单
缺点:不可控制(所有字体放大倍数都是一致),无法跨进程(项目中另一个进程的字体不会改变,需要重新配置),只对sp字体单位有效果。....
2、可控:通过setTheme()方法,一开始就初始化设置不同风格的字体样式来更改全局字体大小。
优点:随意调节任意位置的字体大小
缺点:实现麻烦
而本文正式采用了第一种方案,主要是中途添加该功能,时间也不充裕,抽取字体大小又太过耗时。
微信字体大小个人猜测使用第二种方案,后者是更好的实现方式也不一定。
二、效果预览
三、实现步骤
1、自定义字体调整控件
网上找了一个相似的控件并加以完善,功能相对简单,就不做介绍了。
/** * TODO 仿微信字体大小调整 * 自定义属性: * lineWidth 线条粗细 * lineColor 线条颜色 * totalCount 线条格数 * circleColor 球型颜色 * circleRadius 球型颜色半径 * textFontColor 文字颜色 * smallSize 小“A” 字体大小 * standerSize “标准” 字体大小 * bigSize 大“A” 字体大小 * defaultPosition 默认位置 */public class FontSizeView extends View {
private int defaultLineColor = Color.rgb(33, 33, 33); private int defaultLineWidth; private int defaultMax = 5; private int defaultCircleColor = Color.WHITE; private int defaultCircleRadius; // 当前所在位置 private int currentProgress; // 默认位置 private int defaultPosition = 1; // 一共有多少格 private int max = 7; // 线条颜色 private int lineColor = Color.BLACK; // 线条粗细 private int lineWidth; //字体颜色 private int textColor = Color.BLACK; //字体大小 private int smallSize = 14; private int standerSize = 16; private int bigSize = 28; // 圆半径 private int circleRadius; private int circleColor = Color.WHITE; // 一段的宽度,根据总宽度和总格数计算得来 private int itemWidth; // 控件的宽高 private int height; private int width; // 画笔 private Paint mLinePaint; private Paint mTextPaint; private Paint mText1Paint; private Paint mText2Paint; private Paint mCirclePaint; // 滑动过程中x坐标 private float currentX = 0; // 有效数据点 private List points = new ArrayList<>(); private float circleY; private float textScaleX; private fl