簡體   English   中英

我應該從UI開發人員那里詢問什么圖像尺寸?

[英]What image size should I ask from UI developer?

我有一個具有以下屬性的ImageView

   android:layout_width="match_parent"
   android:layout_height="160dp"

UI開發人員問我在px中想要的Image大小。 我應該問什么尺寸? 我應該問不同尺寸的不同設備嗎?

注意

我沒有具有特定高度和寬度的ImageView 我的ImageView寬度是match_parent而不是特定的寬度。

所有答案都說我應該使用轉換器,如何將match_parent轉換為px

根據答案,我應該問六張圖片,不應該嗎?

您應該為UI開發人員提供最高的屏幕密度(以像素為單位),然后自行擴展以降低密度。

通常,Android應用程序將支持屏幕密度ldpi at min和xxxhdpi at max。

步驟1:如果您希望圖像大小為160 x 160 dp則為UI開發人員提供與最大屏幕密度相關的最高圖像大小。

160 x 4 = 640x640 px (why multiply by 4? I will explain later)

步驟2:根據屏幕密度將圖像640x640 px縮放到較小的尺寸

  • ldpi :160 x 0.75 = 120x120像素
  • mdpi :160 x 1 = 160x160像素
  • hdpi :160 x 1.5 = 240x240像素
  • xhdpi :160 x 2 = 320x320像素
  • xxhdpi :160 x 3 = 480x480像素
  • xxxhdpi :160 x 4 = 640x640像素

提示:找到與mdpi密度屏幕對應的圖像大小(稱為base density1X密度),然后通過以下公式縮放到其他密度

密度桶

更新:https://material.io/tools/devices/ ,基本密度屏幕的屏幕大小為360x640 px 因此,在1X 360x160 px密度屏幕上,您的ImageView尺寸將為360x160 px

ldpi: 270x120 px 
mdpi: 360x160 px
hdpi: 540x240 px
xhdpi: 720x320 px
xxhdpi: 1280x480 px
xxxhdpi: 1440x640 px

你為什么不使用Vector drawable?

為何使用矢量?

  1. 數據可以原始分辨率表示而不進行泛化。
  2. 圖像的圖形輸出比作為光柵圖像創建的更令人滿意
  3. 使用矢量圖形而不是光柵的另一個非常重要的原因是它們的大小。 矢量對象比光柵圖像格式小得多。 如果我們要更新全尺寸圖像,則矢量文件可能只占用系統上幾千字節的空間,而中等分辨率位圖格式的相同圖像可能不會放在CD ROM上。

您應該在項目中使用SVG圖像。

創建SVG而不是PNG文件

好的,你想設置大小為160dp的圖像高度(因為它是在dp中,這是mdpi中的大小)。 因此,您必須要求UI開發人員為您提供4倍高度的圖像。 圖像高度= 4 * 160.之后,您可以使用Android studio中的批量可繪制導入器,為所有不同的分辨率制作圖像。 希望能幫助到你。

不同的設備有不同的尺寸

android:adjustViewBounds="true"是圖像的自動拾取高度

所以你可以這樣,

    <ImageView
        android:id="@+id/ivImage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"/>

你可以參考這個

 ldpi: 270x120 px 
mdpi: 360x160 px
hdpi: 540x240 px
 xhdpi: 720x320 px
xxhdpi: 1280x480 px
 xxxhdpi: 1440x640 px

你應該選擇最大尺寸的1440x640

如果要支持具有多個圖像的多個設備,則可以進行5次標准圖像切片。

mdpi : 360x160 hdpi : 540x240 xhdpi : 720x320 xxhdpi : 1080x480 xxxhdpi : 1440x640


我想出了這些圖像尺寸,因為如果你看看最常見的顯示尺寸,其中最大的是三星Galaxy S8的1440x2960 (我知道2160x3840 ,但它不是主流,我甚至會說它完全瘋了)。

在您的情況下,您將寬度設置為match_parent ,在每種情況下,最大(甚至是自定義)DPI最多為1440px ,因此您可以確保99%的時間不會超過它。 (目前大多數具有9:18或9:X比率設備的設備,如果超過1080,幾乎在每種情況下都具有1440像素寬度。檢查發布的最新設備的分辨率。)

所以你可以穩定在1440像素的寬度。 現在你的ImageView高度是160dp。 哪個可以(如其他人所建議的) 160*4 = 640 px ,最大默認DPI xxxhdpi 您應該考慮標准dpis的高度,因為它固定為some dp (160dp),這可能會改變自定義dpi設備,因此您可以支持640px大小的最大設備。 希望我對大小建議很清楚。

