以编程方式获取屏幕大小?

时间:2011-09-02 13:54:46

标签: android

我想确定当前设备的代码中是否有小,中,大或xlarge屏幕。我在SDK文档中找不到任何可以帮助我获取该信息的内容。我所看到的所有方法/类只提供绝对值(即屏幕大小,以像素为单位,屏幕密度等)。

有没有办法告诉我在代码中运行的是什么类型的屏幕?

8 个答案:

答案 0 :(得分:56)

我最终使用放置在不同存储桶文件夹中的bool资源。我只需要区分普通(小/中)和大(大/大)屏幕,所以我这样做了:

<强>值/ bools.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="screen_large">false</bool>
</resources>

<强>值-大/ bools.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="screen_large">true</bool>
</resources>

然后,我只需拨打getBoolean(R.bool.screen_large)来判断屏幕是否大。通过这种方式,平台可以100%决定设备的屏幕。

答案 1 :(得分:7)

密度和屏幕类型之间存在差异。 enter image description here

由于您可以获得像素和密度,因此您始终可以使用静态Helper类来确定它。

您可以使用

将像素转换为dp
public static float dpFromPixels(int pixels) {
        float dp = (float) ((pixels) / Density.scale);
        return dp;
    }

我认为您可能想要从像素中添加或减去.5f,因为从dp获取像素来自该代码。

public static int pixelsFromDp(float dps) {
        int pixels = (int) (dps * Density.scale + 0.5f);
        return pixels;
    }

来自documentation

  

xlarge屏幕至少为960dp x 720dp

     

大屏幕至少为640dp×480dp

     

正常屏幕至少为470dp×320dp

     

小屏幕至少为426dp x 320dp

答案 2 :(得分:6)

public static boolean isLargeScreen(Context context) {
  int screenSize = context.getResources().getConfiguration().screenLayout
    & Configuration.SCREENLAYOUT_SIZE_MASK;
  return screenSize >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}

答案 3 :(得分:5)

我同意Felix的回答非常优雅。但我认为我在这篇文章中找到的方式可能更容易How to determine device screen size category (small, normal, large, xlarge) using code?

答案 4 :(得分:1)

使用DisplayMetrics类......

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

// DENSITY_LOW, DENSITY_MEDIUM, DENSITY_HIGH, or DENSITY_XHIGH
int density = dm.densityDpi;

小= DisplayMetrics.DENSITY_LOW

中= DisplayMetrics.DENSITY_MEDIUM

大= DisplayMetrics.DENSITY_HIGH

XLarge = DisplayMetrics.DENSITY_XHIGH

答案 5 :(得分:1)

我在我的代码中使用这种方法来区分“大屏幕”(我认为是平板电脑)和“小屏幕”(我认为是手机)。

public static boolean isLargeScreen(Configuration toCheckConfig) {  
    int screenSizeBucket = toCheckConfig.screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
    if (screenSizeBucket >= Configuration.SCREENLAYOUT_SIZE_LARGE) {
        return true;
    }
    else return false;
}       

Configuration对象还包含SCREENLAYOUT_SIZE_SMALLSCREENLAYOUT_SIZE_XLARGE等(如果您特别需要测试大小存储区)。

这也适用于这两个util函数:

public static int getPixelsFromDp(Context context, int dpValue) {
    return (int) (context.getResources().getDisplayMetrics().density * dpValue);
}

public static int getDpfromPixels(Context context, int pixels) {
    return (int) (pixels / context.getResources().getDisplayMetrics().density);
}

其中context.getResources().getDisplayMetrics().density等于1.01.52.0mdpihdpixhdpi

答案 6 :(得分:1)

作为Felix答案的补充,您可以使用以下代码获取ScreenSize,而无需为值创建任何文件夹-XXX:

int screenSize = getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK;
        Log.d(TAG, "screenSize = "+screenSize);

        switch(screenSize) {
            case Configuration.SCREENLAYOUT_SIZE_LARGE:
                Log.d(TAG, "Large Screen");
                break;
            case Configuration.SCREENLAYOUT_SIZE_NORMAL:
                Log.d(TAG, "Normal Screen");
                break;
            case Configuration.SCREENLAYOUT_SIZE_SMALL:
                Log.d(TAG, "Small Screen");
                break;
            case Configuration.SCREENLAYOUT_SIZE_XLARGE : 
                Log.d(TAG, "XLarge Screen");
                break;
            default:
                Log.d(TAG,  "Screen size is neither large, normal or small or xlarge");
        }

答案 7 :(得分:-1)

DisplayMetrics已经得到了你所需要的一切。得到它

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