Android使用最小宽度限定符时最小宽度的计算

Android开发中最头疼的问题之一就是兼容不同尺寸和分辨率的设备。这里推荐一篇总结的比较完整的《Android开发:最全面、最易懂的Android屏幕适配解决方案》。这篇文章对屏幕兼容的许多问题都做了详述,这里只补充一点,就是关于在使用最小宽度限定符时这个最小宽度的该如何计算。

最小宽度限定符可以使用一个与屏幕像素密度无关为单位(dp)的数值区分出的不同设备,以应用不同的资源。如下图中values-sw600dp的sw表示最小宽度,那么600dp是如何确定的呢?

举个例子:一般情况下我们可以容易知道设备的分辨率和尺寸的参数。比如现在有平板A(分辨率1280*720px,尺寸是8inch),手机B(分辨率1920*1080px,尺寸是5.7inch),手机C(分辨率1280*720px,尺寸是5inch)。通过下面的屏幕像素密度的计算公式,我们可以分别计算出他们的屏幕像素密度:

 

平板A约为184dpi,手机B约为386dpi,手机C约为293dpi。

 

接下里需要注意的是,最小宽度是不考虑横屏或竖屏的,也就是说最小宽度是设备屏幕四条边里最短的那两条边。如果需要考虑横竖屏那么可以加入屏幕方向限定符,这不在我们讨论之列。那么接下来我们取最短边的像素数,并通过下面的公式计算最小宽度(dp):

平板A约为626dp,手机B约为448dp,手机C约为393dp。

 

如上,使用600dp就可以区分出平板和手机两类设备,如果需要详细区分手机B和C可以再考虑设置sw400dp作为区分。

 

 

理论上以上方法是成立的,但是一些定制的设备是允许修改屏幕密度和最小宽度的,比如华为手机的开发者模式,以及3288的开发板,所以,真正的最小宽度还是要靠计算获得。以下连接是计算方法

http://landcareweb.com/questions/37447/ru-he-zhi-dao-androidshe-bei-de-zui-xiao-kuan-du-sw

其实主要用到了以下类:

1 DisplayMetrics dm = mActivity.getApplicationContext()
2                     .getResources().getDisplayMetrics();
3             float screenWidth = dm.widthPixels / dm.xdpi;
4             float screenHeight = dm.heightPixels / dm.ydpi;

 或者更直接的方法

Configuration config = getResources().getConfiguration();
config.smallestScreenWidthDp

最后一行返回dp中的SW值!

posted @ 2019-03-07 09:25  dongweiq  阅读(5483)  评论(0编辑  收藏  举报