android 设置全局字体大小 自定义控件 FontScaleText 无限百分百控制字体大小

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百思不得姐1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值