Android中字体大小自适应设备

Android进阶之路 - 字体自适应 开发中有很多场景需要进行自适应适配,但是关于这种字体自适应,我也是为数不多的几次使用,同时也简单分析了下源码,希望我们都有收获。 阅读详情
AI摘要

本文详述三种安卓字体自适应方案:通过不同分辨率的values目录实现,利用Google新属性autoSizeMaxTextSize等,及自定义计算字体大小。涵盖竖屏、横屏适配技巧。

本文介绍3种字体大小自适应设备的方法。第1种方法是建立针对不同屏幕分辨率的values目录,然后在相应的values下建立dimens.xml文件,并修改其中的值,这种方法比较繁琐,同时要建立多个value文件;第2种方法是使用Google新发布的3个属性autoSizeMaxTextSize、autoSizeMinTextSize、autoSizeTextType,但是这3个属性支持的最小SdkVersion(minSdkVersion)是26,SdkVersion小于26的不能用;第3种方法是在使用控件时,先计算设备的分辨率,然后,计算控件中相应文字的长度,最后设置字体大小。

1、建立value目录的方法

1.1 分辨率了解

常见的手机或平板的分辨率有480x320、640x480、800x480、800x600、1024x768、1280x720、1280x800、1920x1080、1920x1280等等。

1.2 建立values目录

针对不同的屏幕分辨率建立不同的values目录名称,例如:values-480x320、values-640x480、values-800x480、values-800x600、values-1024x768、values-1280x720、values-1280x800、values-1920x1080、values-1920x1280等。

注意1:目录中的“x”是小写英文字母,不是乘号。

注意2:上述的目录设置只能适配竖屏,适配横屏会混乱,例如:屏幕分辨率是800x480,设备竖屏时能适配到values-800x480目下的dimens.xml,如果设备横屏的时候适配的可能是values-480x320目录下的dimens.xml。如果适配横屏需要将目录名称的分辨率反过来写,例如:屏幕分辨率是800x480,做屏幕适配时需要将values目录写成values-480x800。

注意3:如果没有建立与设备分辨率相应对应的values目录,系统会自动适配到已经建立的小于设备分辨率的values目录,例如:设备分辨率是800x500,则系统会自动适配到values-800x480。

           

 

1.3 布局xml和dimens.xml代码


(1)布局xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".TestActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="@dimen/text_large"
        android:text="河南大学"/>
</LinearLayout>

1.4 运行结果

values-1024x768目录下的dimens.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--text size-->
    <dimen name="text_large">10sp</dimen>
</resources>

分辨率是1024x768设备的运行结果如下:
(注意:设备横屏和竖屏时自适应的字体大小可能不同)

 

                               设备竖屏                                                                       设备横屏

values-1280x720目录下的dimens.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--text size-->
    <dimen name="text_large">100sp</dimen>
</resources>

分辨率是1280x720设备的运行结果如下:

 

                        设备竖屏                                                          设备横屏

 

 

2、 Google新属性


2.1 属性介绍

Google的新属性如下:
android:autoSizeMaxTextSize="60sp"
android:autoSizeMinTextSize="6dp"
android:autoSizeTextType="uniform"
注意:他们需要配合android:maxLines="1"一起使用,并且上面三个属性只能兼容SdkVersion=26以上的版本。

2.2 布局xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".TestActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="40sp"
        android:maxLines="1"
        android:autoSizeMaxTextSize="60sp"
        android:autoSizeMinTextSize="6dp"
        android:autoSizeTextType="uniform"
        android:text="河南大学"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="40sp"
        android:maxLines="1"
        android:autoSizeMaxTextSize="60sp"
        android:autoSizeMinTextSize="6dp"
        android:autoSizeTextType="uniform"
        android:text="河南大学是百年老校!1912年在古城开封清代贡院旧址建校!"/>
</LinearLayout>

2.3 运行结果

(1)SdkVersion大于26的设备运行结果

 

                           设备竖屏                                        设备横屏

(2)SdkVersion=25的设备运行结果(不能自适应了)

 

                              设备竖屏                                           设备横屏

 

3、自定义重置计算字体大小

根据控件的宽度,重新计算字体的大小。首先需要获得控件的宽度和文本内容,然后,循环计算字体大小,直到文本内容完全适应控件的宽度。

