How to get real screen height and width?

前端 未结 3 764
攒了一身酷
攒了一身酷 2020-12-04 15:51
DisplayMetrics metrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = met         


        
相关标签:
3条回答
  • 2020-12-04 16:09

    You can find real device dimensions with either using Display or DisplayMetrics

    Using Display:

    private void findRealSize(Activity activity)
    {
        Point size = new Point();
        Display display = activity.getWindowManager().getDefaultDisplay();
    
        if (Build.VERSION.SDK_INT >= 17)
            display.getRealSize(size);
        else
            display.getSize(size);
    
        int realWidth = size.x;
        int realHeight = size.y;
    
        Log.i("LOG_TAG", "realWidth: " + realWidth + " realHeight: " + realHeight);
    }
    

    Using DisplayMetrics:

    private void findRealSize(Activity activity)
    {
        DisplayMetrics displayMetrics = new DisplayMetrics();
    
        if (Build.VERSION.SDK_INT >= 17)
        {
            activity.getWindowManager().getDefaultDisplay().getRealMetrics(displayMetrics);
        }
        else
        {
            activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        }
    
        int realWidth = displayMetrics.widthPixels;
        int realHeight = displayMetrics.heightPixels;
    
        Log.i("LOG_TAG", "realWidth: " + realWidth + " realHeight: " + realHeight);
    }
    
    0 讨论(0)
  • 2020-12-04 16:16

    I think this will work. The trick is you must use:

    display.getRealSize(size);
    

    not

    display.getSize(size);
    

    To deal with your API 8 coding issue do something like this:

    try { 
        display.getRealSize(size);
        height = size.y; 
    } catch (NoSuchMethodError e) {
        height = display.getHeight();
    }
    

    Only more recent API devices will have onscreen navigation buttons and thus need the new method, older devices will throw an exception but will not have onscreen navigation thus the older method is fine.

    In case it needs to be said: Just because you have a minimumAPI level of 8 for your project doesn't mean you have to compile it at that level. I also use level 8 for minimum but my project mostly are compiled at level 13 (3.2) giving them access to a lot of new methods.

    0 讨论(0)
  • 2020-12-04 16:27

    I've written a method that will get as close as possible for API 10 through 17+. It should give the real width and height for API 14+, and it does as well as it can for everything else.

        Display display = context.getWindowManager().getDefaultDisplay();
        int realWidth;
        int realHeight;
    
        if (Build.VERSION.SDK_INT >= 17){
            //new pleasant way to get real metrics
            DisplayMetrics realMetrics = new DisplayMetrics();
            display.getRealMetrics(realMetrics);
            realWidth = realMetrics.widthPixels;
            realHeight = realMetrics.heightPixels;
    
        } else if (Build.VERSION.SDK_INT >= 14) {
            //reflection for this weird in-between time
            try {
                Method mGetRawH = Display.class.getMethod("getRawHeight");
                Method mGetRawW = Display.class.getMethod("getRawWidth");
                realWidth = (Integer) mGetRawW.invoke(display);
                realHeight = (Integer) mGetRawH.invoke(display);
            } catch (Exception e) {
                //this may not be 100% accurate, but it's all we've got
                realWidth = display.getWidth();
                realHeight = display.getHeight();
                Log.e("Display Info", "Couldn't use reflection to get the real display metrics.");
            }
    
        } else {
            //This should be close, as lower API devices should not have window navigation bars
            realWidth = display.getWidth();
            realHeight = display.getHeight();
        }
    
    0 讨论(0)
提交回复
热议问题