有很多关于密度的材料,multiple screen support,很多questions on SO,但我还没有得到它。
我的目标很简单:显示与ImageView
的可用空间一样大的位图。我需要BitMap
因为我会对它进行一些操作。
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/figureView" />
我将在位图中使用一些图片。我将它们放在drawables
目录中。我将用R.drawable.pictureX
引用它们。我将使用Picasso来加载它们并进行缩放:
Bitmap bitmap = Picasso.with(getContext()).load(resourceId).resize(w, h).get();
对我来说不清楚的部分是所有那些xxhdpi文件夹和Android启发式选择最佳。
当文档说Android会自动缩放图像时它是否适用于我的情况?我不想按比例放大图片。
我应该在我的情况下存储多少个dpi变体?我应该在no-dpi文件夹中有单个文件,还是应该为每个dpi文件夹创建图片变体?
如何确定图片资源的维度?图标很容易:例如24x24 dpi,然后用DPI公式多次显示。但我想要覆盖完整的屏幕高度。章节配置示例列出:240x320 ldpi,320x480 mdpi,480x800 hdpi,720x1280 mdpi,800x1280 mdpi等。资源没有屏幕大小限定符。
感谢您的澄清。
答案 0 :(得分:3)
我意识到事实上很容易找到Android的行为。我只需要每个DPI变体不同,所以我可以区分它们。我在每张图片中放置了带有DPI名称和像素分辨率的文本。
有一个sample GitHub Test DPI project。它有两个ImageView
个。第一个是从XML初始化而Android则进行扩展。第二个是占位符,我用BitMap
填充。我输入200dp作为它的大小,这是正确的。 MDPI的像素大小= dp
中的大小。
我发现的是合乎逻辑的。 Android对我的意图一无所知。它只选择当前DPI的最佳可用资源。
Nexus 5x默认使用XXHDPI,三星SIII Mini使用HDPI。如果我删除它们的默认DPI文件夹,它们会缩小更高的可用变量:XXXHDPI和XHDPI。如果我删除除NODPI之外的所有变体,将使用它。
最后,如果我将从源代码动态加载的ImageView的尺寸更改为300dp,那么它将被缩放并且看起来很难看。 Android无法在decodeResource
执行时知道我将在以后进行扩展,并且有更好的可用资源。
未知的是如何找出适合屏幕的图片尺寸。
爪哇:
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inScaled = false;
Bitmap figureBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_test, opt);
ImageView imageView=(ImageView) findViewById(R.id.testView);
imageView.setImageBitmap(figureBitmap);
的活动:
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_test" />
<ImageView
android:id="@+id/testView"
android:layout_width="200dp"
android:layout_height="200dp" />
8月30日更新
原始图片:230x541像素,加载
Picasso.with(getContext()).load(R.drawable.amalka).into(target)
nodpi
中,加载为230x541 px Bitmap xxhdpi
中,加载为230x541 px Bitmap 答案 1 :(得分:1)
1.Android将自动缩放图像,以防您为一个屏幕的阴影提供图像而另一个没有这样的图像。例如如果您只在drawable-xxxhdpi文件夹中添加图像,Android将生成xxhdpi,xhdpi屏幕dencities等图像。
2.您可以将图像保存在一个文件夹drawable-xxxhdpi中,让Android进行缩小,如果您不喜欢结果,您可以自己创建不同阴影的图像。
name dencity scale
mdpi 160dpi x1
hdpi 240dpi x1.5
xhdpi 320dpi x2
xxhdpi 480dpi x3
xxxhdpi 640dpi x4
3.您可以根据ImageView和dpi刻度的大小定义图像的尺寸。例如,如果您的ImageView的宽度为80dp,高度为40dp,则drawable-mdpi
文件夹的图像大小应为80x40px,因为mdpi是基准密度,对于drawable-hdpi
,您需要将图像设置为120x60px(比例为1.5)对于drawable-xxxhdpi
,您的图像将为320x160像素。
如果您希望图像适合所有设备上的所有屏幕,您可以使用参数android:scaleType="centerCrop"
,它将使图像占据所有空间,但根据屏幕宽高比可以隐藏图像的一小部分。您还可以尝试根据可用屏幕区域的最短尺寸指定图像资源,例如, drawable-sw720dp
。详细了解此here。