【问题标题】:ImageView doesn't stretch image properlyImageView 无法正确拉伸图像
【发布时间】:2014-01-27 23:10:03
【问题描述】:

所以我不知道为什么会这样。我正在使用通用图像加载器来加载这些图像。似乎由于某种奇怪的原因,最后一行像素被拉伸了。我希望图像均匀地伸展。 (我不在乎它看起来很奇怪。下面的图片用于演示目的。)

另外,不要介意第一张和最后一张图片。我故意把它弄模糊了,因为上面有人的脸。

这就是我设置通用图像加载器的方式:

    //setup Image Loader for loading cruise line logos
    displayImageOptions = new DisplayImageOptions.Builder()
    .showImageOnLoading(R.drawable.ic_launcher)//show this image when image is loading
    .showImageForEmptyUri(R.drawable.ic_launcher)//show this image incase image doesn't exist
    .showImageOnFail(R.drawable.ic_launcher)//show this image if fetching image from URL didn't work
    .cacheInMemory(true)//cache image in RAM
    .cacheOnDisc(true)//cache image in device for later use
    .considerExifParams(true)
    .displayer(new RoundedBitmapDisplayer(5))//super subtle rounded corners on images
    .build();

【问题讨论】:

  • 对于 imageview,您已将高度固定为 120dip,并使用 scaletype 作为 fitXY,这可能是导致问题的原因。
  • 我尝试了 centerCrop 并将其全部删除。两者都不起作用。另外我需要使用 fitXY 来拉伸。

标签: java android image android-imageview universal-image-loader


【解决方案1】:

这是由RoundedBitmapDisplayer 绘制位图的方式引起的。

如果您查看源代码,您会发现它使用 RoundedDrawable,它使用 canvas.drawRoundRect() 绘制所需大小的圆角矩形,通过 BitmapShader 使用下载的图像作为纹理. BitmapShader 不支持缩放(仅钳制和平铺模式)。尝试使用 SimpleBitmapDisplayer 代替它使用正常的 ImageView.setImageBitmap() 显示图像的方式。

如果您需要圆角,则必须找到一种不同的方法来实现它,例如首先将位图缩放到所需的大小。另一种选择是在委托给 BitmapDrawable 进行缩放之前调用Canvas.saveLayer(),然后使用PorterDuff.Mode.DST_IN 应用圆角遮罩效果。无论哪种方式,您最终都会编写更多低级代码,但您应该能够将所有内容很好地封装在自定义 BitmapDisplayer 中。

【讨论】:

  • 感谢您的回复。明天将对此进行测试,并让您知道它是否有效。
  • @Dimitri 我可以解决这个错误,但不使用圆形位图显示解决了这个问题。我刚刚在 GitHub 上发布了错误,所以也许它会在那里得到解决
猜你喜欢
  • 1970-01-01
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多