2012-03-26 143 views
91

我知道,它已被讨论1000次,但我无法调整不同屏幕尺寸的文字大小。我试着在我的自定义样式使用 'SP' 的尺寸单位:文字大小和不同的android屏幕尺寸

<style name="CustumButtonStyle" parent="@android:style/Widget.Button"> 
    ... 
    <item name="android:textSize">30sp</item> 
    ... 
</style> 

在2.7 QVGA它看起来OK:

2.7QVGA 30sp http://u.pikucha.ru/i8CRP/1.jpeg

但在7英寸WSVGA它看起来像这样:

7in WSVGA 30sp http://u.pikucha.ru/i8CRQ/2.jpeg

我试过同时使用'sp'和'dp'结果。

你能解释一下如何让这些按钮在任何屏幕上看起来都一样吗?

完整的自定义按钮样式

<style name="CustumButtonStyle" parent="@android:style/Widget.Button"> 
    <item name="android:background">@drawable/custom_button</item> 
    <item name="android:layout_width">fill_parent</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:layout_margin">3dp</item> 
    <item name="android:textColor">#ffffff</item> 
    <item name="android:gravity">center</item> 
    <item name="android:textSize">30sp</item> 
    <item name="android:textStyle">bold</item> 
    <item name="android:shadowColor">#000000</item> 
    <item name="android:shadowDx">1</item> 
    <item name="android:shadowDy">1</item> 
    <item name="android:shadowRadius">2</item> 
</style> 

而且在我的应用程序的主题我有

<item name="android:buttonStyle">@style/CustumButtonStyle</item> 

而且有我的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/RelativeLayout1" 
android:layout_width="fill_parent" 
android:background="@drawable/grid" 
android:gravity="center" 
android:orientation="vertical" android:layout_height="fill_parent"> 

<Button 
    android:id="@+id/buttonContinue" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:text="@string/continue_game" android:layout_marginTop="3dp" android:layout_marginBottom="3dp"/> 



<Button 
    android:id="@+id/buttonNewGame" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/buttonContinue" 
    android:layout_alignRight="@+id/buttonContinue" 
    android:layout_below="@+id/buttonContinue" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:text="@string/new_game" android:layout_marginTop="3dp" android:layout_marginBottom="3dp"/> 



<Button 
    android:id="@+id/ButtonAbout" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignLeft="@+id/buttonNewGame" 
    android:layout_alignRight="@+id/buttonNewGame" 
    android:layout_below="@+id/buttonNewGame" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:text="@string/about" android:layout_marginTop="3dp" android:layout_marginBottom="3dp"/> 

+0

在你的屏幕上,它们看起来一样。确保您的查看器比例为100% – 2012-03-26 19:11:43

+0

您可以编写您正在使用的按钮属性吗?文字大小与您的问题无关。 – PravinCG 2012-03-26 19:18:41

+0

@PravinCG我加了一些资料,请看第一篇文章 – forcelain 2012-03-27 04:21:16

回答

133

@forcelain我认为你需要检查Google IO Pdf for Design。在PDF转到页NO:77中,你会发现这表明如何有使用dimens.xml例如用于机器人的不同设备上看到的结构如下:

res/values/dimens.xml 

res/values-small/dimens.xml 

res/values-normal/dimens.xml 

res/values-large/dimens.xml 

res/values-xlarge/dimens.xml 

例如,你已经在使用下面dimens.xml值。

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="text_size">18sp</dimen> 
</resources> 

在其他值文件夹中,您需要更改文本大小的值。

注意:正如@espinchi所示,自Android 3以来,小型,普通,大型和xlarge已被弃用。2有利于下面的:

Declaring Tablet Layouts for Android 3.2

对于第一代运行Android 3.0片剂,申报片剂布局适当 办法是把它们放在一个目录与 XLARGE配置限定符(例如,res/layout-xlarge /)。在 为了适应其他类型的平板电脑和屏幕尺寸 - 在 特别是7“平板电脑 - Android 3.2引入了一种新的方式来指定 资源更多离散的屏幕尺寸。新技术是基于 您的布局空间量需求(如宽度为600 dp), 而不是试图让你的布局适应广义的尺寸分组 (如大或超大)。

