前言
关于Android中的dp、sp,相信大家都知道它们的作用,网上也有很多文章介绍过在进行界面设计与适配时该如何去使用它们,但有些时候我们看过之后,还是对sp于dp的关系会有一种云(yi)山(lian)雾(meng)罩(bi)的感觉,这里根据我个人的一些经验,来谈谈对它们的认知,如有不妥之处,欢迎各位批评指正。
官方文档对sp、dp的描述
-
sp(Scale-independent Pixels)
Scale-independent Pixels - This is like the dp unit, but it is also scaled by the user's font size preference. It is
recommend you use this unit when specifying font sizes, so they will be adjusted for both the screen density
and the user's preference.
与标度无关的像素(缩放比例的像素)——这类似于dp单位,但它也被用户的字体大小偏好所缩放。建议您在指定字体大小时使用这个单元,因此它们将根据屏幕密度和用户的偏好进行调整。
通过对上述文档的解读,我们可以得知:
1. 官方推荐我们使用sp作为字体的大小单位;
2. sp会根据屏幕密度和用户的偏好(字体设置)的改变而调整——受屏幕密度、用户设置的影响。
-
dp(又称dip,Density-independent Pixels)
Density-independent Pixels - An abstract unit that is based on the physical density of the screen. These units are relative to a 160 dpi (dots per inch) screen, on which 1dp is roughly equal to 1px. When running on a higher density screen, the number of pixels used to draw 1dp is scaled up by a factor appropriate for the screen's dpi. Likewise, when on a lower density screen, the number of pixels used for 1dp is scaled down. The ratio of dp-to-pixel will change with the screen density, but not necessarily in direct proportion. Using dp units (instead of px units) is a simple solution to making the view dimensions in your layout resize properly for different screen densities. In other words, it provides consistency for the real-world sizes of your UI elements across different devices.
密度独立像素——一个基于屏幕物理密度的抽象单元。这些单位相对于160 dpi(每英寸的点)屏幕,1dp大约等于1px。当在更高密度的屏幕上运行时,用于绘制1dp的像素的数量会被一个适合屏幕dpi的因素放大。同样地,当在低密度屏幕上时,1dp的像素数量也会减少。DP与像素的比值随屏幕密度而变化,但不一定是正比。使用dp单位(而不是px单位)是一个简单的解决方案,可以在布局中适当地调整大小,以适合不同的屏幕密度。换句话说,它为您在不同设备上的UI元素的真实大小提供了一致性。
通过对上述文档的解读,我们可以得知:
1. 使用dp为单位进行UI元素的设计,可以更好的适应不同屏幕密度的设备;
2. DP与像素的比例是随着屏幕密度的变化而变化的。
实践是检验真理的唯一标准
这里我们新建一个layout,在里面添加两个TextView,分别使用sp、dp作为大小单位来看下在720p与1080p的设备上的效果,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是使用DP作为单位的TextView"
android:textColor="@android:color/black"
android:textSize="26sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是使用DP作为单位的TextView"
android:textColor="@android:color/black"
android:textSize="26dp"/>
</LinearLayout>
在1080p设备上的效果:
在720p设备上的效果:
将设备字体从正常(普通)设置为超大的效果:
总结
-
sp、dp相同点:
- 都是官方推荐的UI设计单位;
- 都会受到屏幕密度的变化的影响;
- 都是为了更好的展示UI在不同设备上的效果而推出的UI设计单位。
-
sp、dp不同点:
- dp只会受到屏幕密度变化的影响;
- sp在受屏幕密度变化的基础上,还会受到用户设置的影响。
通常情况下,建议使用sp作为字体大小的单位,但如果需要避免界面受到用户个人设置的影响时,可以使用dp来代替。
如果您有更好的建议欢迎评论分享,如有错误,请批评指正,谢谢。