一、项目需求:
因为产品对象用于中老年人,所以产品设计添加了APP全局字体调整大小功能。
这里仿做QQ设置字体大小的功能。
QQ实现的效果是,滚动下面的seekbar,当只有seekbar到达某一个刻度的时候,这时候上部分的效果展示部分会改变文字大小,
但是在拖动过程中字体不会改变。关闭此界面,就可以看到改变文字后app整体的实际文字大小效果了。
-----------------------------------------------------------------------------------------------------------------------------
二、理清一下实现思路:
1、先将一个APP内所有的文本设置级别,大概3--5个级别(具体看项目需求),比如标题栏的TextView我们给他设置级别1(默认24sp) ,类似设置 级别2(默认22sp)等等。
这样做的目的可以方便的我们设置,如果每个Textview大小都乱乱的,那这个文字大小改变的功能也没什么意义了。
2、创建一个类Constant,类中创建一个静态变量,这个变量用于记录当我们拖动seekbar的时候 对应改变。取值范围就是我们seekbar的界点。
Demo我们限制文字大小有四个界点:小、标准、大、特大。
那么静态变量 TEXT_SIZE 取值就有0,1,2,3
public static int TEXT_SIZE = 0;
3、滑动seekbar,当达到界点的时候,改变静态变量TEXT_SIZE的值,并且刷新列表适配器(这个列表是展示文字大小效果的,所以数据是我们自己写死的,
要求达到某个界点才会刷新适配器,绝不可能seekbar有滑动操作我们就执行刷新适配器的)
4、在退出设置字体界面的时候,用sharedPreferences保存,每次进入app的时候读取。
这样在每个Activity或者Fragment 创建View的过程中在 TextView创建的时候给控件动态设置文字的大小
textview.setTextSize(级别默认文字大小+seekbar级别*3);
思路就是这么简单,看懂的可以自己去实现了,有点懵的看下面的例子来深入了解下。
整体思路就是: 一个标记变量,记录要显示文字大小的级别,sharedpreference保存。然后在每个要打开的新的界面创建View的过程中 给TextView动态设置文字大小
注意:不是我修改文字大小之后,整个APP所有界面的TextView都立马改变。
-----------------------------------------------------------------------------------------------------------------------------
三、代码实现
1、首先就是这个SeekBar控件,上面需要有刻度,需要有文字,显然我们用android提供的自带的SeekBar控件已经不满足我们的需求了。
但是,这里我找到了一个很好的自定义控件可以完美的实现这个问题:
资料来源: Android 自定义带刻度的seekbar
这里我加了一些注释
1 public class CustomSeekbar extends View {
2 private final String TAG = "CustomSeekbar";
3 private int width;
4 private int height;
5 private int downX = 0;
6 private int downY = 0;
7 private int upX = 0;
8 private int upY = 0;
9 private int moveX = 0;
10 private int moveY = 0;
11 private float scale = 0;
12 private int perWidth = 0;
13 private Paint mPaint;
14 private Paint mTextPaint;
15 private Paint buttonPaint;
16 private Canvas canvas;
17 private Bitmap bitmap;
18 private Bitmap thumb;
19 private Bitmap spot;
20 private Bitmap spot_on;
21 private int hotarea = 100;//点击的热区
22 private int cur_sections = 2;
23 private ResponseOnTouch responseOnTouch;
24 private int bitMapHeight = 38;//第一个点的起始位置起始,图片的长宽是76,所以取一半的距离
25 private int textMove = 60;//字与下方点的距离,因为字体字体是40px,再加上10的间隔
26 private int[] colors = new int[]{0xffdf5600,0x33000000};//进度条的橙色,进度条的灰色,字体的灰色
27 private int textSize;
28 private int circleRadius;
29 private ArrayList<String> section_title;
30 public CustomSeekbar(Context context) {
31 super(context);
32 }
33 public CustomSeekbar(Context context, AttributeSet attrs) {
34 this(context, attrs, 0);
35 }
36 public CustomSeekbar(Context context, AttributeSet attrs, int defStyleAttr) {
37 super(context, attrs, defStyleAttr);
38 cur_sections = 0;
39 bitmap = Bitmap.createBitmap(900, 1100, Bitmap.Config.ARGB_8888);
40 canvas = new Canvas();
41 canvas.setBitmap(bitmap);
42 thumb = BitmapFactory.decodeResource(getResources(), R.mipmap.img_setting_seekbar_thumbe_large); //这个是滑动图标
43 spot = BitmapFactory.decodeResource(getResources(),R.mipmap.img_setting_seekbar_thumbe); //这个是未滑动到的界点的图标