扩展Android和Picasso中的图像资源

时间:2016-08-26 19:38:00

标签: android picasso

有很多关于密度的材料,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启发式选择最佳。

  1. 当文档说Android会自动缩放图像时它是否适用于我的情况?我不想按比例放大图片。

  2. 我应该在我的情况下存储多少个dpi变体?我应该在no-dpi文件夹中有单个文件,还是应该为每个dpi文件夹创建图片变体?

  3. 如何确定图片资源的维度?图标很容易:例如24x24 dpi,然后用DPI公式多次显示。但我想要覆盖完整的屏幕高度。章节配置示例列出:240x320 ldpi,320x480 mdpi,480x800 hdpi,720x1280 mdpi,800x1280 mdpi等。资源没有屏幕大小限定符。

  4. 感谢您的澄清。

2 个答案:

答案 0 :(得分:3)

我意识到事实上很容易找到Android的行为。我只需要每个DPI变体不同,所以我可以区分它们。我在每张图片中放置了带有DPI名称和像素分辨率的文本。

有一个sample GitHub Test DPI project。它有两个ImageView个。第一个是从XML初始化而Android则进行扩展。第二个是占位符,我用BitMap填充。我输入200dp作为它的大小,这是正确的。 MDPI的像素大小= dp中的大小。

enter image description here

我发现的是合乎逻辑的。 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)
  1. 存储在nodpi中,加载为230x541 px Bitmap
  2. 存储在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