单位和尺寸

    |     2015年4月20日   |   Android UI界面   |     0 条评论   |    2065

为了适配不同屏幕,指定控件和布局大小时最好用 match_parent 和 wrap_content,尽量别写死宽高。真要固定值时,布局里常用 px、pt、dp、sp。前两个在手机上很容易「一块屏一个样」。


一、px 和 pt:PC 好用,手机吃力

px 是像素,屏幕能显示的最小单元。单个像素肉眼几乎看不见,聚在一起才组成界面。pt 是磅,1 磅 = 1/72 英寸,常当字体单位。

在 PC 上用 px / pt 很顺手;到手机上分辨率五花八门:200px 宽的按钮在低分屏可能近乎满屏,高分屏可能只占一半。把 activity_main.xml 改成:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
  <Button
    android:id="@+id/button"
    android:layout_width="200px"
    android:layout_height="wrap_content"
    android:text="Button"
  />
</LinearLayout>

android:layout_width 写成 200px 后,再在 240×320 的低分辨率模拟器上跑一遍,同样 200px 的观感完全不同。pt 和 px 情况类似,所以这两个单位在手机上很难当默认尺寸。


二、dp 和 sp:跟密度走

Google 为此引入 dp(density-independent pixel,也叫 dip)和 sp(scale-independent pixel)。dp 在不同密度屏幕上显示比例更一致;sp 用同一套思路解决文字大小,并会随用户字体缩放。

密度是每英寸像素数,单位 dpi。屏幕宽 2 英寸、长 3 英寸:分辨率 320×480 时密度约 160dpi;640×960 时约 320dpi。密度越高,画面越精细。可在 onCreate() 里打印当前密度:

public class MainActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    float xdpi = getResources().getDisplayMetrics().xdpi;
    float ydpi = getResources().getDisplayMetrics().ydpi;
    Log.d("MainActivity", "xdpi is " + xdpi);
    Log.d("MainActivity", "ydpi is " + ydpi);
  }
}

按 Android 约定:160dpi 上 1dp = 1px,320dpi 上 1dp = 2px。用 dp 指定宽高,控件在不同密度上的视觉比例才能稳住。把按钮宽度改成 200dp:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
  <Button
    android:id="@+id/button"
    android:layout_width="200dp"
    android:layout_height="wrap_content"
    android:text="Button"
  />
</LinearLayout>

若模拟器刚好是 160dpi,这时 1dp = 1px,看起来会和 200px 几乎一样;换到低密度模拟器,dp 的优势才会明显。

单位 含义 手机上怎么用
px 物理像素 少写死;同 px 在不同分辨率上占比差很大
pt 磅,1/72 英寸 传统字体单位,手机适配同样吃力
dp / dip 密度无关像素 控件宽高首选;160dpi 时 1dp=1px
sp 可伸缩像素 文字大小首选,可跟系统字体缩放

三、换算关系

更细的 px ↔ dp 换算可以看:Android Dimension 转换算法原理分析。日常记忆:优先 match_parent / wrap_content;非写固定值不可时,控件用 dp,字号用 sp。

一句话总结:px/pt 跟物理像素绑死,换分辨率就变形;控件用 dp、文字用 sp,才能在不同密度上保持差不多的视觉大小。

转载请注明来源:单位和尺寸
本文链接地址:https://ai.zhousir.top/?p=476
回复 取消