使用 广义的尺寸时,设计为7" 平板电脑的原因是棘手组是7寸平板电脑在技术上与5“手机(大组)相同的 组。尽管这两个设备在尺寸上看起来彼此接近,但是应用程序UI的空间量与用户 交互的风格显着不同。因此,7“和5”屏幕不应始终使用相同的 布局。为了使您可以为这两种屏幕提供不同的布局,Android现在允许您根据实际可用于应用布局的宽度和/或高度指定 布局资源,并以dp单位指定。

例如,你设计你想要使用 平板式设备的布局后,你可能会确定布局停止 运作良好时,屏幕小于宽度为600 dp。因此,此阈值 将成为您平板电脑布局所需的最小尺寸。 因此,您现在可以指定这些布局资源应该是 ,只有当您的 应用程序的UI的可用宽度至少为600dp时才会使用这些布局资源。

您应该选择一个宽度并将其设计为最小尺寸, 或测试完成后,布局支持的最小宽度是多少。

注:请记住,这些新尺寸的API使用的所有数据均 密度独立像素(DP)值和您的布局尺寸 也应该始终使用dp单位来定义,因为你在乎 什么是量在系统 考虑屏幕密度(与使用原始像素 分辨率相反)之后可用的屏幕空间。有关与密度无关的像素的更多信息,请参阅本文档前面的术语和概念 。使用新的大小 预选赛

,你可以指定基于 可用于您的布局空间的不同的资源配置列于表2。这些 新的限定为您提供了具体的画面更加控件大小 您的应用程序支持,相比传统屏幕尺寸 组(小,中,大,和大)。

注意:使用这些限定符指定的尺寸不是实际屏幕尺寸的 。相反,尺寸是针对活动窗口可用的宽度或高度,单位为 。 Android 系统可能会使用系统UI的某些屏幕(例如屏幕底部的系统 栏或顶部的状态栏),因此屏幕的某些 可能无法用于您的布局。因此,您声明的尺寸 应特别针对您的 活动所需的尺寸 - 当 声明它为您的布局提供了多少空间时,系统将占用系统UI使用的任何空间。同时请注意, 操作栏被视为应用程序窗口 空间的一部分,虽然您的布局未声明它,所以它减少了可用于您的布局的 空间,并且您必须在您的 设计中考虑它。

表2.屏幕大小的新配置限定符(在Android 3.2中引入的 )。屏幕配置限定符值说明 最小宽度SWDP

实例:sw600dp sw720dp

一个屏幕的基本尺寸,由可用屏幕区域的最短 尺寸所指示的。具体而言,设备的最小宽度是屏幕可用高度和宽度的最短值(您也可以将其视为屏幕的“最小可能宽度”)。您可以使用此限定符来确保,无论屏幕的当前方向如何,您的应用程序的UI的可用宽度至少为 。例如,如果您的布局要求其最小尺寸 屏幕区域始终至少为600 dp,那么您可以使用此 限定符来创建布局资源res/layout-sw600dp /。 系统只有在可用屏幕的最小尺寸至少为600dp时才会使用这些资源,而不管600dp 这边是用户感知的高度还是宽度。最小宽度是设备的固定屏幕尺寸的 ;当屏幕方向改变时,设备的最小宽度不会改变。

设备的最小宽度考虑了屏幕装饰 和系统UI。例如,如果设备在屏幕上具有一些占据最小宽度轴的空间的持续UI元素,则系统声明最小宽度比实际屏幕尺寸小 ,因为这些屏幕像素不是 可用为您的用户界面。

这是通用屏幕尺寸限定符 (小尺寸,正常尺寸,大尺寸,大尺寸)的替代选项,它允许您为可用于UI的有效尺寸定义分立的 编号。使用 smallestWidth确定一般屏幕尺寸是有用的,因为宽度通常是设计布局的驱动因素。一个UI将经常垂直滚动,但对水平所需的最小空间有相当严格的约束。可用宽度也是 决定是否针对 手机使用单窗格布局或平板电脑的多窗格布局的关键因素。因此,您可能会关心大多数 关于每个设备上可能的最小宽度。 可用屏幕宽度WDP

实例:w720dp w1024dp

指定dp为单位的最小可用宽度在该资源 应由值定义。当屏幕的方向在横向和纵向之间切换 以反映当前可用于UI的实际宽度 时,系统对应的宽度值 会更改。

