2011-06-19 82 views
13

不同Android產品的所有不同分辨率都讓我非常吃驚。如何支持Android產品的所有不同分辨率

我寫的第一個android應用程序是爲支持三種常用分辨率而設計的:240x320(LDPI),320x480(MDPI)和480x800(HDPI)。 480x854對佈局沒有任何損害,因爲它與480x800的寬度相同。

我也購買了如下設備來測試我的Android應用: 三星Galaxy歐洲(LDPI) 的HTC Desire Z(華電國際)

幸運的是我的女朋友有一個HTC野火S(MDPI),所以我已經得到了大部分決議。

但今天,我的兄弟下載了我的應用程序在他的新的HTC Sensation,它還有另一個分辨率540x960(HDPI?)。哪些應用程序沒有顯示我的應用程序,可能大多數平板電腦也無法正確顯示它。

我已經做了我的第一個應用程序被讀出的密度,然後設置參數:

public void set_ui_parameters() { 
    DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 

    if(metrics.densityDpi == DisplayMetrics.DENSITY_HIGH){ 
     textSize = 35;  
     timeWidth = 80; 
     dayWidth = 110; 
     moneyWidth = 50; 
    } else if(metrics.densityDpi == DisplayMetrics.DENSITY_MEDIUM){ 
     textSize = 35;  
     timeWidth = 53; 
     dayWidth = 73; 
     moneyWidth = 33; 
    } else if(metrics.densityDpi == DisplayMetrics.DENSITY_LOW){ 
     textSize = 28; 
     timeWidth = 40; 
     dayWidth = 55; 
     moneyWidth = 25; 
    } 
} 

而且我也創造了LDPI,MDPI和HDPI可繪製的參數。這適用於上述解決方案,但這取決於屏幕分辨率i.c.w.屏幕尺寸和失敗,例如與540x960的HTC sensatoin。

我知道並非所有的決議都經常使用,但我想盡可能地支持。 Stats of Screen Sizes and Densities

我讀了Supporting Multiple Screens多次,但沒有找到明確的答案,這個「問題」。

所以我應該讀出分辨率並根據分辨率而不是密度設置參數?這是一件明智的事情,或者你如何處理這件事?

非常感謝您的信息!

回答

27

您不必這樣做以支持不同的密度。你要做的是創建不同的資源文件夾:

res/values-ldpi/dimens.xml 
res/values-mdpi/dimens.xml 
res/values-hdpi/dimens.xml 

然後Android會決定使用哪個文件。你可以有這樣的事情:

<!-- in values-ldpi/dimens.xml --> 
<dimen name="textSize">25dip</dimen> 

和..

<!-- in values-mdpi/dimens.xml --> 
<dimen name="textSize">20dip</dimen> 

等等,你不應該在乎的分辨率......有很多不同的分辨率大小所以這將是一個地獄基於此做出決定。

此外,如果您使用dp而不是像素,則幾乎不必爲每個密度創建不同的尺寸文件。當然,有時你必須這樣做,但這取決於應用程序。

+0

由於這些值非常有用,但這並不能解決540x960分辨率的問題,或者我錯了。由於SQRT(540^2 + 960^2)/4.3=256,15(HTC Sensation)與SQRT(480^2 + 800^2)/3.7=252,15(HTC Desire Z)大致相同並且都將被索引爲HDPI,其中Sensation的屏幕寬度爲60px。 – patrick

+2

是啊...這裏的問題是,你將無法處理100%的屏幕尺寸。所以,舉例來說,如果你想要一個文本視圖來精確覆蓋屏幕的寬度,即使你應用了所有可能的技術,也會有一些設備將包裝文本或其他東西。我的觀點是,你不能讓你的應用在所有設備上看起來完全一樣,你必須遵守使它看起來更好。 – Cristian

0

現在,我就在這裏猜測,因爲沒有顯示的實施方案的休息,但我假設你正在使用這些導出的測量值作爲px

看看dp。這基本上可以爲所有設備自動執行所有這些操作。(設備獨立像素)

0

不用擔心分辨率的細微差別:540x960只比480x800略大。額外的垂直空間很簡單:它爲您的列表提供了更多空間。對於水平空間,只要你正確地處理你的佈局,你就可以在邊上添加額外的填充(30pix ea)。

不幸的是,全寬圖像(480寬)是一個稍大的問題。如果你想像素完美的圖像,你會想要使用scaleType =「中心」所以圖像中心,但不縮放。如果要全寬,可以使用scaleType =「fitCenter」使其填充。它會有點模糊...但在Android上有這麼多東西;-)

0

我遇到了這個問題,除了我的應用程序是一個遊戲,其中有一個SurfaceView畫布,我畫背景圖像和精靈(類似於LunarLander示例)。

您在這裏處理的方式是將您的背景圖像擴展爲您願意支持的最大尺寸(540x960),但您將所有重要的東西(如按鈕,文本,信息等)保存在一個更小的矩形內爲480x800。您可以擴展圖像本身,或者只是添加邊框。關鍵是沒有什麼重要的。

擁有480x800手機的人將會看到您的正常應用。使用540x960手機的人會看到一些額外的邊框。

1

您唯一需要做的就是在清單文件中將android:minSdkVersion設置爲7或更高。有可能某些視圖會顯示稍微不同,但應用程序是 適用,並在整個屏幕上。