2012-03-26 483 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。在任何查詢中,請讓我知道。希望它能幫助你的人。