准确获取Android设备的分辨率

扣扣技术交流群:460189483

今天使用getMetrics()这种方法获取小米平安4的设备分辨率,平板设置里面明明写的分辨率1920x1200,我获取的分辨率是1920x1104,获取的分辨率与设备不一样,查找问题,发现应该使用getRealMetrics()。原因分析如下:

getMetrics()这种方法广为流传,百度一下但是这种方法有一个弊端,就是在android 4.4上测得的高度不准确(之后的Android版本估计也会,我没有实测,你们可以试试)。具体原因为getMetrics()获取到的屏幕信息在android4.4后会忽略底部的虚拟按键的高度。所以此时该用getRealMetrics()。getRealMetrics()和getMetrics()获取到的屏幕信息差别只在于widthPixels或heightPixels的值是否去除虚拟键所占用的像素,和是否全屏和沉浸模式无关。具体到我的问题就是用getMetrics()获取到的是1920x1104,而用getRealMetrics()获取到的就是正确的1920x1200。2个方法仅仅相差一个Real,然而结果却完全不同,而网络上大部分都是前者,仅仅是今天我才发现有一篇文章提到了getRealMetrics(),并解释了二者的区别。这说明大多数人认为的不一定是对的,也说明网络上很多都是互相抄的,不可尽信。

下面是我的测试分辨率的代码:

public class MainActivity extends Activity {  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
  
        DisplayMetrics metric = new DisplayMetrics();  
        getWindowManager().getDefaultDisplay().getRealMetrics(metric);  
        int width = metric.widthPixels; // 宽度(PX)  
        int height = metric.heightPixels; // 高度(PX)  
        float density = metric.density; // 密度(0.75 / 1.0 / 1.5)  
        int densityDpi = metric.densityDpi;  
  
        Log.d("fbl", width + " , " + height + " , " + densityDpi);  
    } 
    private void test(){
        DisplayMetrics metric = new DisplayMetrics();  
        //API 17之后使用,获取的像素宽高包含虚拟键所占空间,在API 17之前通过反射获取  
        context.getWindowManager().getDefaultDisplay().getRealMetrics(metric);  
        //获取的像素宽高不包含虚拟键所占空间  
        //context.getWindowManager().getDefaultDisplay().getMetrics(metric);  
        int width = metric.widthPixels;  // 宽度(像素)  
        int height = metric.heightPixels;  // 高度(像素)  
        float density = metric.density;  // dp缩放因子  
        int densityDpi = metric.densityDpi;  // 广义密度  
        float xdpi = metric.xdpi;//x轴方向的真实密度  
        float ydpi = metric.ydpi;//y轴方向的真实密度 
    } 
}  

我写出这篇文章是不想有人重蹈我的覆辙。下面附上我看到的那篇文章地址,谨以此表示我对作者的感谢。

http://xiaoyaozjl.iteye.com/blog/2178415

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值