在Android布局中使用与分辨率无关的字体

时间:2014-06-21 15:23:07

标签: java android resolution

背景

我正在为Android应用程序创建布局,并且到目前为止一直使用sp(或dp)中表示的字体大小,以便它们可以针对不同的设备正确缩放。然而,结果与我希望的结果不同。结果是文本在所有设备上具有相同的物理尺寸(以英寸为单位),而我喜欢的是它占据屏幕的相同比例。

目前我的菜单按钮在平板电脑上看起来有点小,但在手机上看起来很大(见截图;虽然它并不能证明手机版本有多糟糕)。

使用px实际上为我提供了我想要的这些特定设备的结果,但这是因为它们具有相似的分辨率(但是像素密度非常不同)。如果我根据我希望它在这两个设备(大约1,200 x 700)上看到的像素使用像素,而Galaxy S10的出现与Galaxy S3的物理尺寸相同,但分辨率为10,000 x 7,000,那么我的按钮会看起来很小。

问题

如何设置与分辨率无关的字体​​大小(或任何大小)(不是密度无关的)?

Galaxy S3 - 大手机

enter image description here

标签3 - 中等面板

enter image description here

当前布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:background="@drawable/menubackground"
    >

   <LinearLayout 
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:orientation="vertical" 
        android:layout_gravity="center"
        android:gravity="center"
     >
         <Button
         android:layout_height="wrap_content"
         android:layout_width="fill_parent"
         android:text="@string/singleplayer"
         android:layout_marginTop="50dp"
         android:layout_marginBottom="50dp"
         android:textSize="50sp"
         android:onClick="singleplayer" 

         />

         <Button
         android:layout_height="wrap_content"
         android:layout_width="fill_parent"
         android:text="@string/twoplayer"
         android:layout_marginTop="50dp"
         android:layout_marginBottom="50dp"
         android:textSize="50sp"
         android:onClick="twoplayer" 
         /> 

         <Button
         android:layout_height="wrap_content"
         android:layout_width="fill_parent"
         android:text="@string/campaign"
         android:layout_marginTop="50dp"
         android:layout_marginBottom="50dp"
         android:textSize="50sp"
         android:onClick="campaign" 
         />

         <Button
         android:layout_height="wrap_content"
         android:layout_width="fill_parent"
         android:text="@string/ai_vs_ai"
         android:layout_marginTop="50dp"
         android:layout_marginBottom="50dp"
         android:textSize="50sp"
         android:onClick="aiVsAI" 
         />
    </LinearLayout>


</LinearLayout>

1 个答案:

答案 0 :(得分:2)

首先,正如您所说,dp(密度无关像素)应该看起来相同&#34;物理&#34;所有设备的大小,无论显示密度如何,而sp(缩放像素)应根据用户偏好进行缩放。因此,它们不适合您尝试做的事情。

如果您不想要不同的布局,但只需要不同的字体大小,则可以使用对这些属性的资源引用。例如,您可以为valuesvalues-large

创建备用xml文件

values

<dimen name="mainMenuOption">50sp</dimen>

values-large

<dimen name="mainMenuOption">80sp</dimen>

然后,在您的布局中,使用:

<Button
    android:layout_height="wrap_content"
    android:textSize="@dimen/mainMenuOption"
    ...

大多数(尽管不是全部)属性可以使用对资源的引用。

当然,这并不能实现&#34;分辨率独立性,但它只允许自定义小部件&#34;而不是整个布局取决于设备特性。