2013-10-15 104 views
1

據我所知(如果我錯了,請糾正我),如果你想要在多個大小的設備上有好看的圖形按鈕(具有很好的抗鋸齒功能),你必須創建不同的一組不同大小的圖像並將圖像置於不同目錄的集合中。我正在尋找一個工作示例,顯示準確使用哪組目錄以及這些目錄需要的相對大小。順便說一下,當我說ImageButtons時,我的意思是包含一個圖像而不是文本 - 所以9patch圖像不會做到這一點。不同大小的設備上的ImageButtons

編輯:有一兩件事特別讓我困惑的是,我經常看到的例子(如chuck258的答案),人們使用不同的屏幕密度 ...但如果你與他們的寬度按鈕&高度關注對於密度來說,如果你有一個高密度但小尺寸的屏幕,那麼用你的按鈕佔用的屏幕部分會以各種不受控制的方式變化,那麼你的按鈕就會過大。

編輯:繼我最後的編輯,也許我應該更具體的瞭解我想要什麼?讓我們說,我希望有一個方形的ImageButton即約10%(我將接受8的變化%(僅限於人像)屏幕的寬度的百分比(%至13%)...我將製作多大尺寸的圖像以及它們將在哪個目錄中?

編輯:我得到的消息是,如果你有更多的屏幕房地產,那麼標準的事情就是讓圖標占據屏幕的一小部分。大概這是因爲允許圖標變得非常大,使它們看起來像玩具一樣,或幼稚。但事情是,我正在爲孩子製作遊戲應用程序!所以這正是我想要的。

+1

這解釋了一切: http://developer.android.com/guide/practices/screens_support。 HTML。最重要的是瞭解屏幕密度和屏幕大小之間的差異以及如何影響您需要的圖像資源。 –

+1

該文件非常複雜,犯錯誤的範圍很大......這就是爲什麼我想看到一個與我的問題相對應的例子。 – Mick

+0

所以你把你的問題賞金,但不要標記答案是正確的,以便「拯救」一半的賞金... –

回答

1

我不知道我的問題是否正確,但對於圖像的相對大小,請參閱:http://developer.android.com/design/style/devices-displays.html

您可以使用足夠大的圖像作爲您想要支持的最大屏幕。然後在圖像中使用scaleType="fitCenter"。這樣的一些缺點:

是的:ScaleType.FIT_CENTER是程序上相當於fitCenter財產。一般而言,您可以期望XML中的每個Property都有一個getter和setter。

+0

如果我想按鈕是一個(近似)的屏幕寬度的百分比,那麼這個答案沒有幫助。 – Mick

+0

如何爲最大的屏幕創建足夠大的圖像以支持並使用fitCenter?我已經在下面的回答中作爲評論發佈了這個帖子,但是如果這是正確的方式,我沒有提示你的問題 – chuck258

+0

我給出了評論upvote ...我試着以編程方式進行試驗。我認爲它需要一些額外的命令,如setmaxwidth和setadjustviewbounds,我認爲fitCenter的編程等價物是setScaleType(ScaleType.FIT_CENTER)。所以你的評論確實給了我一個很好的線索。如果您在答案的正文中填寫完整答案,我會將其標記爲正確。 – Mick

1

您應該始終爲所有密度創建圖像。大多數圖標(如圖標)的高度應該固定在dphttp://developer.android.com/guide/topics/graphics/2d-graphics.html#nine-patch

+0

相反「圖標應該是dp固定的高度」 - 這不會導致屏幕寬度百分比的巨大變化嗎? – Mick

+0

我的意思是像刷新圖標或菜單圖標的東西。如果你真的想要一個視圖是一個特定的屏幕precentage 9patch圖像將是要走的路 –

+0

但肯定9補丁是關於按鈕背景基本上是空的中心?我想在我的按鈕中央放一個適當大小的圖標。 – Mick

1

爲Android平臺通常的做法是隻針對不同屏幕密度提供的圖像,而不是屏幕尺寸:未固定的高度應是具有伸縮性的

更多9patch這裏9patch圖像表面的圖像。如果我使用平板電腦,我不想看到大圖像,我希望看到更多信息。所以最好不要增加視圖的大小,而要爲更大的屏幕提供不同的佈局。

但是,如果你有一些特定的原因提供圖像10%的屏幕寬度,你可以使用不同的'drawable'文件夾qualifiers。您對「可用寬度」,「屏幕大小」和「屏幕像素密度」限定符感興趣。 例如提供這種圖像:

  • 抽拉-sw320dp-MDPI - 圖像32PX寬度
  • 抽拉-sw320dp-HDPI - 圖像48像素寬度
  • 抽拉-sw320dp-xhdpi - 圖像64PX寬度
  • 抽拉-sw400dp-MDPI - 圖像寬度40像素
  • ...你想支持
+0

「爲所有需要支持的設備提供圖像」......但我希望支持2000設備!但幸運的是,我不需要我的按鈕*精確度* 10%的寬度,只是大約。所以大概是必須有一些更小的尺寸和目錄來完成這項工作。 – Mick

+0

沒有必要提供2000張圖片,我的意思是你可以找到最佳尺寸/密度對。請參閱Android設備儀表板:http://developer.android.com/about/dashboards/index.html#Screens – Jin35

10

首先你需要的所有設備提供圖片瞭解屏幕密度和屏幕尺寸之間的差異。

屏幕尺寸是物理尺寸,按照屏幕的對角線測量。 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大小。

+0

哇,謝謝伊曼紐爾。您已彙總Android文檔:) +1 – Hesam

