使用乐视max2手机(屏幕5.7英寸,分辨率2560*1440)运行app,对比米6会发现能够显示的内容更多,如下图所示,为什么会这样呢?

我们使用的长度单位是dp,显示在屏幕上要转化成px的,转化公式为:
public static int dip2px(Context context,float dpValue){
final float scale = context.getResources ().getDisplayMetrics ().density;
return (int) (dpValue * scale + 0.5f);
}
public static int px2dip(Context context,float pxValue){
final float scale = context.getResources ().getDisplayMetrics ().density;
return (int) (pxValue / scale + 0.5f);
}
由转换方法可知,1dp转为px的多少,取决于density,而density = 屏幕密度/160。
通过计算,乐视max2手机的实际屏幕密度是515,实际density = 515/160 = 3.2,小米6手机的实际屏幕密度是428,实际density = 428/160 = 2.7;然而,通过测试乐视max2手机的系统density是3.5;小米6手机的系统density是3;这是因为android对于界面的缩放使用的是系统density,而不是实际density,系统的density是手机厂商设置的,通过使用系统density算出乐视max2手机屏幕的宽是411dp,高是731dp,小米6手机屏幕的宽是360dp,高是640dp,乐视max2的屏幕比小米6更宽51dp,更高91dp,这也就是为什么乐视max2比小米6能够显示更多内容的原因。
如何确定手机是属于xxhdpi还是xhdpi?在网上看到过屏幕分辨率是1920*1080的手机属于xhdpi,印象里这个分辨率的手机大部分是属于xxhdpi的。出现这种情况是因为判定手机属于xxhdpi还是xhdpi也是通过系统密度而非实际密度。
系统密度有几个固定的值,分别为:120(ldpi)、160(mhdpi)、240(hdpi)、320(xhdpi)、480(xxhdpi)、560(xxhdpi)、640(xxxhdpi)。
一般适配屏幕,只需适配屏幕的宽;至于高,做成滑动即可。宽度的适配,若不用占满屏幕,宽度显得长一点短一点一般相差不大,若要适配平板,可建立values-w820dp文件夹和对应的dimens文件;宽度若需要占满屏幕,需使用matchParent、linearlayout-weight,或者动态适配;
有一些线上的app使用gridview有些不好看,我自己模拟写了一个demo,gridview的宽设置为80dp,间隙为10dp,类似如下:

item宽是80dp,间隙10dp,我所设置的总宽是360dp,乐视max2的宽是411dp,多出的51dp平均分给了间隙,导致乐视max2显示间隙过大,很可能不符合设计师的要求的,这时我们需对gridview的item宽度做动态适配,我们动态给item设置宽度为(屏幕宽度/4 - 10dp),在gridview的adapter里对item调用如下代码
//动态适配宽度
public void dynamicSetWidth(View view) {
//计算屏幕宽度的dp值
DisplayMetrics dm = getResources().getDisplayMetrics();
int screenWidthPixels = dm.widthPixels;
int screenWidthDp = px2dp(this,screenWidthPixels);
int widthDp = screenWidthDp/4 - 10;
int targetWidth = dp2px(this,widthDp);
ViewGroup.LayoutParams layoutParams = view.getLayoutParams();
//设置目标view的宽度为1/4屏幕宽度
layoutParams.width = targetWidth;
view.setLayoutParams(layoutParams);
}
如此一来,app在手机里显示如下,看着好多了。

网友评论