android如何计算res目录

时间:2011-06-02 10:02:22

标签: android

我已阅读http://developer.android.com/guide/practices/screens_support.htmlhttp://developer.android.com/reference/android/util/DisplayMetrics.html,我在这里留下了一个空白。

  1. 如何完成从DisplayMetrics.densityDpiString ("ldpi")的转换?
  2. 更重要的是从DisplayMetrics.widthPixelsDisplayMetrics.widthPixelsString ("large")
  3. 对于第一个,我可以很容易地编写一个switch语句。但第二个更复杂。有人知道任何细节吗?是否有功能呢?

    我甚至搜索了源代码并没有找到任何东西。但也许我找错了。

2 个答案:

答案 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常量screenSizescreenDensity? 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"; 
}

我可能是错的,但这对我来说似乎是合理的。