Android自定义TextView适配不同设备下的字体大小

Android的设备很多,适配起来比较难。所以才有了dp、sp这样的尺寸单位来适应不同的屏幕密度。他们之间的换算也并不复杂。
然而问题来了,UI那边提交来的设计图一般都是标的px。(他们并不太可能知道需要多少的dp或者sp,是吧。)咱不能每次都给他算一遍再标成dp或者sp啊。方便起见,我们需要一个自动换算的TextView,我们只需要传入设计图标注的屏幕大小和字体大小就可以适配不同设备了。

1.首先,我们需要一个自定义的属性来代替原先的字体大小属性

通常设计图不会给你标注各种屏幕下的不同数值。接下来我们就要传入设计图的屏幕大小来让字体按比例显示。

在values中创建一个attrs.xml文件,创建textSizePx的属性和baseScreenHeight属性(其实用宽度也是可以的,这不重要):

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="ScaleTextView">
        <attr name="baseScreenHeight" format="integer"/><!--屏幕高度-->
        <attr name="textSizePx" format="integer" /><!--字体大小-->
    </declare-styleable>
</resources>

2.接下来我们定义自己的TextView

public class ScaleTextView extends TextView {

    private int baseScreenHeight;

    public ScaleTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray type = context.obtainStyledAttributes(attrs,R.styleable.ScaleTextView);//获得属性值
        int i = type.getInteger(R.styleable.ScaleTextView_textSizePx, 25);
        baseScreenHeight = type.getInteger(R.styleable.ScaleTextView_baseScreenHeight, 720);
        setTextSize(TypedValue.COMPLEX_UNIT_PX, getFontSize(i));
    }


    /**
     * 获取当前手机屏幕分辨率,然后根据和设计图的比例对照换算实际字体大小
     * @param textSize
     * @return
     */
    private int getFontSize(int textSize) {
        DisplayMetrics dm = new DisplayMetrics();
        WindowManager windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
        windowManager.getDefaultDisplay().getMetrics(dm);
        int screenHeight = dm.heightPixels;
        Log.d("LOGCAT","baseScreenHeight"+baseScreenHeight);
        int rate = (int) (textSize * (float) screenHeight / baseScreenHeight);
        return rate;
    }

}

3.布局文件里使用这个view代替原来的TextView

修改一下布局的属性,baseScreenHeight和textSizePx的值就是设计图上标注的屏幕高度和字体大小:

 <util.ScaleTextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New World!"
            app:baseScreenHeight="1280"
            app:textSizePx="100"/>

这样就可以了,照抄设计图的尺寸去填写就可以,我们不仅可以自定义TextView,还可以自定义Button、EditText等不同的控件,快去动手尝试一下吧

参考链接:自定义TextView适配不同设备下的字体大小(Android) - 简书

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值