为什么ImageView中Drawable的宽度/高度会出错?

9
应该很简单。
当我调用image.getDrawable().getIntrinsicWidth()时,返回的值比源图像宽度大。它的X坐标返回的是2880而不是1920,这是1.5倍太大了?
我想知道ImageView是否具有“center” scaleType会影响它,但根据文档:“将图像居中显示在视图中,但不执行缩放。” 这是源代码:
<ImageView  
    android:id="@+id/backgroundImage"   
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:src="@drawable/background"
    android:scaleType="center"/>

你在 ImageView 中使用了 wrap_content 吗? - Macarse
是的,我的 ImageView 的高度和宽度都设置为 wrap_content - Graeme
4个回答

28
您说的可绘制资源来自您的/res文件夹。它在哪个文件夹里?
  • /res/drawable

  • /res/drawable-mdpi

  • /res/drawable-hdpi

    等等..

并且您正在测试的设备密度是多少?是具有240dpi一般密度的Nexus S吗?因为如果您的源可绘制资源位于drawable-mdpi文件夹中,并且您正在240dpi的设备上进行测试,那么Android系统将自动以1.5倍的比例扩展可绘制资源,以使其物理尺寸与160dpi的基准设备密度保持一致。 当调用getIntrinsicWidth()时,返回的是Android缩放可绘制资源后该资源想要成为的大小。您会注意到,2880 = 1920 * 1.5。 如果您将可绘制资源放置在/res/drawable中,则Android系统会将这些可绘制资源视为面向mdpi设备,因此会在Nexus S上进行放大。如果这是针对hdpi屏幕的,并且您不希望它放大,则可以尝试将其放置在drawable-hdpi中。

4
你尝试过按密度倍增高度和宽度吗?
getResources().getDisplayMetrics().density

你的drawable是从资源文件中获取还是从网络上下载的?如果是下载的,你需要为它指定密度:

DisplayMetrics metrics = new DisplayMetrics();
getContext().getWindowManager().getDefaultDisplay().getMetrics(metrics);
Resources r = new Resources(getContext().getAssets(), metrics, null);
BitmapDrawable bmd = new BitmapDrawable(r, bitmap);

0

检查它是否返回其显示大小的值,而不是实际大小。例如,在传统的800x480手机上,50x320像素的横幅广告显示为75x480。

应该能够根据密度(或您的眼睛!)来比较看它在做什么。


区别不是很大(它给出的是1660而不是1400)。我如何检查密度? - Graeme

0

这可能与你遇到的问题无关,但为了确保我还是会建议你这样做:在你的清单文件中是否指定了android:minSdkVersion

我提到这个原因是因为有一段时间我在一个项目中没有这样做,结果导致屏幕密度出现问题,并引发了各种奇怪的问题。


我的minSDK版本设置为10。 - Graeme

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接