這是Material Design提供的官方尺寸圖表或者您可以要求xxxhpdi,這是基於1440 x 2960 px的圖像,並使用此網站獲取具有各種密度的所有圖像。 當您獲得具有各種密度的圖像時,無需在px布局中指定高度和寬度。 保持圖像的名稱相同,並使用match_parent。 Android會根據設備自動選擇圖像。

要在具有不同像素密度的設備上提供良好的圖形質量,您應該在應用程序中提供每個位圖的多個版本 - 每個密度桶一個,具有相應的分辨率。 否則,Android必須縮放您的位圖,使其在每個屏幕上占據相同的可見空間,從而導致縮放偽像,例如模糊

在此輸入圖像描述

圖1.不同密度大小的位圖的相對大小

您可以在應用中使用多個密度存儲桶。 表1描述了可用的不同配置限定符以及它們適用的屏幕類型。

表1.不同像素密度的配置限定符。

在此輸入圖像描述

要為不同的密度創建替代位圖可繪制, 您應遵循 六個主要密度之間的 3:4:6:8:12:16縮放比例 例如, 如果您有一個位圖可繪制的 中等密度屏幕為48x48像素 ,則所有不同的大小應為:

  • 36x36像素(0.75x)用於低密度(ldpi)
  • 中密度(mdpi)的48x48像素(1.0倍基線)
  • 72x72像素(1.5x)用於高密度(hdpi)
  • 96x96像素(2.0x),用於超高密度(xhdpi)
  • 額外高密度(xxhdpi)的144x144像素(3.0x)
  • 額外超高密度(xxxhdpi)的192x192像素(4.0x)

然后,將生成的圖像文件放在res /下的相應子目錄中,系統將根據運行應用程序的設備的像素密度自動選擇正確的文件:

RES /

  • 繪制-xxxhdpi /

      awesome-image.png 
  • 繪制-xxhdpi /

      awesome-image.png 
  • 繪制-xhdpi /

      awesome-image.png 
  • 提拉 - 華電國際/

      awesome-image.png 
  • 繪制,MDPI /

      awesome-image.png 

然后,只要你引用@ drawable / awesomeimage ,系統就會根據屏幕的dpi選擇合適的位圖。 如果您沒有為該密度提供密度特定的資源,系統會選擇下一個最佳匹配並對其進行縮放以適合屏幕。

  • 提示:如果您有一些系統永遠不會擴展的可繪制資源(可能是因為您在運行時自己對圖像進行了一些調整),則應將它們放在具有nodpi配置限定符的目錄中。 具有此限定符的資源被視為與密度無關,系統不會對其進行擴展。

官方消息來源: 屏幕密度

試試這個源代碼

Display display = getWindowManager().getDefaultDisplay();
String displayName = display.getName();  // minSdkVersion=17+
Log.i(TAG, "Pantalla          = " + displayName);

// Tamaño en píxeles
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
Log.i(TAG, "Ancho             = " + width);
Log.i(TAG, "Alto              = " + height);

// dpi
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int heightPixels = metrics.heightPixels;
int widthPixels = metrics.widthPixels;
int densityDpi = metrics.densityDpi;
float xdpi = metrics.xdpi;
float ydpi = metrics.ydpi;
Log.i(TAG, "Ancho en píxeles  = " + widthPixels);
Log.i(TAG, "Alto en píxeles   = " + heightPixels);
Log.i(TAG, "Densidad dpi      = " + densityDpi);
Log.i(TAG, "x dpi             = " + xdpi);
Log.i(TAG, "y dpi             = " + ydpi);

// Deprecated
int screenHeight = display.getHeight();
int screenWidth = display.getWidth();
Log.i(TAG, "Alto de pantalla  = " + screenHeight);
Log.i(TAG, "Ancho de pantalla = " + screenWidth);

// Orientación 
int orientation = getResources().getConfiguration().orientation;
Log.i(TAG, "Orientación       = " + orientation);

是的,如果您不想使用矢量並希望使用圖像(png等),則需要為不同的屏幕尺寸拍攝多張圖像。

由於您的寬度為match_parent ,在這種情況下,請為不同密度桶采用最大屏幕寬度的圖像: -

MDPI -> 320 px
HDPI -> 480 px
XHDPI -> 640 px
XXHDPI -> 1080 px

一個dp是一個虛擬像素單元,大致等於中密度屏幕上的一個像素(160dpi;“基線”密度)。

根據上述說法,您可以找到圖像的高度: -

MDPI -> 160 px
HDPI -> 240 px
XHDPI -> 320 px
XXHDPI -> 480 px

如何計算 : -

考慮一下, 160 dp將是mdpi(1x)的160 px。

160 dp   would be 240 px in hdpi (1.5x).

等等..

或使用函數px = dp * (dpi / 160)

對於HDPI,dpi為240

px = 160 * 240/160
px = 240

對於dpi列表,請參閱此處

這有助於我弄明白,並清楚地說明問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM