1、问题
在屏幕适配中,要求应用在不同的屏幕上显示一样的效果时,我们的布局可以采用百分比来定位,也就是 layout_weight
,但对于一些层层嵌套或更加复杂的情况下,使用百分比的效果并不是很好,页无法解决一些问题,比如文字大小。
2、解决思路
我们可以根据屏幕大小重新对布局以及布局内的对象大小进行调整。原理类似于我们用播放器看视频的时候,无论怎么调整窗口大小,播放器都可以自动调整视频大小适合窗口大小。因为视频有一个原始分辨率,播放器会根据窗口实际大小对视频进行缩放。
我们写布局的时候一般是根据某个基准分辨率来(比如 UI 给的原型图),自动缩放布局的作用就是将这个基准布局乘以一个缩放比例,达到适配所有分辨率的目的。
计算缩放比例公式:实际大小/设计大小=缩放比例
只需要给定一个设计大小,就可以计算缩放比例,然后将布局内部所有元素的尺寸都乘以这个缩放比例,就可以适配实际屏幕了。
3、具体步骤
3.1、获取手机屏幕宽高
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
// 屏幕宽度(像素)
int width = metric.widthPixels;
// 屏幕高度(像素)
int height = metric.heightPixels;
// 屏幕密度(0.75 / 1.0 / 1.5)
float density = metric.density;
// 屏幕密度DPI(120 / 160 / 240)
int densityDpi = metric.densityDpi;
3.2、根据屏幕宽度为控件设置动态设置宽高
使用 getLayoutParams()
和 setLayoutParams()
方法
LinearLayout ll = (LinearLayout) findViewById(resId);
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) ll.getLayoutParams();
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
float scale = dm.density; // 像素密度
lp.height = (int) (height * scale + 0.5f);
lp.width = (int) (width * scale + 0.5f);
ll.setLayoutParams(lp);
但是,需要注意的是,在一个低密度的小屏手机上,仅靠上面的代码是不能获取正确的尺寸的。需要在工程的AndroidManifest.xml 文件中,加入 supports-screens
节点,具体的内容如下:
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:resizeable="true"
android:anyDensity="true" />
文章只是作为个人记录学习使用,如有不妥之处请指正,谢谢。
参考文章