Réponses:
density = getResources().getDisplayMetrics().density;
// return 0.75 if it's LDPI
// return 1.0 if it's MDPI
// return 1.5 if it's HDPI
// return 2.0 if it's XHDPI
// return 3.0 if it's XXHDPI
// return 4.0 if it's XXXHDPI
Vous pouvez vérifier la densité de l'écran avec:
switch (getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
// ...
break;
case DisplayMetrics.DENSITY_MEDIUM:
// ...
break;
case DisplayMetrics.DENSITY_HIGH:
// ...
break;
case DisplayMetrics.DENSITY_XHIGH:
// ...
break;
}
EDIT Sachez qu'au fur et à mesure qu'Android évolue, d'autres valeurs doivent être incluses dans les switch
cas. À partir de cette modification, cela inclut DisplayMetrics.DENSITY_TV
et DisplayMetrics.DENSITY_XXHIGH
. Consultez la documentation pour les dernières informations; Je ne vais pas prendre la peine de maintenir cette réponse.
density
comme suggéré par SteD.)
DENSITY_XXHIGH
. J'ai ajouté un avertissement à la réponse pour couvrir tous les cas futurs. :)
À partir de 2018, vous pouvez utiliser la méthode ci-dessous -
public static String getDeviceDensityString(Context context) {
switch (context.getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
return "ldpi";
case DisplayMetrics.DENSITY_MEDIUM:
return "mdpi";
case DisplayMetrics.DENSITY_TV:
case DisplayMetrics.DENSITY_HIGH:
return "hdpi";
case DisplayMetrics.DENSITY_260:
case DisplayMetrics.DENSITY_280:
case DisplayMetrics.DENSITY_300:
case DisplayMetrics.DENSITY_XHIGH:
return "xhdpi";
case DisplayMetrics.DENSITY_340:
case DisplayMetrics.DENSITY_360:
case DisplayMetrics.DENSITY_400:
case DisplayMetrics.DENSITY_420:
case DisplayMetrics.DENSITY_440:
case DisplayMetrics.DENSITY_XXHIGH:
return "xxhdpi";
case DisplayMetrics.DENSITY_560:
case DisplayMetrics.DENSITY_XXXHIGH:
return "xxxhdpi";
}
}
Mais comme @Ted l'a souligné, consultez toujours la documentation officielle avant d'utiliser
À partir des réponses ci-dessus, je les ai combinées et créé la fonction ci-dessous:
public static String getDeviceDensity(Context context){
String deviceDensity = "";
switch (context.getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
deviceDensity = 0.75 + " ldpi";
break;
case DisplayMetrics.DENSITY_MEDIUM:
deviceDensity = 1.0 + " mdpi";
break;
case DisplayMetrics.DENSITY_HIGH:
deviceDensity = 1.5 + " hdpi";
break;
case DisplayMetrics.DENSITY_XHIGH:
deviceDensity = 2.0 + " xhdpi";
break;
case DisplayMetrics.DENSITY_XXHIGH:
deviceDensity = 3.0 + " xxhdpi";
break;
case DisplayMetrics.DENSITY_XXXHIGH:
deviceDensity = 4.0 + " xxxhdpi";
break;
default:
deviceDensity = "Not found";
}
return deviceDensity;
}
Maintenant, sur quel appareil vous souhaitez obtenir les informations de densité et dans quel dossier elles seront utilisées, ajoutez simplement la méthode ci-dessus dans cette activité et ajoutez la ligne ci-dessous dans onCreate
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
Log.d("Screen Density: ", Helper.getDeviceDensity(this));
}
Pour que React Native vérifie la taille actuelle de l'appareil
import { PixelRatio } from 'react-native';
switch(PixelRatio.get()) {
case 1:
return "mdpi";
case 1.5:
return "hdpi";
case 2:
return "xhdpi";
case 3:
return "xxhdpi";
case 3.5:
return "xxxhdpi";
}
PixelRatio.get()
renverra une plage de valeurs en fonction de la taille d'affichage définie dans les paramètres Android et du dpi. Ces valeurs ne coïncideront pas avec les valeurs exactes que vous avez indiquées.
Sur certains appareils (le mien est le Galaxy Tab3), la densité et la densitéDpi renvoient des valeurs étranges comme 1,33 (densité), 213 (densitéDpi). Ma solution est donc d'ajouter ces indicateurs:
<item type = "bool" name = "is_mdpi"> [booléen] </item>
<item type = "bool" name = "is_hdpi"> [bool] </item>
<item type = "bool" name = " is_xhdpi "> [booléen] </item>
<item type =" bool "name =" is_xxhdpi "> [booléen] </item>
à 4 fichiers values.xml, placez-les dans les dossiers res / values- [xxx] / correspondants.