0

轉到您的項目 - > Ctrl + n - > Android - > Android圖標集 - >下一個 - >輸入圖標名稱 - >下一個 - >圖像 - >瀏覽 - - >從電腦中選擇圖像 - >無 - >完成。 這就是它,它會在4個文件夾4個大小不同命名

1.drawable,華電國際 2.drawable-MDPI 3.drawable-xhdpi 4.drawable-xxhdpi

所以你自動創建單一的形象可以在您的應用程序中使用此圖像,它會根據設備屏幕尺寸拍攝該圖像。

0

你可以做這樣的事情:

package com.example.test; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Point; 
import android.os.Bundle; 
import android.view.Display; 
import android.view.Menu; 
import android.widget.ImageButton; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     //Get ImageButton from XML 
     ImageButton ib = (ImageButton) findViewById(R.id.imageButton); 
     //Get the screen size 
     Display display = getWindowManager().getDefaultDisplay(); 
     Point size = new Point(); 
     display.getSize(size); 
     //10% of the screen width 
     int width = (int) (size.x * 0.1); 
     //Get and scale the Bitmap (10% of screen width) 
     Bitmap bitmap = getImage(R.drawable.ic_launcher, width, width); 
     ib.setImageBitmap(bitmap); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 


    public Bitmap getImage (int id, int width, int height) { 
     Bitmap bmp = BitmapFactory.decodeResource(getResources(), id); 
     Bitmap img = Bitmap.createScaledBitmap(bmp, width, height, true); 
     bmp.recycle(); 
     return img; 
    } 
} 

而且ImageButton的:

<ImageButton 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/imageButton" /> 
+1

使用getRealSize而不是getSize。該文檔說:「這個值不應該用於計算佈局,因爲設備通常沿着顯示的邊緣具有屏幕裝飾(例如狀態欄),以減少從這裏返回的大小可用的應用程序空間量。應該改用窗口大小。「 –

0

這不回答你的問題完全一樣。但如果你只是尋找通用圖標,看看t IconicDroid library它幫助了我很多。您可以根據需要隨意調整圖標大小而不會看到質量,並且還可以節省大量空間,因此apk會更小。在google Play上有這個庫的演示。

0

假設您NEDD imageButotn寬度對於不同的屏幕的10%的大小將是 32爲(480)MDPI 48爲(480×800 | 854)HDPI 64(640x1024(星系片7" ))large- (720x1280(xperia sp,etc)xhdpi 80 for(800x1280(motorola xoom 10「)xlarge-mdpi 108 for(1080x1920(xperia z,etc)(720x1280(nexus 7))large-tvdipi 72 )xxhdpi so you make images in all this sizes and put them in the folders they be。

+0

除了「在他們應該在的文件夾中」部分,這一切聽起來都不錯......你能告訴我這些文件夾的名字嗎? – Mick

+0

drawable-mdpi, drawable-hdpi,drawable-xhdpi,drawable-xxhdpi,drawable-large-hdpi,drawable-large-tvdpi和drawable-xlarge-mdpi .. 對不起,回覆日期很晚... – Eddy

相關問題