获取API Level <15的密度相关可绘制对象

9
自Android API Level 15起,有方法public Drawable getDrawableForDensity (int id, int density)可用于检索特定屏幕密度的可绘制对象。在API Level 15之前是否有任何方法可以实现这一点?

3
不是故意要表现得愚笨,但为什么你不能只通过其裸名(资源ID)获取Drawable,并让操作系统自行确定正确的那个呢? - Sparky
1
这对我的XML布局很有效,但是当我通过BitmapFactory.decodeResource(Resources res, int id)加载位图时,它显示的分辨率较小。也许这与BitmapFactory进行的某些缩放有关,因此我想确保它正在加载适当的资源。无论如何,在绘制到画布时,访问位图的其他分辨率可能很有用,而无需在APK中多次包含它。 - Arthur Dent
没错,但是如果你想偷懒的话,你可以只包含一次并让操作系统找出没有其他副本。你可能只需要MDPI或HDPI的照片;线条艺术看起来不会那么好。 - Sparky
可能相关的先前讨论:http://stackoverflow.com/questions/7793031/is-it-possible-to-access-a-drawable-from-a-specific-density-in-android - Sparky
可能可以从Android源代码中反向工程化该方法:https://android.googlesource.com/platform/frameworks/base/+/d922ae01ca99a2b6d39a9393f86776a1d10ebd14/core/java/android/content/res/Resources.java - Alex Tennant
这可能会对你有所帮助 https://dev59.com/znXZa4cB1Zd3GeqPAv5o#18387344 - techieWings
1个回答

2

因此,根据@adtennant的建议,我认为可以使用Android API和源代码的反向工程来解决它。我开始编写解决方案,但在这个过程中遇到了瓶颈,因为后续版本的Android中缺少必要的底层本地(非Java)API。

如果您只考虑位图,就像您的评论所暗示的那样,那么可以使用建议的BitmapFactory来完成这项任务。BitmapFactory还有另一种方法:

{{link1:decodeResource(Resources res, int id, BitmapFactory.Options opts)}}

此方法接受附加的BitmapFactory.Options,这将允许您指定要加载的密度。自API级别1以来,它就存在了。具体而言,我相信您可以使用:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inDensity = DisplayMetrics.DENSITY_MEDIUM; // whichever you want to load
options.inTargetDensity = getResources().getDisplayMetrics().densityDpi;
options.inScaled = true;

这也会根据屏幕密度进行缩放,如果加载了不匹配的密度,则会进行适应。

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