文字大小和不同的android屏幕尺寸
我知道,已经讨论过1000次了,但我无法调整不同屏幕尺寸的文字大小。 我尝试在自定义样式中使用“sp”作为大小单位:
<style name="CustumButtonStyle" parent="@android:style/Widget.Button"> ... <item name="android:textSize">30sp</item> ... </style>
在2.7 QVGA看起来不错:
2.7QVGA 30sp http://u.pikucha.ru/i8CRP/1.jpeg
但在WSVGA中,它看起来像这样:
7in WSVGA 30sp http://u.pikucha.ru/i8CRQ/2.jpeg
我试图用“sp”和“dp”来得到相同的结果。
你能解释一下如何让这些button在任何屏幕上看起来都一样吗?
完整的自定义button样式
<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"/>
@forcelain我认为你需要检查这个Google IO Pdf for Design 。 在这个PDF转到第77页,其中你会发现如何为Android的不同设备使用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.2以来,小型,普通,大型和xlarge已经被弃用了:
为Android 3.2声明平板电脑布局
对于运行Android 3.0的第一代平板电脑,声明平板电脑布局的正确方法是将其放置在具有xlargeconfiguration限定符(例如res / layout-xlarge /)的目录中。 为了适应其他types的平板电脑和屏幕尺寸 – 特别是7“平板电脑 – Android 3.2引入了一种新的方式来指定更多离散屏幕尺寸的资源,新技术是基于您的布局所需的空间量(如600dp的宽度),而不是试图让你的布局适合广义的尺寸组(比如large或者xlarge)。
当使用广义尺寸组时,7寸平板电脑的devise是棘手的,因为7寸平板电脑在技术上与5“手机(大型组)相同,而这两个设备看上去彼此之间看似接近,应用程序用户界面的空间大小与用户交互风格显着不同,因此,7“和5”屏幕不应总是使用相同的布局,以便为这些空间提供不同的布局两种屏幕,Android现在允许您指定您的布局资源根据实际可用于您的应用程序的布局的宽度和/或高度,在dp单位中指定。
例如,在devise好要用于平板电脑设备的布局之后,当屏幕宽度小于600dp时,可能会确定布局停止工作。 因此,此阈值将成为您平板电脑布局所需的最小尺寸。 因此,您现在可以指定只有当您的应用程序的UI的可用宽度至less为600dp时才应使用这些布局资源。
您应该select一个宽度并将其devise为最小尺寸,或者testing布局支持的最小宽度。
注意:请记住,与这些新尺寸的API一起使用的所有数字都是与密度无关的像素(dp)值,并且您的布局尺寸也应始终使用dp单位进行定义,因为您所关心的是系统之后可用的屏幕空间量说明屏幕密度(与使用原始像素分辨率相反)。 有关密度独立像素的更多信息,请阅读本文档前面的术语和概念。 使用新的大小限定符
表2总结了您可以根据布局可用空间指定的不同资源configuration。与传统屏幕尺寸组相比,这些新的限定符可让您更好地控制应用程序支持的特定屏幕尺寸(小型,普通,大,和大)。
注意:使用这些限定符指定的大小不是实际的屏幕大小。 相反,尺寸是以活动窗口可用的dp单位的宽度或高度表示的。 Android系统可能会使用系统UI的某些屏幕(例如屏幕底部的系统栏或顶部的状态栏),因此某些屏幕可能无法用于您的布局。 因此,您声明的大小应特别针对您的活动所需的大小 – 当声明为您的布局提供了多less空间时,系统将占用系统UI所使用的任何空间。 另外请注意,Action Bar被认为是应用程序窗口空间的一部分,尽pipe你的布局没有声明它,所以它减less了布局的空间,你必须在你的devise中考虑它。
表2.屏幕大小的新configuration限定符(在Android 3.2中引入)。 屏幕configuration限定符值说明smallestWidth swdp
示例:sw600dp sw720dp
屏幕的基本尺寸,如可用屏幕区域的最短尺寸所示。 具体来说,设备的最小宽度是屏幕可用高度和宽度中最短的(也可以将其视为屏幕的“尽可能小的宽度”)。 您可以使用此限定符来确保,不pipe屏幕的当前方向如何,您的应用程序的UI的可用宽度至less为dps。
例如,如果您的布局要求其最小尺寸的屏幕区域始终至less为600 dp,则可以使用此限定符创build布局资源res / layout-sw600dp /。 只有当可用屏幕的最小尺寸至less为600dp时,系统才会使用这些资源,而不pipe600dp是用户感知的高度还是宽度。 最小的宽度是设备固定的屏幕尺寸特征; 当屏幕的方向改变时,设备的最小宽度不会改变。
设备的最小宽度考虑屏幕装饰和系统UI。 例如,如果设备在屏幕上有一些占用最小宽度轴的空间的持久UI元素,则系统会将最小宽度声明为小于实际屏幕大小,因为那些屏幕像素不可用于您的UI。
这是通用屏幕大小限定符(小,正常,大,xlarge)的替代方法,允许您为可用于UI的有效大小定义离散数字。 使用smallestWidth来确定一般屏幕尺寸是有用的,因为宽度通常是devise布局的驱动因素。 一个用户界面通常会垂直滚动,但对水平所需的最小空间有相当严格的限制。 可用宽度也是决定是使用手机的单窗格布局还是使用平板电脑的多窗格布局的关键因素。 因此,您可能最关心的是每个设备上可能的最小宽度。 可用的屏幕宽度wdp
例如:w720dp w1024dp
以dp单位指定应使用资源的最小可用宽度 – 由该值定义。 当屏幕方向在横向和纵向之间切换时,系统相应的宽度值会更改,以反映您的UI可用的当前实际宽度。
这对于确定是否使用多窗格布局通常很有用,因为即使在平板电脑设备上,您也不希望使用与横向相同的多窗格布局进行纵向布局。 因此,您可以使用它来指定布局所需的最小宽度,而不是同时使用屏幕大小和方向限定符。 可用屏幕高度hdp
例如:h720dp h1024dp等
指定应使用资源的dp单位的最小屏幕高度 – 由值定义。 当屏幕的方向在横向和纵向之间切换时,系统相应的高度值会更改,以反映当前可用于UI的实际高度。
使用此来定义布局所需的高度与wdp用于定义所需宽度的方式相同,而不是同时使用屏幕大小和方向限定符。 然而,大多数应用程序不需要这个限定符,考虑到UI通常是垂直滚动的,因此在多less高度可用的情况下更灵活,而宽度则更加严格。
虽然使用这些限定符似乎比使用屏幕大小组更复杂,但确定UI的要求后,实际上应该更简单一些。 当您devise用户界面时,您可能关心的主要问题是应用程序在手机式用户界面和使用多个窗格的平板电脑式用户界面之间切换的实际大小。 这个开关的确切点取决于你的特定devise – 也许你需要一个720dp宽度的平板电脑布局,也许600dp是足够的,或480dp,或这些之间的一些数字。 在表2中使用这些限定符,可以控制布局更改的精确大小。
有关这些大小configuration限定符的更多讨论,请参阅提供资源文档。 configuration示例
为了帮助您针对不同types的设备定位您的一些devise,以下是一些典型屏幕宽度的数字:
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 / layout / main_activity.xml#对于手机res / layout-sw600dp / main_activity.xml#对于平板电脑
在这种情况下,可用屏幕空间的最小宽度必须为600dp才能应用平板电脑布局。
对于其他您想要进一步自定义您的用户界面来区分不同尺寸(如7“和10”平板电脑)的情况,您可以定义其他最小宽度布局:
res / layout / main_activity.xml#对于手机(小于600dp可用宽度)res / layout-sw600dp / main_activity.xml#对于7“平板电脑(600dp宽和更大)res / layout-sw720dp / main_activity.xml
对于10“片(720dp宽和更大)
请注意,前两组示例资源使用“最小宽度”限定符swdp,它指定屏幕两侧的最小值,而不pipe设备的当前方向如何。 因此,使用swdp是一种简单的方法,通过忽略屏幕的方向来指定可用于布局的整个屏幕大小。
但是,在某些情况下,对您的布局来说可能很重要的是现在有多less宽度或高度。 例如,如果具有两个并排的片段的双窗格布局,则无论设备处于横向还是纵向,只要屏幕至less提供了600dp的宽度,就可以使用它。 在这种情况下,您的资源可能如下所示:
res / layout / main_activity.xml#对于手机(小于600dp的可用宽度)res / layout-w600dp / main_activity.xml#多窗格(任何可用宽度为600dp或以上的屏幕)
请注意,第二组使用“可用宽度”限定符wdp。 这样,根据屏幕的方向(如果可用宽度在一个方向上至less为600dp而在另一个方向上小于600dp),则一个设备实际上可以使用两个布局。
如果可用高度是您所关心的,那么您可以使用hdp限定符执行相同操作。 或者,如果您需要真正具体的话,甚至可以结合使用wdp和hdp限定符。
我做了相同的尺寸,并绘制类似(与DP,但只适用于文本和drawText())
XML:
<dimen name="text_size">30sp</dimen>
码:
Paint p =new Paint(); p.setTextSize(getResources().getDimension(R.dimen.text_Size));
有时候,最好只有三个选项
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"/>
使用这个,你可以避免testing和指定尺寸不同的屏幕尺寸。
我想在这个post上回复的时间太晚了。 但我想分享我的想法或方式来解决不同的分辨率设备上的文字大小问题。 许多android开发人员网站build议我们必须使用sp单位的文本大小,这将处理差分分辨率设备的文本大小。 但是我总是无法得到理想的结果。 所以我find了一个我从过去的4-5个项目中使用的解决scheme,工作正常。 根据我的build议,你必须把每个分辨率设备的文本大小,这是有点繁琐的工作,但它会满足您的要求。 每个开发者都必须听取比例如4:6:8:12(分别是h:xh:xxh:xxxh) 。 现在在你的项目res文件夹中,你必须创build4文件夹与维斯文件例如
- RES /值-HDPI / dimens.xml
- RES /值-xhdpi / dimens.xml
- RES /值-xxhdpi / dimens.xml
- RES /值-xxxhdpi / dimens.xml
现在在dimens.xml文件中,您必须放置文本大小。 我向你展示了代码值的hdpi ,类似的,你必须放置其他分辨率值/ dimens.xml文件的代码。
<?xml version="1.0" encoding="utf-8"?> <resources> <dimen name="text_size">4px</dimen> </resources>
对于其他分辨率,它就像xhdpi :6px, xxhdpi :8px, xxxhdpi :12px。 这是用上面写的比例(3:4:6:8:12)来计算的。 让我们讨论以上比例的其他文字大小的例子。 如果你想在hdpi中获得12px的文本大小,那么在其他的分辨率就是这样了
- hdpi:12px
- xhdpi:18px
- xxhdpi:24px
- xxxhdpi:36px
这是实现所有分辨率所需文本大小的简单解决scheme。 这里我不考虑values-mdpi分辨率设备。 如果任何人想要包含此分辨率的文本大小,那么定量是像3:4:6:8:12 。 在任何疑问,请让我知道。 希望它会帮助你的人。
我想你可以通过为每个屏幕大小添加多个布局资源来存档,例如:
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
正如从3.2(API级别13)提到的@espinchi大小组已被弃用。 屏幕尺寸范围是未来最受青睐的方法。
不要硬编码的大小。
为了获得新的屏幕分辨率的灵活性 – 最好的做法是将虚拟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
作为参考,您可以添加常量或百分比大小(通过计算)。