2012-02-20 8 views
9

Poiché il livello API 15 di Android è lo methodpublic Drawable getDrawableForDensity (int id, int density) per recuperare un oggetto drawable per una densità dello schermo specifica. C'è un modo per farlo prima dell'API Livello 15?Ottieni drawable per densità per Livello API <15

+3

Non cercare di essere denso, ma perché non puoi semplicemente recuperare il Drawable con il suo nome (ID risorsa) e lasciare che il sistema operativo sia quello giusto? – Sparky

+1

Questo funziona perfettamente per i miei layout XML, ma quando carico la bitmap tramite BitmapFactory.decodeResource (risorse res, int id) mostra la bitmap con una risoluzione più piccola. Forse questo ha a che fare con un ridimensionamento di BitmapFactory, quindi volevo assicurarmi che stia caricando la risorsa giusta. Ad ogni modo, disegnando su una tela potrebbe essere utile avere accesso ad altre risoluzioni della bitmap, senza includerla più volte nell'APK. –

+0

Questo è vero, ma se vuoi essere pigro, puoi semplicemente includerlo una volta e lasciare che il sistema operativo capisca che non ci sono altre copie. Probabilmente puoi farla franca solo con MDPI o HDPI per una foto; la line art non sarà così bella. – Sparky

risposta

2

Quindi ho pensato che potesse essere risolto utilizzando il reverse engineering delle API di Android e il codice sorgente come da suggerimento di @ adtennant. Ho iniziato a scrivere la soluzione, ma nel processo ha colpito un vicolo cieco visto che l'API nativa (non Java) sottostante necessaria non è disponibile nelle versioni successive di Android.

Se stai bene vincolando questo solo a Bitmap, come implicito nel tuo commento, è possibile farlo con BitmapFactory come suggerito. BitmapFactory ha un altro metodo:

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

Questo metodo accetta l'ulteriore BitmapFactory.Options che vi permetterà di specificare la densità per caricare. Questo sembra essere in vigore dal livello di API 1. In particolare, credo che è possibile utilizzare:

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

Questo sarà anche ridimensionarlo alla densità schermo se una densità non corrispondenti viene caricato.

Problemi correlati