Android屏幕适配3-动态获取屏幕宽高及动态设置控件宽高

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" />

文章只是作为个人记录学习使用,如有不妥之处请指正,谢谢。

参考文章

https://www.cnblogs.com/kebibuluan/p/6923019.html

猜你喜欢

转载自blog.csdn.net/modurookie/article/details/80423592
今日推荐