我应该向UI开发人员询问什么图像尺寸?

时间:2018-08-01 07:19:15

标签: android android-layout android-imageview

我有一个ImageView,具有以下属性:

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

UI开发人员要求我提供我想要的像素大小(以px为单位)。我应该问什么尺寸?我应该为不同的设备要求不同的尺寸吗?

注意

我没有特定高度和宽度的ImageView。我的ImageView宽度是match_parent,不是特定宽度。

所有答案都表明我应该使用转换器,如何将match_parent转换为px

根据答案,我应该问大约六个图像,不是吗?

9 个答案:

答案 0 :(得分:8)

您应该为UI开发人员提供最高的屏幕密度(以像素为单位),然后自行缩放以降低密度。

通常,一个Android应用程序将支持最小屏幕密度 ldpi 和最大 xxxhdpi

第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 px
  • mdpi :160 x 1 = 160x160 px
  • hdpi :160 x 1.5 = 240x240 px
  • xhdpi :160 x 2 = 320x320 px
  • xxhdpi :160 x 3 = 480x480 px
  • xxxhdpi :160 x 4 = 640x640 px

提示::找到与mdpi密度屏幕相对应的图像尺寸(称为base density1X密度),然后通过以下公式缩放为其他密度

Density buckets

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

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

答案 1 :(得分:3)

为什么不使用Vector drawable?

为什么要使用矢量?

  1. 数据可以以原始分辨率表示而无需泛化。
  2. 图像的图形输出比作为栅格图像创建的图像更令人愉悦
  3. 使用矢量图形而不是栅格的另一个非常重要的原因是其尺寸。矢量对象比光栅图像格式小得多。如果我们要更新全尺寸图像,则矢量文件在您的系统上可能只占用几千字节的空间,而中等分辨率位图格式的同一图像可能不会放在CD ROM上。

您应该在项目中使用SVG图片。

创建SVG而不是PNG文件

答案 2 :(得分:0)

好吧,您想要设置图像高度为160dp(因为它是dp,所以是mdpi的大小)。因此,您必须要求UI开发人员使您的图像高度达到其高度的4倍。图像高度= 4 *160。之后,您可以使用android studio中的Batch drawable importer来制作所有不同分辨率的图像。希望对您有所帮助。

答案 3 :(得分:0)

不同的设备具有不同的大小

android:adjustViewBounds="true"是图像的自动拾取高度

这样你就可以了

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

答案 4 :(得分:0)

您可以参考

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

答案 5 :(得分:0)

您应该使用1440x640以获得最大尺寸。

如果要支持具有多个图像的多个设备,则可以有5个标准图像切片。

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


我想出了这些图像尺寸,因为如果您look使用最常见的显示尺寸,则其中最大的是1440x2960的Samsung Galaxy S8。 (我知道2160x3840,但它不是主流,我什至会说它是疯了)。

在您的情况下,您将宽度设置为match_parent,在每种情况下,最大DPI(甚至是自定义)DPI的最大宽度都为1440px,因此您可以确定99%的宽度时间不会超过它。 (当前大多数具有9:18或9:X比率设备的设备在超过1080的情况下,几乎在每种情况下都具有1440 px的宽度。请查看最新发布的设备的分辨率。)

因此您可以将宽度定为1440像素。现在您的ImageView的高度为160dp。对于最大的默认DPI 160*4 = 640 px,可以(根据其他所有人的建议)使用xxxhdpi。您应考虑标准dpi高度的原因,因为它固定为some dp(160dp),并且对于自定义dpi设备可能会有所变化,因此您可以使用640px的尺寸来支持最大数量的设备。希望我对尺寸的建议很清楚。

答案 6 :(得分:0)

这是Material Design给出的官方尺寸表,或者您可以要求xxxhpdi,它是基于1440 x 2960 px的图像,并使用this site来获得所有密度不同的图像。 当您获得具有各种密度的图像时,无需在px布局中指定高度和宽度。保持图像名称相同,并使用match_parent。 Android会根据设备自动选择图片。

答案 7 :(得分:0)

要在具有不同像素密度的设备上提供良好的图形质量,应在应用程序中提供每个位图的多个版本-每个密度桶一个版本,并具有相应的分辨率。否则,Android必须缩放您的位图,使其在每个屏幕上占据相同的可见空间,从而导致缩放伪影,例如模糊

enter image description here

图1。不同密度大小的位图的相对大小

在您的应用中可以使用几个密度桶。表1描述了可用的不同配置限定符以及它们适用的屏幕类型。

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

enter image description here

要创建不同密度的替代位图可绘制对象,您应在六个主要对象之间遵循 3:4:6:8:12:16缩放比例 。例如,如果您有一个可绘制的位图, 用于中密度屏幕的48x48像素所有不同的尺寸都应为:

  • 36x36像素(0.75x)用于低密度(ldpi)
  • 中等密度(mdpi)为48x48像素(基准值为1.0x)
  • 72x72像素(1.5x)用于高密度(hdpi)
  • 96x96像素(2.0x)用于超高密度(xhdpi)
  • 用于超高密度(xxhdpi)的144x144像素(3.0x)
  • 用于超高密度(xxxhdpi)的192x192像素(4.0x)

然后,将生成的图像文件放在res /下的适当子目录中,系统将根据您运行应用的设备的像素密度自动选择正确的图像文件:

res /

  • drawable-xxxhdpi /

     awesome-image.png
    
  • drawable-xxhdpi /

     awesome-image.png
    
  • drawable-xhdpi /

     awesome-image.png
    
  • drawable-hdpi /

     awesome-image.png
    
  • drawable-mdpi /

     awesome-image.png
    

然后,每当您引用 @ drawable / awesomeimage 时,系统都会根据屏幕的dpi选择合适的位图。如果您没有为该密度提供特定于密度的资源,则系统会选择下一个最佳匹配并将其缩放以适合屏幕。

  • 提示::如果您有一些系统永远无法缩放的可绘制资源(也许是因为您在运行时亲自对图像进行了一些调整),则应将它们放置在带有的目录中> nodpi 配置限定符。具有此限定符的资源被认为与密度无关,并且系统将不会扩展它们。

官方消息来源: Screen Densities

答案 8 :(得分:0)

尝试此源代码

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);