3.1 xml源代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".TestActivity">
    <TextView
        android:id="@+id/test_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="40sp"
        android:maxLines="1"
        android:text="河南大学"/>
    <Button
        android:id="@+id/test_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="40sp"
        android:maxLines="1"
        android:text="河南大学是百年老校!1912年在古城开封清代贡院旧址建校!"/>
    <EditText
        android:id="@+id/test_edit_text"
        android:layout_width="match_parent"
        android:maxLines="1"
        android:layout_height="wrap_content"/>
</LinearLayout>

3.2 Activity源代码

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextPaint;
import android.text.TextWatcher;
import android.util.TypedValue;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class TestActivity extends AppCompatActivity {

    private Button button = null;
    private TextView textView = null;
    private EditText editText = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        this.button = findViewById(R.id.test_button);
        this.textView = findViewById(R.id.test_text_view);
        this.editText = findViewById(R.id.test_edit_text);

        this.initEvent();
    }

    /**
     * 初始化事件
     */
    private void initEvent(){
        this.editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }

            // 监听EditText的长度变化
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                resetViewTextSize(editText,editText.getWidth(),editText.getText().toString().trim());
            }

            @Override
            public void afterTextChanged(Editable s) {
            }
        });
    }

    // Activity渲染结束后,回调onWindowFocusChanged方法,此时控件的width和height不再是0。
    // 注意:控件的width和height在onCreate()、onStart()和onResume()中获得的值都是0。
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);

        this.resetViewTextSize(button,button.getWidth(),button.getText().toString().trim());
        this.resetViewTextSize(textView,textView.getWidth(),textView.getText().toString().trim());

    }

    /**
     * 重置控件中字体的大小
     * @param view view可以使EditText、Button、CheckBox、RadioButton,因为他们都继承
     * @param maxWidth
     * @param text
     */
    private void resetViewTextSize(TextView view, int maxWidth, String text) {
        // 获得控件的真实长度,去除控件的内部间距
        int realWidth = maxWidth - view.getPaddingRight() - view.getPaddingLeft();
        // 如果控件的长度小于等于0
        if (realWidth <= 0) {
            return;
        }
        // 查找合适的text长度
        TextPaint textPaint = new TextPaint(view.getPaint());
        float autoSize = textPaint.getTextSize();
        while (textPaint.measureText(text) > realWidth) {
            autoSize--;
            textPaint.setTextSize(autoSize);
        }
        // 字体大小最好使用px,因为上述使用getWidth获得的值是px,也可以使用COMPLEX_UNIT_SP是sp,但是需要转换。
        view.setTextSize(TypedValue.COMPLEX_UNIT_PX, autoSize);
    }
}

3.3 运行结果

 

                                  设备竖屏                                                                 设备横屏

Android进阶之路 - 屏幕适配(图片,字体) 抽时间补齐,补齐之后会删除此行 分辨率 不同分辨率的换算比例 图片适配 字体适配 字体适配 在Andorid手机的系统设置中有改变字体大小的功能,如果你没有进行适配的话,字体变大,布局混乱,就会造成尴尬处境 通用解决方案 : sp 转为 dp 属性 改变前 : &amp;lt;TextView android:layout_width=&quot;wrap_content&quot; ... 阅读详情

相关推荐

Android字体大小自适应不同分辨率的解决办法

Android字体大小自适应不同分辨率的解决办法 今天有人问我,Android系统不同分辨率,不同大小的手机,字体大小怎么去适应呢?其实字体的适应和图片的适应是一个道理的。 一、原理如下: 假设需要适应320×240,480×320分辨率。在res目录下新建文件夹values-320×240, values-480×320。然后在文件夹 values , values-320×240 和  values-480×320 下新建xml文件dimens.xml,该xml文件内容如下: vaules-320×240下的dimens.xml内容如下: <?xml version=1.0

【Android】TextView字体大小自适应的方式

众所周知,同样的一个话在中英文环境中的字符长度是不一样的。如果TextView没有做相应的适配,那么在切换环境之后读取xml中文本会导致UI变样。尤其是英文文本容易展示不全的问题。

weixin_44002043的博客 4039

《软件工程——实践者的研究方法》重难点复习笔记(第八章——理解需求)

