1

在我的应用程序的一部分中,我使用以下方法检查屏幕密度:

float sdpi = ApplicationConstants.ref_currentActivity.getResources().getDisplayMetrics().density;
if(sdpi == 0.75)
    {
        ApplicationConstants.screenSize = "small";
    }
    else if(sdpi == 1.0)
    {
        ApplicationConstants.screenSize = "medium";
    }
    else if(sdpi == 1.5)
    {
        //Message.inform("Setting Screen Size", "sdpi is:" + sdpi + " so screen size is large");
        ApplicationConstants.screenSize = "large";
    }
    else if(sdpi == 2.0)
    {
        ApplicationConstants.screenSize = "xlarge";
    }

然后稍后在另一部分中,我只是有一个基于 screenSize 加载正确图像位图的方法:

   if(ApplicationConstants.screenSize.equals("small"))
    {
        imageName = imageName + "s";
    }
    else if(ApplicationConstants.screenSize.equals("medium"))
    {
        imageName = imageName + "m";
    }
    else if (ApplicationConstants.screenSize.equals("large"))
    {
        imageName = imageName + "l";
        //Message.inform("ImageName should have an l at the end", imageName );
    }
    else imageName = imageName + "x";

所以基本上 - 如果我调用 findImageByName("SomeImage"),那么图像名称将根据屏幕密度更改为 SomeImages(small)、SomeImagem(medium)、SomeImagel(large)、SomeImagex(xlarge) - 然后我使用 imageName从我从 jar 文件中提取的图像中创建一个可绘制对象。

我看到这在我的 mdpi 屏幕设备上工作正常 - 但在模拟器上我没有图像显示在它们应该出现的位置。

我想也许我只是在某个地方犯了一个愚蠢的错误,所以即使我的 sdpi 为 1.5,我也将 ApplicationConstants.screenSize 更改为“中等”,并且仍然没有在模拟器运行时加载图像。

有人遇到过这个问题吗?

注意:我以这种方式加载图像的原因是因为它是一个模块化的ImageLoader 类,可以从 jar 文件中加载图像。jar 文件包含我在运行时使用 DexClassLoader 动态加载的 .class 所需的图像。如果有人对动态模块加载过程有任何疑问 - 请随时提问,我将解释为什么我会以这种方式加载图像。

任何帮助表示赞赏:) StackOverflowers 同胞。

注意:我目前无法访问 hdpi-real life android 设备。否则我会在那里测试它是否有效。

编辑:

我已经设法让它在模拟器上工作 - 但这没有使用状态......我最终需要在按钮上使用它以确保它们看起来像是被点击了。

这是有效的:

b[i].setBackgroundDrawable(ApplicationConstants.moduleImageLoader.findImageByName(drawable_normal));

这是行不通的:但应该!

states.addState(new int[] {}, ApplicationConstants.moduleImageLoader.findImageByName(drawable_normal)); b[i].setBackgroundDrawable(状态);

b 是一组按钮。ApplicationConstants.modularImageLoader 为当前模块获取正确的 imageLoader。findImageByName 采用“imageName”根据屏幕密度附加 s、m、l、x 并返回与该名称匹配的可绘制对象(即在我的模块的 jar 中具有该名称的图像文件)。ModularImage 加载器与我的模块加载器一起工作 - 确保为其相应模块加载正确的 imageLoader。

知道为什么状态在这种情况下不起作用吗?感谢您提供任何帮助...我是否错误地使用了状态?

4

2 回答 2

1

除非这些是拼写错误,否则我认为您最可能的问题是假设密度对应于屏幕尺寸。实际上,它很可能与您编码的内容相反(例如,密度越高,屏幕尺寸越小——通常),因为屏幕越大,像素分布得越远,导致密度。当然,可以通过增加屏幕分辨率来补偿并制作更高的密度,但在大多数情况下,密度较高的屏幕比密度较低的屏幕更可能是较小的屏幕。

于 2012-10-23T21:08:10.583 回答
0

我相信有多种可能性,例如:

  • 模拟器中的图像路径不同
  • 模拟器中不存在图片
  • 没有足够的内存来加载图像(尝试更小的尺寸或更改每个模拟器的内存设置)
于 2012-10-23T21:07:36.863 回答