2011-10-31 102 views
1

我希望只編寫一次佈局和代碼,以便在所有設備上看起來都不錯。 我已經嘗試了很多方法(是的,包括谷歌建議的,使用DP和添加多個佈局文件),但沒有真正解決每次有新的設備隨機應對新情況的問題分辨率和密度。 DP使用僅僅是一個XML技巧,可以使尺寸在所有屏幕上保持不變(例如,在所有屏幕上保持1cm的尺寸),所以它實際上不是解決方案。如何處理android屏幕碎片?

我也用權重和和代碼的技巧來設置正確的大小和位置,但它只是這樣一個簡單的任務太多的工作。

我聽說,谷歌正在爲這個問題的新的冰淇淋三明治版本的解決方案以及分片的版本,但我沒有聽到/讀任何新的東西這件事情。 不僅如此,多種密度的圖表&決議,該機器人需要支持是越來越大: http://developer.android.com/guide/practices/screens_support.html

這是一個恥辱,許多其他的技術已經有這個問題的解決方案:蘋果有它(自動將應用程序從iphone 3g縮放到iphone 4),adobe擁有它(閃光燈),甚至微軟擁有它(使用viewbox,Silverlight,WPF和WP)。即使電視也必須處理這個問題,而且他們做得很好。

我不要求魔法,只是一個方式來擴展一切。如果視圖是屏幕的W%,H%的大小,並且位於屏幕的X%,Y%的位置,則它應該在所有屏幕上保持這種方式,並且如果重要的話,也允許我們保持寬高比足夠我們。 爲什麼我們需要打擾解決方案和密度?這只是讓我們和圖形團隊感到困惑。

所以在最後,我認爲並希望很多人認爲我一樣,也許有人打了一個漂亮的SDK,解決了這一切?


@chubbard:DP不能正常工作,因爲它可以讓所有的屏幕都像標尺一樣保持完全一樣。如果在屏幕的3/4處出現了某種情況,它將不會在另一個屏幕上出現(它可能甚至在屏幕之外或者出現其他奇怪的事情,具體取決於您選擇的佈局)。 DP是一個固定值,僅根據密度將其轉換爲每個設備上的像素。所以,對於wvga800(hdpi-480x800)和wvga854(hdpi-480x854)之間的區別,DP不會改變任何東西,並且你得到54個像素,你不知道如何處理它們。如果你想爲wvga854放置一些東西,它不會顯示wvga800。更糟糕的是,在討論Android佈局時,這兩個屏幕之間沒有區別 - 它們都位於normal-hdpi的相同類別下。

還,如果使用DP,一個屏幕上的圖像/按鈕看起來不錯,但在其他屏幕它們看起來如此渺小相比,屏幕的其餘部分,所以它真的不能得到很好的解決。 我也不明白爲什麼我們有多個可繪製的文件夾通常設置爲取決於密度。它只會讓圖形團隊做更多的工作,並使應用程序的體積比它大得多,正因爲如此,市場可能不會接受它(因爲尺寸太大),甚至更糟 - 設備不會能夠下載應用程序(例如,Galaxy S上的舊操作系統版本無法下載尺寸大於30MB的安裝應用程序&)。

@adamp:我沒有說什麼absoluteLayout。它具有我想要克服其他佈局的確切不良行爲。唯一允許縮放的佈局是linearLayout(使用權重),但需要很多標籤和文字才能完成簡單的任務。 關於我想要什麼,我已經寫道:我希望一切都會擴展。在互聯網上有大量的例子,你可以看到它的工作正常,即使在閃存。只需打開一個完整的窗口flash/silverlight內容並調整窗口大小。如果程序員設置正確,那麼它的所有內容都將按照與原始大小相比的新大小進行縮放。 順便說一句,謝謝你的網格佈局的說明。我不知道。然而,它似乎也不能擴展任何東西。

@andreasg:現在這很有趣。你是如何處理圖像的?你可以試試下一個「謎語」嗎? 假設你有一張適合屏幕(並保持其長寬比)的人臉(或android :)的圖像),並且你有另一張以不同顏色着色的眼睛圖像,你會如何將它們放置一個(可能使用framelayout),以便在所有設備上看起來相同(縮放),無論您處於橫向還是縱向模式?

+3

我無法連接你的推理,爲什麼dp不是解決方案。你能描述一個使用dp沒有產生預期結果的具體情況嗎? – chubbsondubs

回答

0

我的方式來繪製自定義視圖爲每個屏幕大小合適的規模,以獲得實際的屏幕密度:

float density = context.getResources().getDisplayMetrics().density; 

和例如用16密度獨立像素

自定義視圖設置字體大小
paint.setTextSize(density * 16); 

那就是整個魔法。我希望這會解決你的問題。

1

您應該只使用完全不同的佈局來改變應用程序的行爲方式,而不是針對單個設備類(如手機)中的較小的屏幕尺寸差異。您可能會提供-land針對橫向模式進行了優化的版式變體,或者您可能會提供一個-sw600dp變體,以爲大約7「或更大的平板電腦呈現不同的信息體系結構。不應該使用此變體爲WVGA提供不同的版式與qHD手機顯示器相比,這樣做只會爲你自己創造許多額外的工作

dp是一款使用不同密度的工具,它不會幫助改變尺寸和長寬比的差異。在屏幕尺寸和寬高比方面的差異是使用框架中提供的佈局管理器來適應當前設備。如果您遇到了某種情況,您可以通過擴展ViewGroup並覆蓋onMeasureonLayout方法來輕鬆編寫自己的方法真正需要自定義行爲。 API 14增加了GridLayout,它還提供了更多選項。

設計這些差異確實需要採用不同的方法解決問題。除非您想爲自己做很多工作,否則您無法通過絕對屏幕座標思考問題。考慮一下佈局中的組件如何相互配合,以及哪些組件可以擴展,以便在可用時佔用比最小配置更多的空間。

以百分比的方式思考是一個好的開始,這正是您使用LinearLayout的權重特徵所獲得的結果。但是,如果您想指定某個視圖應該保持特定的高寬比,那麼您需要考慮應該如何限制,什麼可以填充任何多餘空間,以及這些決定是否會爲您的應用帶來良好的用戶體驗。 (例如,沒有用戶想要使用信箱本身的應用程序,只能在中間的固定長寬比框中顯示真實內容。)

沒有魔術解決方案,因爲只有您知道這些東西應該如何表現在你的應用程序。 Android會幫助你,但你必須告訴它你想要什麼。

也許你可以發佈一個關於你遇到麻煩的特定設計的問題,並且有人在這裏在stackoverflow可以提供一些建議。