我们在android 开发中总会遇到屏幕适配这种问题,对于一个初学者来说 这还在真是一个比价头疼的问题,
此前看到网上好多都是建议在res下新建多套布局。
1、选用主要分辨率来适配:480X800,720X1280,1080X1920
2、各个分辨率单独适配,res,dimens里设置各个对应的px,再统一调用,有系统筛选。
3、用weight和match等,少用dp在位置布局里
接下来先给大家简单的介绍下dp与px的适配原理
px与dp适配的原理
-
px适配原理:
根据设备屏幕的分辨率各自写一套dimens.xml文件,然后根据一个基准分辨率(例如720x1080),将宽度分成720份,取值为1px——720px,将高度分成1080份,取值为1px——1080px。生成各自dimens.xml文件对应的值。 -
dp适配原理:
dp适配原理与px适配一样,区别就在于px适配是根据屏幕分辨率,即拿px值等比例缩放,而dp适配是拿dp值来等比缩放而已。
问题:既然原理都一样,都需要多套dimens.xml文件,为什么说dp适配就比px适配好呢?
1.因为px适配是根据屏幕分辨率的,Android设备分辨率一大堆,而且还要考虑虚拟键盘。而dp适配无论手机屏幕的像素多少,密度比值多少,80%的手机的最小宽度dp值(widthPixels / density)都为360dp,这样就大大减少了dimens.xml文件。
2.px适配会根据设备的分辨率去找对应的dimens.xml文件(如下图,运行在分辨率为1920x1080的手机上,系统会自动找到对应的values-1920x1080文件),那dp适配呢?
3.dp适配也是一样的,只不过dp适配是根据“最小宽度(Smallest-width)限定符”来找的,需要注意的是“最小宽度”是不区分方向的,即无论是宽度还是高度,哪一边小就认为哪一边是“最小宽度”。所以如果当前设备最小宽度(以 dp 为单位)为400dp,那么系统会自动找到对应的values-sw400dp文件夹下的dimens.xml。
然而这些方法并不能做到完全适配 部分还是会出现问题
今天正好有时间 就跟大家分享一起分享一下个人觉得比较好用又简单的屏幕适配框架吧 只需要一行代码即可。
AndroidScreenAdaptation
这个库是升级版,不仅可以直接使用px,更可以直接使用dp进行开发适配。接下来直接看如何使用
快速开始
-
添加依赖
implementation 'me.yatoooon:screenadaptation:1.0.3'
-
初始化工具类
(1.)创建自己的application继承Application
在onCreate里面初始化 :
ScreenAdapterTools.init(this);
(2.)在AndroidManifest.xml文件中声明使用你自己创建的application并且添加meta-data数据,例子上标明了这些数据的代表的意义
<!-- 适配框架参数 开始 -->
<meta-data android:name="designwidth"
android:value="750" />
<meta-data android:name="designdpi"
android:value="325" />
<meta-data android:name="fontsize"
android:value="1.0" />
<meta-data android:name="unit"
android:value="px" /> (这里使用px(dp)布局中就使用啥)
<!-- 适配框架参数 结束 -->
-
宽 240 320 480 720 1080 1440
-
DPI等级 LDPI MDPI HDPI XHDPI XXHDPI XXXHDPI
-
DPI数值 120 160 240 320 480 640
- 开始使用
(1.)不管是在Activity还是在Fragment我们肯定都会有一个封装好的基类 ,这个时候只需要在基类的
onCreate 或者 onCreateView加载完布局后直接添加即可。如果没有封装那么需要在每一个加载view的地方都需要加上以下代码哦
public class TestFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.test, container, false);
ScreenAdapterTools.getInstance().loadView((ViewGroup) view);
return view;
}
}
对,你没有看错,此框架只需要一行代码即可。这个框架本人使用后截止目前还没有出现过什么问题 ,大家可以去试试。