这对确定是否使用多窗格布局 通常很有用,因为即使在平板电脑设备上,您也不会希望使用多窗格布局进行纵向布局,就像横向布景一样。 因此,您可以使用它来指定 布局所需的最小宽度,而不是同时使用屏幕尺寸和方向 限定符。可用的屏幕高度HDP

实例:h720dp h1024dp等

指定dp为单位的最小屏幕高度处的资源 应由值定义。当屏幕的方向在横向和纵向之间切换 以反映当前可用于您的用户界面的实际高度 时,系统相应的高度值 会发生变化。

使用这个定义由布局所需要的高度是有用的 方式与WDP相同是用于定义所要求的宽度,而不是 同时使用屏幕尺寸和方向限定符。然而,大多数 应用程序不需要此限定符,因为UI通常会垂直滚动 ,因此更灵活,可用的高度为 ,而宽度更加严格。

虽然使用这些限定符看起来可能比使用 屏幕尺寸组更复杂,但确定 您的UI的要求后,实际上应该会更简单。当您设计用户界面时,您可能关心的主要内容 是应用程序 在手机式用户界面和使用 多个窗格的平板电脑式UI之间切换的实际大小。此开关的确切点取决于您的 特定设计 - 也许您需要为您的平板电脑布局设置720dp宽度, 也许600dp就足够了,或480dp或这些之间的某个数字。在表2中使用 这些限定符,您可以控制布局更改的 的精确大小。

有关这些大小配置限定符的更多讨论,请参阅 提供资源文档。配置实例

为了帮助您定位你的一些设计不同类型的 的设备,这里有一些数字为典型的屏幕宽度:

320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc). 
480dp: a tweener tablet like the Streak (480x800 mdpi). 
600dp: a 7” tablet (600x1024 mdpi). 
720dp: a 10” tablet (720x1280 mdpi, 800x1280 mdpi, etc). 

使用从表2的尺寸限定符,您的应用程序可以切换 在您的手机和平板电脑的不同布局资源之间使用 任何您想要的宽度和/或高度的数字。例如,如果600dp就 和平板电脑的布局支持的最小可用宽度,您可以 提供布局的这两套:

RES /布局/ main_activity.xml#适用于手机 RES /布局sw600dp/main_activity。 xml#对于平板电脑

在此情况下,可用屏幕空间的最小宽度必须为 600dp,以便应用平板电脑布局。

对于要在其中进一步定制UI以片剂尺寸如7” 之间 分化10” 和其他情况下,可以定义 附加最小宽度布局:

RES /布局/ main_activity.xml #针对手机(小于 600dp的可用宽度)RES /布局sw600dp/main_activity.xml#针对7” 片(宽度为600 dp和更大)RES /布局sw720dp/main_activity.xml

对于10” 片( 720dp宽和更大)

请注意,前两组示例资源使用 “最小宽度”限定符swdp,它指定屏幕两侧的最小值 ,而不管设备当前的方向为 。因此,使用swdp是一种简单的方法,可以通过忽略屏幕的 方向来指定可用于布局的整体屏幕大小。

但是,在某些情况下,对于您的布局而言可能很重要的是 究竟有多少宽度或高度可用。例如, 如果您有两个并排显示两个片段的双窗格布局,则只要屏幕至少提供600dp的宽度(设备处于横向还是纵向),您就可以使用 。在 这种情况下,你的资源可能是这样的:

RES /布局/ main_activity.xml#适用于手机(小于 为600 dp可用宽度)RES /布局w600dp/main_activity.xml#适用 多窗格(任屏幕600dp可用宽度或更多)

请注意,第二组使用“可用宽度”限定符 wdp。这样,一个设备实际上可以使用这两种布局,具体取决于屏幕方向上的 (如果可用宽度在一个方向上至少为 600dp,而在其他方向上为012d,则小于600dp)。

如果可用高度值得您关注,那么您可以使用hdp限定符执行相同的 。或者,如果您需要非常具体,甚至可以合并wdp和hdp 限定符。

+1

链接已死,请修复 – Boy 2014-03-20 15:17:15

+0

@Boy是的,我会找到该pdf,并会尽快更新 – Herry 2014-03-20 17:41:07

+7

这些小/正常/大/ xlarge目前已被弃用(2014年12月)。现在的首选方法是使用“swxxxdp”。请参阅http://developer.android.com/guide/practices/screens_support.html#range – espinchi 2014-12-05 18:22:34

