我已阅读http://developer.android.com/guide/practices/screens_support.html和http://developer.android.com/reference/android/util/DisplayMetrics.html,我在这里留下了一个空白。
DisplayMetrics.densityDpi
到String ("ldpi")
的转换?DisplayMetrics.widthPixels
和DisplayMetrics.widthPixels
到String ("large")
对于第一个,我可以很容易地编写一个switch语句。但第二个更复杂。有人知道任何细节吗?是否有功能呢?
我甚至搜索了源代码并没有找到任何东西。但也许我找错了。
答案 0 :(得分:4)
我想通了,这里是正确的代码(你需要在属性android.content.Context
中有效的context
个实例):
final android.view.WindowManager windowManager =
(android.view.WindowManager) this.context
.getSystemService (android.content.Context.WINDOW_SERVICE);
final android.util.DisplayMetrics metrics = new android.util.DisplayMetrics ();
final android.content.res.Resources resources = this.context.getResources ();
final android.content.res.Configuration config = resources.getConfiguration ();
windowManager.getDefaultDisplay ().getMetrics (metrics);
final int density = metrics.densityDpi;
final int size =
config.screenLayout & android.content.res.Configuration.SCREENLAYOUT_SIZE_MASK;
final String densityText;
final String sizeText;
switch (density)
{
case android.util.DisplayMetrics.DENSITY_LOW:
{
densityText = "ldpi";
break;
}
case android.util.DisplayMetrics.DENSITY_MEDIUM:
{
densityText = "mdpi";
break;
}
case android.util.DisplayMetrics.DENSITY_HIGH:
{
densityText = "hdpi";
break;
}
case android.util.DisplayMetrics.DENSITY_XHIGH:
{
densityText = "xhdpi";
break;
}
default:
{
densityText = "unknown";
break;
}
} // switch
switch (size)
{
case android.content.res.Configuration.SCREENLAYOUT_SIZE_SMALL:
{
sizeText = "small";
break;
}
case android.content.res.Configuration.SCREENLAYOUT_SIZE_NORMAL:
{
sizeText = "normal";
break;
}
case android.content.res.Configuration.SCREENLAYOUT_SIZE_LARGE:
{
sizeText = "large";
break;
}
case android.content.res.Configuration.SCREENLAYOUT_SIZE_XLARGE:
{
sizeText = "xlarge";
break;
}
default:
{
sizeText = "unknown";
break;
}
} // switch
答案 1 :(得分:1)
如果我理解正确,你想获得当前的屏幕密度,并返回一个字符串(即“mdpi”),并且大小相同。
您是否查看了R.attr
常量screenSize
和screenDensity
? android docs列出了那里的硬值,但我几乎肯定你必须为这两个函数添加一个开关。只要你拥有这些值,它就不应该太糟糕。
<强>更新强> 这是一个想法...检查方向,必要时交换,并根据R.attr.screenSize doc中的值运行if / else块。无需以这种方式检索资源。但是,您可能希望在某处检查API级别,因为早期版本不支持xlarge。
String screenSize(int width, int height) {
if(width > height) {
int tmp = width;
width = height;
height = tmp;
}
if(width >= 600 && height >= 800)
return "xlarge";
else if(width >= 400 && height >= 530)
return "large";
else if(width >= 320 && height >= 480)
return "normal";
return "small";
}
我可能是错的,但这对我来说似乎是合理的。