-
public class DensityUtils {
-
public static int dp2px(float dp , Context context){
-
float density = context.getResources().getDisplayMetrics().density;//即表中的0.75/1/1.5/2/3
-
//context.getResources().getDisplayMetrics().densityDpi //即表中的120/160/240/320/480
-
return (int)(dp * density + 0.5f);
-
}
-
public static float px2dp(int px , Context context){
-
float density = context.getResources().getDisplayMetrics().density;
-
return px/density;
-
}
-
}
(5)独立比例像素,单位为sp,Android开发时用于设置文字大小的单位
可根据字体大小首选项进行缩放,推荐使用12/14/18/22sp作为字体设置的大小,不推荐使用奇数和小数,容易造成精度的丢失问题。
介绍了上述基础概念,我们接下来从布局适配、图片适配、以及代码适配三个角度分别介绍屏幕适配的解决方案。
2. 布局适配
(1)推荐使用相对布局,禁用绝对布局。因为相对布局在屏幕的大小改变时视图之间的相对位置不会变化。
(2)使用dp和sp(尽量不用px)、wrap_content、match_parent和weight来控制布局。使用权重weight在任何设备上均会完美适配。
(3)为不同屏幕尺寸的设备设计不同的布局,通过配置限定符使得程序在运行时根据当前设备的尺寸自动加载合适的布局资源。
比如我们先写两个布局文件,分别为:
适配手机的布局(默认):res/layout/main.xml
适配尺寸>7寸平板的布局:res/layout/main_pb.xml
然后加入以下两个文件,系统会根据Android版本自动选择使用哪个布局配置文件。
[java] view plain copy
-
//适配Android 3.2之前的平板布局
-
res/values-large/layout.xml
-
<item name=“main” type=“layout”>@layout/main_pb
-
//适配Android 3.2之后的平板布局
-
res/values-sw600dp/layout.xml
-
<item name=“main” type=“layout”>@layout/main_pb
上述两个配置文件,并没有真正去定义布局,它们仅仅是将main设置成了@layout/main_pb的别名。
如果不这样做,main_pb.xml布局文件的内容需要复制成两份分别放入res/layout-large/main.xml和res/layout-sw600dp/main.xml以适配3.2以前和以后,这样明显很冗余。
3. 图片适配
(1)比如有一个这样的需求,一个按钮的背景图片必须能够随着按钮大小的改变而改变。使用普通的图片将无法实现上述功能,因为运行时会均匀地拉伸或压缩你的图片。
这时候可以使用Nine-Patch图(一种被特殊处理过的PNG图片,使用.9.png后缀名),9Patch图可以指定图片的拉伸区域和非拉伸区域,在需要拉伸图片时,系统就会自动地拉伸你想要拉伸的部分。需要注意的是,.9图不需要多个分辨率的图片,放在drawable文件夹即可。
红色框区域:表示纵向拉伸的区域,也就是说,当图片需要纵向拉伸的时候它会只指定拉伸红色区域。
绿色框区域:表示横向拉伸的区域,也就是说,当图片需要横向拉伸的时候它会只指定拉伸绿色区域。
(2)图片不需要在下图hdpi、mdpi等目录下都放入相对应的分辨率的图片,这样会使APK变大,一般只做1280*720一套图,放在hdpi或xhdpi下,若出问题再针对屏幕进行问题图片替换即可。另外对于如何减小APK大小,可以参考Android开发——减小APK大小。
3. 代码适配
(1)比如有一个需求,需要实现一个空间宽度,是屏幕的1/3。这时候就可以用代码实现:
[java] view plain copy
-
/**
-
* 代码适配例子
-
* Created by SEU_Calvin on 2016/09/28
-
*/
-
WindowManager wm = getWindowManager();
-
int width = wm.getDefaultDisplay().getWidth();
-
LinearLayout.LayoutParams params = (LayoutParams)tv.getLayoutParams();
-
params.width = width/3;
-
tv.setLayoutParams(params);
需要注意的是,一般代码适配需要写一个工具类(上文中已经贴出了)来实现dp2px ,因为代码里的参数一般都需要px值,需要通过不同设备的屏幕密度来实现dp2px。
(2)代码适配的另一个使用场景是根据加载布局的不同,来决定走不同的流程,如下:
[java] view plain copy
-
setContentView(R.layout.main_layout);//此处会根据屏幕大小加载不同的布局
-
Button btn = (Button)findViewById(R.id.btn);//其中一个布局没有该按钮
-
if(btn == null){
-
//业务逻辑1…
-
}else{
-
//业务逻辑2…
-
}
至此关于屏幕适配的问题整理完毕
学习分享
在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了
很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘
如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。
2021最新上万页的大厂面试真题
七大模块学习资料:如NDK模块开发、Android框架体系架构…
只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。
这份体系学习笔记,适应人群:
第一,学习知识比较碎片化,没有合理的学习路线与进阶方向。
第二,开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。
leJK-1718866583060)]
只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。
这份体系学习笔记,适应人群:
第一,学习知识比较碎片化,没有合理的学习路线与进阶方向。
第二,开发几年,不知道如何进阶更进一步,比较迷茫。
第三,到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。