首先你需要的所有設備提供圖片瞭解屏幕密度和屏幕尺寸之間的差異。
屏幕尺寸是物理尺寸,按照屏幕的對角線測量。 Android將所有實際屏幕尺寸分爲四種廣義尺寸:小尺寸,普通尺寸,大尺寸和超大尺寸。 手機可能有4.9英寸的屏幕尺寸,這將被認爲是正常的,Nexus 7(2012年的老款和2013年的新款手機)的屏幕尺寸爲7英寸,這很大,Nexus 10有一個屏幕大小10「,這是特大。
另一方面,屏幕密度是屏幕物理區域內的像素數量;通常稱爲dpi(每英寸點數)。例如,與「正常」或「高」密度屏幕相比,「低」密度屏幕在給定物理區域內具有更少的像素。 爲簡單起見,Android將所有實際的屏幕密度分爲四種廣義密度:低,中,高和特高(加上新的xxhdpi)。 舊Nexus 7的屏幕尺寸與新Nexus 7相同,但舊屏幕的分辨率爲1280x800,即216 dpi或hdpi,而新屏幕的分辨率爲1920×1200像素,分辨率爲323 dpi或xhdpi(更多相同物理區域內的像素意味着以dpi爲單位的較高像素密度)。
如果屏幕具有相同的屏幕密度,則可繪製文件夾中的圖像在小屏幕,普通屏幕,大屏幕和x大屏幕上將具有相同的物理尺寸。由於屏幕尺寸不同,圖像將佔據屏幕的不同部分。在小屏幕上,它佔用的百分比大於在大屏幕上的比例。
如果同一圖像位於其中一個屏幕大小的文件夾中(可繪製小,可繪製正常,可繪製大,可繪製x大),但您可以決定將更大版本的圖像放入繪圖-xlarge。在這種情況下,Nexus 10上的圖像比新的Nexus 7上的圖像更大(均具有xhdpi像素密度)。
如果屏幕具有不同的像素密度,即使相同的圖像看起來不同。圖像將是一個xhdpi屏幕上的一半大小相比,MDPI屏幕(因爲xhdpi屏具有約兩倍的像素密度):
http://developer.android.com/images/screens_support/density-test-bad.png
在圖標的情況下,你通常希望它具有相同的大小在不同的屏幕上。這就是爲什麼例如適用於mdpi屏幕菜單圖標是32×32和那些xhdpi屏幕是64×64,無一不是在適當的繪製文件夾(可繪製-MDPI和繪製-xhdpi):
http://developer.android.com/images/screens_support/density-test-good.png
現在,當你使用的像素密度和做的時候你使用屏幕尺寸可繪製的文件夾?
像素密度文件夾用於如果圖像應該與不同的屏幕密度的屏幕相同的物理尺寸通常是你想要的。如果您對舊版和新版Nexus 7使用相同的圖片,那麼即使屏幕具有相同的物理尺寸並且不是您想要的尺寸,它也會有不同的尺寸。因此使用密度依賴圖像勢在必行。如果你想要一個像有小,中,大和X大屏幕物理尺寸不同
屏幕尺寸文件夾中。如果我在主屏幕上有6個圖標的網格導航,並且我不想在更大的屏幕上使用額外的屏幕空間(例如添加更多圖標),那麼我會爲小屏幕提供一個小圖像和大屏幕的大圖像。 您仍然必須在屏幕尺寸相關的圖像之上提供密度相關的圖像,如前所述(例如舊款Nexus 7與新款Nexus 7)。
所以理論上你就需要16個不同的資源,爲相同的圖像(4個屏幕尺寸在4點屏幕密度或與新xxhdpi密度甚至5密度 - > 20組的資源)。 現在當然沒有人想要創造這麼多的資源,特別是如果你有很多圖像。 一種方法是使用有人建議的儀表板: http://developer.android.com/about/dashboards/index.html#Screens
並選擇小/ ldpi,normal/mdpi,normal/hdpi和normal/xhdpi(所有設備的81%)最常用的組合。你打倒的資源,只是4
另一種方法這樣是爲無論是屏幕尺寸還是屏幕密度提供資源(也只4所需資源),然後做一些縮放代碼。
如果你有屏幕密度依賴的資源,那麼你會使用如這https://stackoverflow.com/a/5016350/534471來縮放圖像(從來沒有)。
如果您有依賴屏幕大小的資源,那麼您可以使用此http://developer.android.com/reference/android/util/DisplayMetrics.html 來縮小圖像。
有這一切都在這裏(包括源代碼)一個很好的例子: https://www.captechconsulting.com/blog/steven-byle/understanding-density-independence-android
現在對於你具體的問題,你可以在文件夾繪製使用一個通用的圖像。該圖像的大小應該是這樣,它不會被放大(因爲這看起來很醜)。您可以定義這樣的佈局按鈕:
Display display = getWindowManager().getDefaultDisplay();
Point screenSize = new Point();
display.getRealSize(screenSize);
int size = Math.min(screenSize.x, screenSize.y);
int buttonSize = Math.round(size * 0.1f);
ImageButton button = (ImageButton) findViewById(R.id.myButton);
button.setMaxWidth(buttonSize);
button.setMaxHeight(buttonSize);
如何大應原圖像是:
<ImageButton
android:id="@+id/myButton"
android:src="@drawable/myDrawable"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:adjustViewBounds="true"
/>
與這段代碼按鈕擴展到屏幕的10%
在一起嗎?
Nexus 10目前可能是所有Android設備的最高屏幕分辨率。 1600像素將在xhdpi顯示屏上轉換爲3200個不依賴密度的像素。 3200的10%是320.如果您使用320x320圖像,那麼您將在所有現有設備上獲得良好效果。
雖然這種方法有一個問題。
320x320相當大(可能是24/32位顏色深度),因此您可能會遇到內存問題。如果您提供的密度相同的資源依賴繪製文件夾,您可以降低對華電國際,MDPI和LDPI設備內存佔用:
- 繪製-xhdpi:320×320
- 繪製,華電國際:240x240
- 繪製-mdpi:160×160
- 繪製-LDPI:120×120
屏幕尺寸繪製的文件夾可用於進一步改善這種(更小的屏幕需要更小的圖像),但是你」如前所述必須提供16或20個資源。最後,它是在內存佔用空間/速度與一方的可維護性/時間之間進行折衷,以在另一方創建資源/ apk大小。
這解釋了一切: http://developer.android.com/guide/practices/screens_support。 HTML。最重要的是瞭解屏幕密度和屏幕大小之間的差異以及如何影響您需要的圖像資源。 –
該文件非常複雜,犯錯誤的範圍很大......這就是爲什麼我想看到一個與我的問題相對應的例子。 – Mick
所以你把你的問題賞金,但不要標記答案是正確的,以便「拯救」一半的賞金... –