code小生,一个专注Android领域的技术平台

作者:星际旅行android
地址:https://www.jianshu.com/p/730d0b2c1c5d
声明:本文已获星际旅行android授权,转发等请联系原作者授权


今天要说的是屏幕适配字体这块,为什么要选这么个主题呢,大家都知道Android机型众多,不同的手机屏幕分辨率也是千差万别,屏幕适配这块一直是个令人头疼的问题,不像iOS就只有一家。而字体适配又是这其中重要的一环,为什么要挑字体单独拿出来说呢,是因为本人今天在和公司UI对设计效果图的时候,发现怎么都难以沟通,索性写出来做个总结,让别人理解你之前,首先得自己整明白。

首先我遇到的第一个问题就是:
UI始终坚持认为app字体大小应该是固定的,即不同大小屏幕的手机,看到的字体是一样一样的。

这乍看起来似乎没毛病,就像iPhone那样,不同iPhone型号手机里面的APP字体大小显示是一样的。为什么会这样呢,iOS App开发中字体以磅(pt)为单位的,它们的转换关系为:pt = (px / 96) * 72,按照这样的一个公式,比如给定字体大小7.5磅(pt) ,按照公式得到 (7.5/72)96=10px(像素),这样不论是什么样分辨率的iPhone最终显示的都是一个固定的10px(像素)值。

而Android呢,按照上面iPhone的方式咱能不能直接拿来用呢,我们先去看一下谷歌官方文档怎么写的。

咦,瞧这谷歌文档写的,看来咱想直接生搬硬套iPhone是没指望了。官方文档可说了指定尺寸时,使用dp或sp单位,这里我们暂时不深究dp与sp之间的具体区别,咱先去瞧瞧市面上大厂的APP都是怎么处理的。

首先我们就去看下常用的qq,打开应用市场,搜索qq,

下载最新版的qq

下载完成后得到qq安装包,接着开始进行反编译,这里我们使用的是apktool,

之后打开qq安装包目录,会发现此时安装包目录下存在一个和qq同名的目录文件夹,点击进去发现里面有个res目录的文件夹,这个就是我们想要的资源文件。

这时我们打开Android studio 新建个工程,我们将反编译得到的res文件夹全部拷贝进新建的工程中,打开其中的一个布局文件,

可以看到里面的字体大小用的是sp,我们以同样的方式再去看看微信

发现字体大小用的是dp,接着再去看下简书

可以看到也是sp,最后我们再去看下新浪微博

同样还是sp,总结下就是微信字体大小用的是dp,qq、新浪微博和简书用的都是sp,说到这那么问题来了,这个sp 和dp到底有啥区别呢?

由于过去通常以像素为单位设计计算机用户界面。当一个像素在80x80的时候,在高分辨率显示器上运行该程序,则用户界面会显得很小。所以采用与分辨率无关的度量单位来开发程序就能够解决这个问题。而Android应用开发支持不同的度量单位。dp: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持 WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。dp与px之间的换算公式:px = dp * (dpi / 160), dpi是Dots Per Inch(每英寸所打印的点数),对于Android手机来说,常见的dpi有如下几种:

ldpi:对应的dpi范围为0 ~ 120,也就是说每英寸有0到120个像素点的屏幕的屏幕密度都属于ldpi
mdpi:dpi范围为120 ~ 160
hdpi:dpi范围为160 ~ 240
xhdpi:dpi范围为240~320
xxhdpi:dpi范围为320~480

在实际开发中,通常以dpi值120、160、240、320、480分别指代ldpi、mdpi、hdpi、xhdpi、xxhdpi。

也就是说,当我们设置字体大小为10dp,dpi为320的xhdpi的Android机,通过换算公式:px=10*(320/160),最终得到20px(像素)大小,如果是dpi为480的xxhdpi的Android机,通过公式得到30px(像素)大小。

而sp: scaled pixels(放大像素). 主要用于字体显示best for textsize. 这两个单位作用于字体大小本质上没啥区别,唯一的区别就是:当修改系统字体大小时,字体大小以dp为单位时,大小不变;而字体大小以sp为单位时,大小会跟随变化;

也就是说只有当我们进入到手机设置界面,手动去设置系统字体大小时,以sp为单位的字体会跟随系统设置而做出变化,而dp则不会,其他情况下是一样的。总结下就是,无论是用dp还是sp作为字体大小的单位,最终都是根据手机dpi来决定最终显示到屏幕上的像素大小。

第二个遇到的问题就是:
字体行间距和字间距很难调合适
Android 中设置行间距有两个方法,其中 android:lineSpacingExtra 表示额外的行间距数值,单位通常为 dp。如 android:lineSpacingExtra=”1dp”。

android:lineSpacingExtra 的值可以为负数,小数和0。如果值为正数表示增加行间距,如果值为负数表示减少行间距,如果值为0,则没有变化。

另一个 android:lineSpacingMultiplier 表示行间距的倍数,没有单位。如android:lineSpacingMultiplier=”1.2”。

android:lineSpacingMultiplier 的值可以为任意浮点数。如果值大于1.0表示增加行间距,如果值小于1.0表示减少行间距。

设置字间距的方法为 setLetterSpacing,

这里我们直接跟进源码,看注释的内容简单的翻译过来就是:正值扩大,负值将会使文本压缩,这里我们看一下微博的文本是怎么设置的

我们可以看到微博这里只设置了一个行间距3dp。接着我们再去看另一家简书

发现只有个行间距 2dp,其他的微信,qq 基本显示的都是单行文本,行间距字间距都是默认的。总结下就是两派要么参照 qq,微信采用默认,要么参照微博或简书设置个行间距 2 或 3dp。OK,问题搞定,洗洗睡觉~。

适配

RecyclerView点击item图片,从点击位置,放大到全屏,再次点击关闭

Android install apk 兼容至 Android 8

分享技术我是认真的

更多相关文章

  1. 图解RGB565、RGB555、RGB16、RGB24、RGB32、ARGB32等格式的区别
  2. 布局中文件中【控件间距参数详解以及单位选择】
  3. 布局中文件中【控件间距参数详解以及单位选择】
  4. Android开发屏幕适配
  5. android中修改tablayout中的字体大小和颜色
  6. android.inputmethodservice.KeyboardView 自定义键盘 字体大小
  7. Android截屏及图片解析
  8. Android中TextView 行间距和段间距设置
  9. 关于android的单位dp,dip

随机推荐

  1. Android(安卓)Studio 3.0后出现AAPT2和“
  2. Ubuntu下搭建Android开发平台
  3. Android手机客户端通过JSP实现与Tomcat服
  4. Android自绘字体大小paint.settextsize随
  5. Handler sendMessage 与 obtainMessage (
  6. android中的hdpi,ldpi,mdpi
  7. layout_weight详解
  8. Android(安卓)so 文件全部报错:Duplicate
  9. Android(安卓)Camera 四 Camera HAL 分析
  10. Android常见控件使用经验之——Activity