7

我也一样按维度和油漆像(带有DP但仅限于文本和的drawText())

XML:

<dimen name="text_size">30sp</dimen> 

代码:

Paint p =new Paint(); 
     p.setTextSize(getResources().getDimension(R.dimen.text_Size)); 
+4

您不应该使用'dp'作为文本大小......而是使用'sp'。 – 2016-09-14 03:15:41

+0

请使用sp代表文字大小 – Thinsky 2016-11-22 03:38:52

2

我想你可以存档,通过添加多个布局资源,每个屏幕尺寸,例如:

res/layout/my_layout.xml    // layout for normal screen size ("default") 
res/layout-small/my_layout.xml  // layout for small screen size with small text 
res/layout-large/my_layout.xml  // layout for large screen size with larger text 
res/layout-xlarge/my_layout.xml  // layout for extra large screen size with even larger text 
res/layout-xlarge-land/my_layout.xml // layout for extra large in landscape orientation 

参考: 1. http://developer.android.com/guide/practices/screens_support.html

+1

使用res/values-small可能会更好。 – einverne 2016-10-10 06:37:30

+0

糟糕的实现之一。我们必须维持5种布局才能支持不同的尺寸? – SolidSnake 2018-02-09 06:14:00

-2

不要硬编码大小。

对于灵活性的广告新的屏幕分辨率 - 最好的做法是假的TextView放入布局,以获得TEXTSIZE:

<TextView 
     android:id="@+id/dummyTextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:visibility="gone" 
     android:text="TextView" /> 

而在你的示例代码:

TextView testTextView = (TextView) rootView.findViewById(R.id.dummyTextView); 
float textSize = testTextView.getTextSize(); 

保持textSize为可以添加常量或百分比大小的参考(通过计算)。

6

有时候,最好是只有三个选项

style="@android:style/TextAppearance.Small" 

使用小型和大型,从正常的屏幕大小进行区分。

<TextView 
      android:id="@+id/TextViewTopBarTitle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      style="@android:style/TextAppearance.Small"/> 

对于正常情况,您不必指定任何内容。

<TextView 
      android:id="@+id/TextViewTopBarTitle" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"/> 

使用此功能,您可以避免测试和指定不同屏幕尺寸的尺寸。

-1

由于从3.2(API级别13)提到的@espinchi大小组已被弃用。 Screen size ranges是未来最受青睐的方法。

4

我觉得为时已晚,无法在此主题上回复。但我想分享我的想法或方式来解决差异分辨率设备上的文字大小问题。许多android开发者网站建议我们必须使用sp单位的文本大小,它将处理不同分辨率设备的文本大小。但我总是无法得到理想的结果。所以我找到了一个我从过去的4-5个项目中使用的解决方案,它的工作正常。根据我的建议,您必须为每个分辨率设备放置文本大小,这是有点乏味的工作,但它会满足您的要求。每个开发者都必须听取如4:6:8:12(分别为h:xh:xxh:xxxh)的比例。现在在您的项目res文件夹中,您必须创建具有维文件的4文件夹,例如

  1. RES /值-HDPI/dimens.xml
  2. RES /值-xhdpi/dimens.xml
  3. RES /值-xxhdpi/dimens.xml
  4. RES /值-xxxhdpi /梦诗。 xml

现在在dimens.xml文件中,您必须放置文本大小。我向您展示的代码为values-hdpi,类似地,您必须为其他解析值/ dimens.xml文件放置代码。

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <dimen name="text_size">4px</dimen> 
</resources> 

对于其它分辨率是喜欢xhdpi:6像素,xxhdpi:8像素,xxxhdpi:12像素。这是用上面写的比例(3:4:6:8:12)计算的。让我们讨论以上比例的其他文字大小的例子。如果你想在华电国际12像素的文本大小,然后在其他分辨率将是

  1. 华电国际:12px的
  2. xhdpi:18像素
  3. xxhdpi:24px的
  4. xxxhdpi:36px

这是为所有分辨率实现所需文字大小的简单解决方案。我在这里不考虑values-mdpi分辨率设备。如果任何人想要包含此分辨率的文本大小,那么配给就像3:4:6:8:12。在任何查询中,请让我知道。希望它能帮助你的人。