2010-11-14 35 views

Répondre

2

Il est disponible dans le bitmap lui-même - http://developer.android.com/reference/android/graphics/Bitmap.html#getDensity()

Si vous chargez ce par le niveau plus élevé API Resources.getDrawable(), vous ne serez pas un Bitmap mais juste un Drawable abstrait. Si vous pouvez garantir que la ressource sera toujours un bitmap (pas un patch neuf ou autre chose), vous pouvez le convertir en BitmapDrawable et obtenir le bitmap à partir de cela. Si vous faites cela pour le code de production, je serais un peu mal à l'aise avec cela car généralement une application devrait soit laisser le framework s'occuper de la densité, soit s'en occuper tout seul (en mettant par exemple les bitmaps en drawable-nodpi). Si vous jouez à des jeux avec des bitmaps basés sur la densité chargée, vous pouvez vous tirer dans le pied. Ou vous pouvez bien aller, puisque je ne sais pas vraiment ce que vous faites. :)

+0

Merci. Je charge via getResources(), R.drawable et ce sera toujours un bitmap. Si cela finit en prod est encore à déterminer. Cela dépend de ce que j'apprends avant. Si le framework choisit toujours la densité correcte, je n'aurai pas à faire autant, mais je ne voulais pas supposer qu'il était sans bug, donc je voulais vérifier qu'il avait choisi ce que j'attendais en fonction des dimensions de l'écran. Si ce n'est pas le cas, je le mettrai moi-même à l'échelle et je définirai des valeurs afin que je puisse calculer les emplacements des bitmaps sur l'écran. Il y a d'autres raisons pour lesquelles je veux cette information, mais je manque de caractères que je peux taper dans ce commentaire. – Mike

+0

Vous ne voudriez pas le redimensionner vous-même - le framework met automatiquement à l'échelle un drawable (y compris les dimensions qui vous sont rapportées) en fonction de la densité de son bitmap par rapport à la densité du périphérique.Il y a beaucoup de choses subtiles faites pour s'assurer qu'un dessinable dans une densité différente de la densité dans laquelle travaille l'application se comportera comme si c'était dans la densité de l'application. Ceci est fondamental pour des choses comme le code de compatibilité de densité qui garantit que les applications écrites avant le 1.6 fonctionnent encore sur un appareil avec différents écrans de densité. – hackbod

+0

Une des raisons pour lesquelles j'ai pensé à faire cela est quand j'avais un bitmap d'arrière-plan qui était de 480 x 800 et que je l'ai testé sur un écran de 480 x 854, il y avait un trou en bas. En d'autres termes, il ne l'a pas automatiquement adapté à cet écran. Dès que j'ai mis le code à l'échelle moi-même, ça avait l'air bien. Êtes-vous en train de dire qu'il était censé évoluer automatiquement vers l'écran 480 x 854? – Mike

1

Je ne suis pas sûr de ce que peut faire avec le code, mais à des fins de test, j'ai ajouté une petite icône appelée resolution.png qui a une version dans la LDPI qui avait la lettre « l » en elle, la version pour mdpi avait une lettre «m» et la version pour hdpi contenait la lettre «h». De cette façon, vous pouvez voir quelle version des ressources sont en cours de chargement.

Je l'ai testé dans la mise en page la plupart du temps et je ne le commente pas quand je veux enquêter.

+0

Merci pour le conseil. Cela aidera à tester. – Mike

4

Obtenez le densityDPI de DisplayMetric et vérifier contre des constantes prédéfinies

DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics); 

switch(metrics.densityDpi) 
{ 
case DisplayMetrics.DENSITY_HIGH: //HDPI 
case DisplayMetrics.DENSITY_LOW: //LDPI 
case DisplayMetrics.DENSITY_MEDIUM: //MDPI 
} 
+0

Merci pour le code. Je l'ai essayé dans onSizeChanged dans ma vue et l'affiche comme une erreur "getWindowManger() est indéfini dans le type GameView" où GameView est ma vue personnalisée pour dessiner mes bitmaps sur le canevas, gérer les événements tactiles, etc ... Je reçois PAS d'erreurs, si je le mets dans mon activité qui lance cette vue .. Je prévoyais de le faire dans onSizeChanged, donc je peux définir des drapeaux pour changer la façon dont je dessine les bitmaps, traiter les touches et utiliser les bitmaps basés sur bitmap a été chargé. Mais, je suppose que je vais juste définir les drapeaux dans l'activité parent à la place. – Mike

0

Charger une image directement et de le comparer avec celui chargé par les ressources:

ressources sont accessibles sous forme de données brutes: utilisez AssetManager.open(..) Ensuite, vous pouvez utiliser BitmapFactory.decodeStream(..) pour créer un bitmap à partir du flux de données.

+0

Merci. Je vais regarder dans cette méthode. – Mike