仿微信调整APP文本大小

本文介绍了一种在Android应用中实现类似微信的文本大小调整功能的方法,避免了随系统设置变化的问题。通过重写Activity基类,利用DisplayUtils类调整字体缩放和密度DPI,确保界面元素统一缩放,适用于多种场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

仿微信调整APP文本大小

今日要实现类型微信,qq的文本大小调整,不随系统变化,目前网上主要方案有:
1、设置fontScale
2、设置densityDpi
3、设置theme
观察微信调整文本大小时,头像等元素也随着变化,因此排除fontScale模式,设置theme模式需要修改的代码太多,也不适用,排除,因此选择方案2
具体实现如下:

Activity基类中添加:

    @Override
    public Resources getResources() {
        Resources resources = super.getResources();
        return DisplayUtils.getResources(this, resources);
    }

	//主要用于解决fragment中不跟随变化的我那天
    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(getAttachBaseContext(newBase));
    }

    protected Context getAttachBaseContext(Context newBase) {
        return DisplayUtils.attachBaseContext(newBase);
    }


DisplayUtils代码

import android.app.Activity;
import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.util.Log;
import android.view.Display;

import com.sogou.xiaop_android.business.model.dao.entity.KeyValuePair;

import java.lang.reflect.Method;

public class DisplayUtils {

    public static float fontScale = -1f;
    public static float sysScale = 1f;

    public static float usedScale;
    private static int sysDpi;
    private static int defaultDpi;
    private static float dpiScale;

    private static int usedDpi;

    private static void initFontScale(Configuration configuration) {
         if (fontScale == -1) {
            fontScale = XiaopSharedPreferencesHelper.getFontScaleSize(1.0f);
            sysScale = configuration.fontScale;
            defaultConfigurationDpi = configuration.densityDpi;
            if (sysScale == 0) {
                sysScale = 1f;
            }
        }
        //实时获取系统dpi,防止修改分辨率后,app进程没有重启导致显示异常
        try {
            defaultDpi = ViewUtils.getDisplayMetrics().densityDpi;
            Log.i("DisplayUtils", "ViewUtils.getDisplayMetrics().densityDpi " + defaultDpi);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (defaultDpi <= 0) {
            defaultDpi = defaultConfigurationDpi;
        }
        if (fontScale == 1f) {
            if (sysScale != 1f) {
                usedScale = fontScale + (sysScale - 1f) / 4;
            } else {
                usedScale = 1f;
            }
        } else {
            usedScale = fontScale;
        }
        usedDpi = (int) (defaultDpi * usedScale);
        Log.i("DisplayUtils", "initFontScale usedDpi " + usedDpi + ",defaultDpi " + defaultDpi + ",fontScale=" + fontScale + ",usedScale=" + usedScale + ",sysScale=" + sysScale);
   }

    /**
     * 保持字体大小不随系统设置变化(用在界面加载之前)
     * 要重写Activity的attachBaseContext()
     */
    public static Context attachBaseContext(Context context) {

        Configuration config = context.getResources().getConfiguration();
        initFontScale(config);
        if (usedDpi > 0) {
            config.fontScale = 1f;
            config.densityDpi = usedDpi;
        } else {
            config.fontScale = usedScale;
        }
        return context.createConfigurationContext(config);
    }

    /**
     * 保持字体大小不随系统设置变化(用在界面加载之前)
     * 要重写Activity的getResources()
     */
    public static Resources getResources(Context context, Resources resources) {

        Configuration config = resources.getConfiguration();
        initFontScale(config);

        if ((usedDpi > 0 && (config.densityDpi != usedDpi || config.fontScale != 1f)) || (config.fontScale != usedScale)) {
            if (usedDpi > 0) {
                config.fontScale = 1f;
                config.densityDpi = usedDpi;
            } else {
                config.fontScale = usedScale;
            }
            return context.createConfigurationContext(config).getResources();
        } else {
            return resources;
        }
    }
}

设置完成字体后重启APP刷新:

 Intent intent = new Intent();
        intent.setClass(AppEnvVars.appContext, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK| Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);

        Activity curActivity = AppEnvVars.getCurrentActivity();
        (curActivity == null ? AppEnvVars.appContext : curActivity).startActivity(intent);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值