8项需求工程任务 inception 开始 8.1.1 identify stakeholders 定义:从软件开发中收益 例如:市场人员、销售经理、顾客、顾问、维护团队等(P139) 8.1.2 这个阶段的问题是context-free的。有三套(P140) 8.1.3 提到NFR(nonfunctional requirement)和QFD(quality

whooiif的博客 1815

Android控件属性(5) - autoSizeMinTextSize、autoSizeMaxTextSize、autoSizeTextType等属性

主要适用于TextView,让文本尽可能占满控件(文本太长时自动减小字体尺寸,而文本短时则自动增大字体尺寸),是Android 8.0开始提供的功能。 例如下面的TexyView: <TextView android:layout_width="105dp" android:layout_height="70dp" android:text="a b c" ...

liwenqi的专栏 1万+

共享单车需求预测问题:建模篇

机器学习训练营——机器学习爱好者的自由交流空间(qq群号:696721295) 在上一篇里,我们使用可视化的方法分析了“共享单车”的数据集,理解了特征(变量)之间的关系。我们将在本篇建立几个模型预测单车的需求量,并比较它们的预测效果。 随机森林填充法 首先,导入必需的库、训练集和检验集。 import pylab import calendar import numpy as np impor...

wong2016的博客 1万+

告别VBA!用Python+PyWin32自动化你的SolidWorks建模流程(附完整代码)

本文详细介绍了如何利用Python和PyWin32实现SolidWorks建模流程的自动化,替代传统的VBA宏开发。通过环境配置、宏代码转换、高级开发模式及工程化实践等实战内容,帮助机械设计师构建高效、可维护的自动化工作流,显著提升设计效率。

weixin_30485379的博客 366

Android自适应大小和屏幕

屏幕大小: 一:不同的layout Android手机屏幕大小不一,有480x320, 640x360, 800x480.怎样才能让App自动适应不同的屏幕呢?    其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.Java里,而系统会根据屏幕的大小自己选择合适的lay

7425

西门子与汇川伺服脉冲连接(速度模式)

如何使用西门子PLC与汇川伺服进行脉冲连接

2301_77347966的博客 1万+

Android字体大小怎么自适应不同分辨率?

今天有人问我,android系统不同分辨率,不同大小的手机,字体大小怎么去适应呢?其实字体的适应和图片的适应是一个道理的。 一、 原理如下: 假设需要适应320x240,480x320分辨率。在res目录下新建文件夹values-320x240, values-480x320。然后在文件夹 values ,values-320x240 和  values-480x320 下新建xml文件di

非著名程序员 5万+

3DGS 2025实战指南:从安装到训练全流程解析

本文提供了3D Gaussian Splatting (3DGS) 从零开始的完整实战指南。详细解析了使用gsplat库进行环境配置、依赖安装(包括pycolmap和fused-ssim)、数据准备与COLMAP处理、核心训练流程及参数调优,并探讨了2025年3DGS在动态场景、可控编辑等领域的最新进展,帮助开发者快速掌握这一前沿3D重建技术。

b3n4m5q6w7的博客 359

6G网络的关键技术、应用前景与挑战并存的科技征途

移动通信技术正以前所未有的速度迭代更新,而6G技术的研发进程渐渐成为了当前科技领域的热点。全球各国已纷纷将目光投向了充满想象的6G时代。本文将探讨全球6G技术研发的最新进展,以及6G技术的核心创新与潜在应用。

fiberroad的博客 2424

Android屏幕自适应分辨率

控制Android分辨率 Android分辨率情况: 布局和字体等大小: 一 在res目录下进行设置,简单、方便、低效 二在Java文件中控制,效率较高,但是移植性和维护困难 对于图片的自适应: 一是9patch图 二是drawable-hdpi-800x480和drawable-hdpi-854x480,在它们里面放不同的图片,这样图片也能自适应了。 一、 布局和字体等大小 ...

iteye_14565的博客 313

llama factory

NOTE] 除上述链接以外的其他网站均为未经许可的第三方网站,请小心甄别。

thesky123456的博客 1273

Android中,字体大小自适应不同分辨率,以及注意事项

今天有人问我,Android系统不同分辨率,不同大小的手机,字体大小怎么去适应呢?其实字体的适应和图片的适应是一个道理的。 一、 原理如下: 假设需要适应320x240,480x320分辨率。在res目录下新建文件夹values-320x240, values-480x320。然后在文件夹 values ,values-320x240 和  values-480x320 下新建xml文件di

u012138032的博客 1万+

C# 固高板卡(总线型) 操作类

主要功能有:初始化,轴使能,正负方向手动移动,回0,点到点移动,等待移动完成,输入IO数据读取,输出IO控制,清除报警等功能。

StevenChen的博客 571

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

android 设置字体大小不同分辨率,Android字体大小自适应不同分辨率的解决办法

