我有一个ImageView
,具有以下属性:
android:layout_width="match_parent"
android:layout_height="160dp"
UI开发人员要求我提供我想要的像素大小(以px为单位)。我应该问什么尺寸?我应该为不同的设备要求不同的尺寸吗?
注意
我没有特定高度和宽度的ImageView
。我的ImageView
宽度是match_parent
,不是特定宽度。
所有答案都表明我应该使用转换器,如何将match_parent
转换为px
?
根据答案,我应该问大约六个图像,不是吗?
答案 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
缩放到较小尺寸
提示::找到与mdpi密度屏幕相对应的图像尺寸(称为base density
或1X
密度),然后通过以下公式缩放为其他密度
更新:从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?
为什么要使用矢量?
您应该在项目中使用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必须缩放您的位图,使其在每个屏幕上占据相同的可见空间,从而导致缩放伪影,例如模糊。
图1。不同密度大小的位图的相对大小
在您的应用中可以使用几个密度桶。表1描述了可用的不同配置限定符以及它们适用的屏幕类型。
表1。用于不同像素密度的配置限定符。
要创建不同密度的替代位图可绘制对象,您应在六个主要对象之间遵循 3:4:6:8:12:16缩放比例 。例如,如果您有一个可绘制的位图, 用于中密度屏幕的48x48像素,所有不同的尺寸都应为:
然后,将生成的图像文件放在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选择合适的位图。如果您没有为该密度提供特定于密度的资源,则系统会选择下一个最佳匹配并将其缩放以适合屏幕。
官方消息来源: 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);