我们啥时候应该在布局中使用 dp 或 sp?

Posted

技术标签:

【中文标题】我们啥时候应该在布局中使用 dp 或 sp?【英文标题】:When should we use dp or sp in layout?我们什么时候应该在布局中使用 dp 或 sp? 【发布时间】:2015-02-09 17:11:01 【问题描述】:

我创建了一个在大屏幕上看起来很完美的安卓应用。但是视图会变形,或者换句话说,在较小的屏幕上,上下部分会被截断。我可以互换使用 sp 和 dp ,但我不知道它们是不同的,如果不相同的话。我通常使用 sp 作为字体,使用 dp 作为尺寸。但这没有用。 sp和dp有什么区别,什么时候用什么?提前致谢。 xml布局文件是

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/tempLabel"
android:layout_
android:layout_
android:background="#CC66FF"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.coolweather.MainActivity" >

<TextView
    android:id="@+id/actualTemp"
    android:layout_
    android:layout_
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="@string/hundred"
    android:textColor="#FFFFFF"
    android:textSize="150sp" />

<ImageView
    android:id="@+id/degreeImageView"
    android:layout_
    android:layout_
    android:layout_alignTop="@+id/actualTemp"
    android:layout_toRightOf="@+id/actualTemp"
    android:paddingTop="50dp"
    android:src="@drawable/degree" />

<ImageView
    android:id="@+id/imageIcon"
    android:layout_
    android:layout_
    android:layout_alignBottom="@+id/cityLabel"
    android:layout_alignParentLeft="true"
    android:layout_marginLeft="55dp"
    android:src="@drawable/cloudy" />

<TextView
    android:id="@+id/summary"
    android:textSize="19sp"
    android:textColor="#FFFFFF"
    android:layout_
    android:layout_
    android:layout_below="@+id/linearLayout1"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="38dp"
    android:text="Pleasant cool day with flowers!" />

<LinearLayout
    android:id="@+id/linearLayout1"
    android:layout_
    android:layout_
    android:layout_alignRight="@+id/degreeImageView"
    android:layout_below="@+id/actualTemp"
    android:layout_marginTop="15dp"
    android:orientation="horizontal"
    android:weightSum="2" >

    <LinearLayout
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:orientation="vertical"
        android:paddingLeft="15dp" >

        <TextView
            android:id="@+id/humidityLabel"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:text="Humidity"
            android:textColor="#FFFFFF"
            android:textSize="17sp" />

        <TextView
            android:id="@+id/humidity"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:text="80%"
            android:textColor="#FFFFFF"
            android:textSize="17sp" />
    </LinearLayout>

    <LinearLayout
         android:paddingLeft="15dp"
        android:layout_
        android:layout_
        android:layout_weight="1"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/precLabel"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:text="Rain/Snow"
            android:textColor="#FFFFFF"
            android:textSize="17sp" />

        <TextView
            android:id="@+id/prcip"
            android:layout_
            android:layout_
            android:layout_gravity="center"
            android:text="100%"
            android:textColor="#FFFFFF"
            android:textSize="17sp" />
    </LinearLayout>
</LinearLayout>

<TextView
    android:id="@+id/timeLabel"
    android:layout_
    android:layout_
    android:layout_above="@+id/actualTemp"
    android:layout_centerHorizontal="true"
    android:text="At 5:00pm it will be"
    android:textColor="#80FFFFFF"
    android:textSize="20sp" />

<TextView
    android:id="@+id/cityLabel"
    android:layout_
    android:layout_
    android:layout_above="@+id/timeLabel"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="37dp"
    android:text="Roorkee"
    android:textColor="#FFFFFF"
    android:textSize="22sp"
    android:layout_marginLeft="10dp" />

<ProgressBar
   android:layout_marginBottom="15dp"
    android:id="@+id/progressBar1"
    android:layout_
    android:layout_
    android:layout_above="@+id/imageIcon"
    android:layout_centerHorizontal="true" />

<ImageView
    android:id="@+id/refreshImageView"
    android:layout_
    android:layout_
    android:layout_alignBottom="@+id/progressBar1"
    android:layout_centerHorizontal="true"
    android:src="@drawable/refresh" />

【问题讨论】:

Difference between px, dp, dip and sp in Android? 的可能重复项 dp 用于总体布局,sp 用于字体。 sp 或“可缩放像素”用于文本。 dp 或“密度无关像素”用于布局。 @shayanpourvatan 我需要回答我的布局问题。请根据问题发表评论。 你为什么在 textview id=actualTemp 中给出textSize 150sp?可能是因为您的布局不可滚动并且您的字体很大 【参考方案1】:

Android 建议您在设置字体大小时使用sp,并为宽度、长度、高度、边距、内边距等其他所有内容设置dp

【讨论】:

我用 sp 表示字体,用 dp 表示尺寸...但布局仍然失真 @NagabhushanBaddi 然后请编辑您的问题并添加崩溃的布局。【参考方案2】:

您可以将它们用于任何事情:高度、边距、字体大小等。

区别在于dp是固定单位,sp会根据手机字体大小设置进行缩放。

【讨论】:

如果我在任何地方都使用 sp,我的上述问题是否得到解决【参考方案3】:

sp 是推荐的字体大小单位,因为用户可以启用低可见性设置来增加设备上的字体大小。

dp 是一种物理测量单位,用于将屏幕分辨率转换为真实世界的尺寸。 dp 计算为resolution / density,其中density 对于 mdpi 屏幕 (160dpi) 为 1.0,并根据 dpi 进行相应缩放(即 480 dpi 的 xxhdpi 屏幕将具有 3.0 的密度)。 dp 用于您希望占据固定的真实世界大小的所有其他物理元素。

您需要发布您的布局代码,以便我们弄清楚为什么它会在较小的屏幕而不是较大的屏幕上被截断。这很可能是因为您正在定义一个固定的布局高度/宽度(即 600 dp),这在平板电脑上看起来很好(通常最小宽度至少为 600 dp),但大多数手机处于纵向模式的宽度为360 dp。

【讨论】:

以上是关于我们啥时候应该在布局中使用 dp 或 sp?的主要内容,如果未能解决你的问题,请参考以下文章

我们啥时候应该使用 freezed 作为密封类或构造函数?

我们啥时候应该考虑使用私有或受保护?

Android中常见的单位ppi,dp,dpi,sp,px

DSP 中 如何设置DP 和SP的值 有啥作用?

我们啥时候应该使用 android.arch.lifecycle:compiler(或 android.arch.lifecycle:common-java8)?

rosemount 3095变送器中的DP校验量程和SP校验量程各是啥意思,代表啥?