Android开发 获取屏幕宽高及尺寸的方法

 // 通过WindowManager获取
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        System.out.println("width-display :" + dm.widthPixels);
        System.out.println("heigth-display :" + dm.heightPixels);

// 通过Resources获取
        DisplayMetrics dm2 = getResources().getDisplayMetrics();
        System.out.println("width-display :" + dm2.widthPixels);
        System.out.println("heigth-display :" + dm2.heightPixels);

// 获取屏幕的默认分辨率
        Display display = getWindowManager().getDefaultDisplay();
        System.out.println("width-display :" + display.getWidth());
        System.out.println("heigth-display :" + display.getHeight());

以上为获取屏幕宽高分辨率的三种方法

安卓6.0的NEXUS 6手机使用以上方法取得准确的宽度分辨率,但是高度分辨率并不准确(与状态栏和主题有关,某些情况下准确),如何获取完全准确的宽、高分辨率请参考下文;在安卓4.2系统的某手机中,使用方法一得到了正确的屏幕尺寸值,而使用方法二和三得到的值全部为零。原因不祥。其中方法三中的display.getWidth()和display.getHeight()已被弃用。


DisplayMetrics dm = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(dm);

//display = getWindowManager().getDefaultDisplay();

//display.getMetrics(dm)(把屏幕尺寸信息赋值给DisplayMetrics dm);
width = dm.widthPixels;
height = dm.heightPixels;
xdpi = dm.xdpi;
ydpi = dm.ydpi;
density = dm.densityDpi;
fdensity = dm.density;



查询log,得到各值如下:
D/Lichking(22643): -----------widthpixels---540
D/Lichking(22643): -----------heightpixels---960
D/Lichking(22643): -----------xdpi---244.92857
D/Lichking(22643): -----------ydpi---246.30302
D/Lichking(22643): -----------density---240

D/Lichking(22643): -----------fdensity---1.5


另提一点,我们通常所指的屏幕上的int尺寸是像素单位,如需在java代码中使用dp设定宽高请参考以下两个方法。
//pixel = dip*density;  
private int convertDpToPixel(int dp) {  
    DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics();  
    return (int)(dp*displayMetrics.density);  
}  
  
private int convertPixelToDp(int pixel) {  
    DisplayMetrics displayMetrics = mContext.getResources().getDisplayMetrics();  
    return (int)(pixel/displayMetrics.density);  
} 


由于根据以上方法获取屏幕尺寸会有部分情况因为状态栏或其他缘故获取不到正确的分辨率,所以获取准确的分辨率可用以下方式获得:

private void getDisplayInfomation() {  
    Point point = new Point();  
    getWindowManager().getDefaultDisplay().getSize(point);  
    Log.d(TAG,"the screen size is "+point.toString());  
    //获取正确尺寸 (此方法要求最低api为17,即安卓4.2,4.2之前获取请参看以下获取屏幕尺寸的方法)
    getWindowManager().getDefaultDisplay().getRealSize(point);  
    Log.d(TAG,"the screen real size is "+point.toString());  
} 



获取屏幕尺寸的方法如下:

    private static double mInch = 0;  
    /** 
     * 获取屏幕尺寸 
     * @param context 
     * @return 
     */  
    public static double getScreenInch(Activity context) {  
        if (mInch != 0.0d) {  
            return mInch;  
        }  
      
        try {  
            int realWidth = 0, realHeight = 0;  
            Display display = context.getWindowManager().getDefaultDisplay();  
            DisplayMetrics metrics = new DisplayMetrics();  
            display.getMetrics(metrics);  
            if (android.os.Build.VERSION.SDK_INT >= 17) {  
                Point size = new Point();  
                display.getRealSize(size);  
                realWidth = size.x;  
                realHeight = size.y;  
            } else if (android.os.Build.VERSION.SDK_INT < 17  
                    && android.os.Build.VERSION.SDK_INT >= 14) {  
                Method mGetRawH = Display.class.getMethod("getRawHeight");  
                Method mGetRawW = Display.class.getMethod("getRawWidth");  
                realWidth = (Integer) mGetRawW.invoke(display);  
                realHeight = (Integer) mGetRawH.invoke(display);  
            } else {  
                realWidth = metrics.widthPixels;  
                realHeight = metrics.heightPixels;  
            }  
      
            mInch =formatDouble(Math.sqrt((realWidth/metrics.xdpi) * (realWidth /metrics.xdpi) + (realHeight/metrics.ydpi) * (realHeight / metrics.ydpi)),1);  
      
      
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
      
        return mInch;  
    }  
    /** 
     * Double类型保留指定位数的小数,返回double类型(四舍五入) 
     * newScale 为指定的位数 
     */  
    private static double formatDouble(double d,int newScale) {  
        BigDecimal bd = new BigDecimal(d);  
        return bd.setScale(newScale, BigDecimal.ROUND_HALF_UP).doubleValue();  
    }  




你可能感兴趣的:(安卓开发)