android 设置全局字体大小 自定义控件 FontScaleText 无限百分比控制字体大小
android 设置全局字体大小 自定义控件
今天分享一下设置全局字体大小的自定义控件FontScaleText,当时也是项目需求,没有找到特别舒服的3方库
所以自己写了一个 个人觉得还是很满意的 可以无限的设置字体大小 只要将TextView 替换 FontScaleText 即可完成设置全局字体
在这里插入代码片
package com.sun.demo1;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.Observable;
import java.util.Observer;
public class FontScaleText extends androidx.appcompat.widget.AppCompatTextView implements Observer {
float mTextSize;
int fontScaleValue;
boolean mAttached;
boolean isInit;
public FontScaleText(@NonNull Context context, @Nullable AttributeSet attrs) {
this( context, attrs, 0 );
}
public FontScaleText(@NonNull Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
public void init(@NonNull Context context){
if(!isInit){
isInit = true;
mTextSize = getTextSize();
}
fontScaleValue = (int) PreferencesUtil.getInstance(context).getParam("FontScaleValue",1);
refreshFontScale(fontScaleValue);
}
public void refreshFontScale(int value){
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.P){
if(value == 0){
setTextSize(mTextSize * 1.4f);
}else
if(value == 1){
setTextSize(mTextSize * 1.8f);
}else
if(value == 2){
setTextSize(mTextSize * 2f);
}else
if(value == 3){
setTextSize(mTextSize * 2.3f);
}
}else{
if(value == 0){
setTextSize(mTextSize * 0.8f);
}else
if(value == 1){
setTextSize(mTextSize);
}else
if(value == 2){
setTextSize(mTextSize * 1.2f);
}else
if(value == 3){
setTextSize(mTextSize * 1.4f);
}
}
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if(!mAttached) {
mAttached = true;
GczUtil.newInstance().addObserver(this);
}
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if(mAttached){
mAttached = false;
GczUtil.newInstance().deleteObserver(this);
}
}
@Override
public void update(Observable o, Object arg) {
fontScaleValue = (int) arg;
refreshFontScale(fontScaleValue);
}
}
原理很简单 就是在控件中加了监听 修改字体大小
有个一个问题 在listview 中有出现某个item字体没有刷新问题 问题原因为隐藏item监听回收导致 这个问题如下图 在item项初始化设置一下字体可解决(配置字体大小页,后返回listview 界面时用此方法解决)
content.refreshFontScale(fontScaleValue);
ListView listview = findViewById(R.id.listview);
listview.setAdapter(new CommonAdapter(MainActivity.this,list,R.layout.layout_item) {
@Override
public void convert(ViewHolder helper, Object item, int position) {
String str = (String) item;
FontScaleText content = helper.getView(R.id.content);
content.setText(str);
// content.refreshFontScale(fontScaleValue);
}
});
需要注意 implements Observer 初始化设置字体大小级别的值要通过观察者刷新 已达到设置字体大小的目的
public class MainActivity extends AppCompatActivity implements Observer {
@Override
public void update(Observable o, Object arg) {
fontScaleValue = (int) arg;
}
有问题可以留言
附 DEMO地址 https://download.csdn.net/download/qq_37630270/87988356