Android字体大小自适应不同分辨率的解决办法今天有人问我,Android系统不同分辨率,不同大小的手机,字体大小怎么去适应呢?其实字体的适应和图片的适应是一个道理的。一、原理如下:假设需要适应320x240,480x320分辨率。在res目录下新建文件夹values-320x240,values-480x320。然后在文件夹 values ,values-320x240 和 values-4...

weixin_36146811的博客 441

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android布局之屏幕自适应

from :http://blog.youkuaiyun.com/kangyaping/article/details/7400280       Android布局之屏幕自适应          在做应用时发现程序没有屏幕自适应功能,变换手机使用之后,界面就很混乱了,字体也很奇怪。经过百度的帮助,找到自适应方法。 1          字体的自适应 这里又有关于Android下表示大小的单位的相关知

534

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android控件自适应分辨率,Android字体大小自适应不同分辨率的解决办法

搜索热词Android字体大小自适应不同分辨率的解决办法今天有人问我,Android系统不同分辨率,不同大小的手机,字体大小怎么去适应呢?其实字体的适应和图片的适应是一个道理的。一、原理如下:假设需要适应320x240,480x320分辨率。在res目录下新建文件夹values-320x240,values-480x320。然后在文件夹 values ,values-320x240 和 valu...

weixin_33268725的博客 515

android屏幕大小字体大小,Android字体大小自适应不同分辨率的解决办法

Android字体大小自适应不同分辨率的解决办法今天有人问我,Android系统不同分辨率,不同大小的手机,字体大小怎么去适应呢?其实字体的适应和图片的适应是一个道理的。一、原理如下:假设需要适应320x240,480x320分辨率。在res目录下新建文件夹values-320x240, values-480x320。然后在文件夹 values ,values-320x240 和 values-...

weixin_36283702的博客 891

android 根据宽度调整字体大小,android 字体大小 根据分辨率 自动调整

Android字体大小怎么自适应不同分辨率人到了某一个阶段,生活就会开始给你做减法。拿走你的一些朋友,让你知道谁才是真正的朋友。拿走你的一些梦想,让你认清现实是什么。当你能看着自己忙里忙外,成为自己生活的旁观者,你才能找到自己的节奏。Android中一个layout想适配各种屏幕尺寸那么需要按以下规则去写layout: 1. 尽量使用wrap_content、match_parent、weight...

weixin_31264565的博客 937

android开发:在不同分辨率,不同屏幕密度dpi的平板上的字体大小和布局的自适应

最近在这家公司做一些android设备上的开发,使用了几款平板进行真机调试,面对不同分辨率,不同屏幕密度dpi的设备,碰到了一些和虚拟机不太一样的情况,在这里和大家分享一下。 1.一些名词的简单理解,后面会有详细说明        (1)屏幕尺寸:单位英寸(inch),指的是屏幕对角线长度。   (2)屏幕密度:单位dpi,指的是每inch上可以显示多少像素点即px。   (3)屏

来自友谊路的扛把子 6174

Android程序对不同手机屏幕分辨率自适应的方法

相信各位Android开发爱好者都知道,由于OEM之间的竞争,各种Android操作系统的手机简直就是琳琅满目,屏幕分辨率的差异可想而知。目前比较主流的有WVGA=800x480,HVGA=480x320,另外的还有QVGA=320x240。当然还有魅族M9的DVGA=960x640,还有蛋疼的摩托罗拉的FWVGA=854x480。      那么,如何让你的程序可以在不同分辨率的手机上“健康”

index_jsf的专栏 775

Android 字体自适应设置

不同分辨率下,Android字体大小怎么适应? 假设需要适应320x240,480x320分辨率。在res目录下新建文件夹values-320x240, values-480x320。然后在文件夹 values ,values-320x240 和 values-480x320 下新建xml文件dimens.xml,该xml文件内容如下 &lt;?xmlversion="1.0"e...

编程语言小筑 287

Android:自适应不同分辨率的屏幕大小、方向和不同分辨率的字体大小

适应不同分辨率的屏幕     Android手机屏幕大小不一,有480x320,640x360,800x480。怎样才能让App自动适应不同的屏幕呢? 1、不同分辨率的Layout        在res目录下创建不同的layout文件夹,比如:layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择

xiaochongwu的专栏 1139
上一篇: SAX和XmlPull解析XML文件
下一篇: SVG.js包的使用
MasonYyp
博客等级 码龄9年 301粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值