2011-03-25 157 views
9

我正在完成一個Android應用程序,剩下的工作就是爲多個設備調整UI佈局和圖形。我需要放置在屏幕上特定位置的特定元素。Android和支持多種屏幕布局

Android的文檔解釋瞭如何在多種屏幕分辨率和大小進行分類,並解釋了資源標籤系統。

例如,WVGA800 (480x800)WVGA854 (480x854)都被分類爲普通高密度屏幕。爲了迎合這些需求,您需要創建一個名爲「佈局」(已存在「普通」)和「drawable-hdpi」的文件夾。

問題是這樣無助於區分同一類別的兩個設備,即使您使用「DP」單位。您如何分別爲WGA800和WGA854提供佈局/繪圖?

的比例是十分不同的是,用戶很容易注意到不良比例,這是我需要的東西就像一個分數,計時器出現在對背景圖像的特定地點加劇。

相同的問題適用於{WQVGA400(240x400),WQVGA432(240x432)}和{WVGA800(480x800),WVGA854(480x854)}對。如何爲WQVA400和WQGA432提供佈局/繪圖?

+0

可能不是您正在尋找的答案,但您可以獲得屏幕寬度和高度,然後可以調整圖像大小或將分數和計時器放在合適的位置。 – Rajkiran 2012-03-15 16:48:58

回答

15

我認爲你正在走向地獄之路。

運行Android更每週一個巨大的各種設備,以及多種格式不存在尚未反而會引入新的變量。所以,即使您成功了,屏幕尺寸稍有不同的新設備也會失敗。

使用特定的屏幕分辨率爲Android設計是一個錯誤,並且類似於如果您強制所有頁面在網頁上的尺寸完全相同時發現的問題,它很少運行良好(例如,即使是整齊固定寬度網站將在移動設備上失敗)。

Android已經被設計爲支持這一切的變化,但如果你試圖讓你在暢遊逆市每個屏幕尺寸完美的像素絕對定位的渲染。這很可能非常痛苦,非常耗時且昂貴,並且可能最終失敗。即使你成功了,你將如何在所有這些屏幕變體上進行測試?這聽起來像是在測試地獄。

我強烈建議您接受您無法完全按照您的需要來做所有事情,而是看看如何使用流暢渲染對象的方式來相對於彼此進行渲染,因此該應用程序在所有不同的變體中看起來都很不錯,每組分辨率的不同佈局可改善不同尺寸屏幕上的體驗。

+2

非常感謝。但我需要大聲呼喊! – SK9 2011-03-25 12:49:58

+0

觀察 - 給定分類的所有成員的寬度是相等的。有沒有任何聲明意圖保持這種方式? – SK9 2011-03-25 13:09:02

+0

@ SK9我認爲最好假定Android可以運行在幾乎任何尺寸,形狀,方向以及任何存在或不存在的功能(GPS,網絡,鍵盤等)的設備上,並且顯示器遵循提供的概念併爲其定製 - 縱向/陸地,ldpi/mdpi/hdpi/xhdpi,屏幕尺寸等等。這並不容易,但是從長遠來看,這不是件容易的事情,而且很有可能這款應用程序在大多數設備上都能正常工作 – 2011-03-25 14:10:43

2

除了本頁其他地方的答案/評論,我想發表另一個回答我自己的問題,提請注意可以引入的屏幕資源類型。我不確信這在Android文檔中已經清楚,但就繪圖而言,您可以將屏幕大小標記添加到dpi標記頂部的可繪製文件。

例如,添加一個文件夾,名爲drawable-large-mdpi是有效的,如果他們能與大屏幕和中等分辨率的設備將拉動資源從這裏開始。但是,警告切換標籤的順序很重要:聲明drawable-mdpi-large是錯誤的。

5

是的,這是可能的:

首先你必須創建一個顯示類的實例。 之後,您將獲得顯示屏的寬度和高度。 然後,您可以通過使用if運算符並設置所需的圖像來檢查循環中的每個分辨率。

例子:

ImageView iview=(ImageView)findViewById(R.id.imageView1); 
//here are the Bitmaps optimized for each screen resolution 
Bitmap[] bitmaps={BitmapFactory.decodeResource(getResources(), R.drawable.icwvga800),BitmapFactory.decodeResource(getResources(), R.drawable.icwvga854),(...)}; 
// In this list all supported screensizes are defined 
int[][] possibleScreenSolutions={{480,800},{480,854},{240,400},{240,432},{480,800},{480,854}}; 
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay(); 
int[] ScreenSolution={display.getWidth(),display.getHeight()}; 
// Compare the real screen solution with the all supported ones 
for(int i=0;i<possibleScreenSolutions.length;i++){ 
    if((ScreenSolution[0]==possibleScreenSolutions[i][0])&&(ScreenSolution[1]==possibleScreenSolutions[i][1])){ 
      iview.setImageBitmap(bitmaps[i]);// set the image 
    } 
} 

我同意奧利C:這是太混亂檢查所有決議,但它至少是可能的。

我已經測試過它:它的工作原理。