2012-02-20 6 views
9

Desde Android API Nivel 15 existe el methodpublic Drawable getDrawableForDensity (int id, int density) para recuperar un objeto dibujable para una densidad de pantalla específica. ¿Hay alguna forma de hacer esto antes de API Nivel 15?Obtenga dibujable para la densidad para Nivel de API <15

+3

No intente ser denso, pero ¿por qué no puede simplemente obtener el Drawable por su nombre simple (resource ID) y dejar que el sistema operativo encuentre el correcto? – Sparky

+1

Eso funciona bien para mis diseños XML, pero cuando cargo el mapa de bits a través de BitmapFactory.decodeResource (Resources res, int id) muestra el bitmap con una resolución más pequeña. Tal vez eso tiene que ver con escalar el BitmapFactory, por lo tanto, quería asegurarme de que está cargando el recurso adecuado. De todos modos, al dibujar en un lienzo podría ser útil tener acceso a otras resoluciones del mapa de bits, sin incluirlo varias veces en el APK. –

+0

Eso es cierto, pero si quiere ser flojo, puede incluirlo una vez y dejar que el sistema operativo sepa que no hay otras copias. Probablemente pueda salirse con la suya únicamente con MDPI o HDPI; el arte lineal no se verá tan bien. – Sparky

Respuesta

2

Así que en realidad pensé que podría resolverse utilizando la ingeniería inversa de las API de Android y el código fuente según la sugerencia de @ adtennant. Empecé a escribir la solución, pero en el proceso llegué a un callejón sin salida ya que una API nativa subyacente (que no es Java) que es necesaria no está disponible en las versiones posteriores de Android.

Si está bien limitar esto solo a Bitmaps, como implica su comentario, es posible hacer esto con BitmapFactory como se sugiere. BitmapFactory tiene otro método:

decodeResource(Resources res, int id, BitmapFactory.Options opts)

Este método acepta la BitmapFactory.Options adicional que le permitirá especificar la densidad de carga. Esto parece haber existido desde el nivel API 1. En concreto, creo que se puede utilizar:

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

Esto también reduce la escala de la densidad de la pantalla si se ha cargado una densidad no coincidentes.

Cuestiones relacionadas