Android 获得API级别的可绘制密度<;15

Android 获得API级别的可绘制密度<;15,android,Android,由于Android API级别为15,因此有公共可绘制getDrawableForDensity(int id,int density)来检索特定屏幕密度的可绘制对象。在API级别15之前有没有办法做到这一点?所以我实际上认为可以按照@adtennant的建议,使用Android API和源代码的反向工程来解决这个问题。我开始编写它的解决方案,但在这个过程中遇到了一个死胡同,因为在以后的Android版本中,根本没有必要使用底层的本机(非Java)API 如果您同意将其限制为位图,正如您的评论所

由于Android API级别为15,因此有
公共可绘制getDrawableForDensity(int id,int density)
来检索特定屏幕密度的可绘制对象。在API级别15之前有没有办法做到这一点?

所以我实际上认为可以按照@adtennant的建议,使用Android API和源代码的反向工程来解决这个问题。我开始编写它的解决方案,但在这个过程中遇到了一个死胡同,因为在以后的Android版本中,根本没有必要使用底层的本机(非Java)API

如果您同意将其限制为位图,正如您的评论所暗示的那样,那么可以按照建议使用BitmapFactory执行此操作。BitmapFactory还有另一种方法:

此方法接受附加值,允许您指定要加载的密度。这似乎从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;

如果加载了不匹配的密度,这也会将其缩放到屏幕密度。

不尝试进行加密,但为什么不能通过其裸名称(资源ID)获取可绘制文件,并让操作系统找出正确的文件?这对我的XML布局很好,但是当我通过BitmapFactory.decodeResource(资源res,int ID)加载位图时它以较小的分辨率显示位图。也许这与BitmapFactory所做的一些缩放有关,因此我想确保它正在加载适当的资源。无论如何,当绘制到画布时,访问位图的其他分辨率可能会很有用,而无需在APK中多次包含它。这是真的,但是如果你想偷懒,可以只包含一次,让操作系统确定没有其他副本。对于照片,您可能只需要MDPI或HDPI;线条艺术看起来不太好。可能与之前的讨论相关:可以从Android源代码对该方法进行反向工程: