Android 屏幕适配

Android屏幕适配分类:

  1. 图片适配
  2. 布局适配
  3. 尺寸适配
  4. 权重适配
  5. 代码适配

 

 1、图片适配(常用)

注意:Andriod图片适配只与屏幕大小和屏幕密度相关,与屏幕分辨率无关。

Android中对屏幕的密度适配处理分类:

屏幕密度 对应的标签 对应的像素 在drawable目录下 在mipmap目录下 分辨率
120dip ldpi 1dp= 0.75px drawable-ldpi mipmap-ldpi 320*240
120dpi~160dpi mdpi 1dp= 1px drawable或者drawable-mdpi mipmap或者mipmap-mdpi 480*320
160dpi~240dpi hdpi 1dp= 1.5px drawable-hdpi mipmap-hdpi 800*480
240dpi~320dpi xhdpi 1dp= 2px drawable-xhdpi mipmap-xhdpi 1280*720
320dpi~480dpi xxhdpi 1dp= 3px drawable-xxhdpi mipmap-xxhdpi 1920*1080
480dpi~640dpi xxxhdpi 1dp= 4px drawable-xxxhdpi mipmap-xxxhdpi 2560*1440

      比如三星I9500手机的屏幕密度为 441ppi,安卓系统会进行判断,441 在 320dip 与 480dip 之间,那么系统会使用 480dip为 基数来进行尺寸的计算,那么安卓系统就会优先去加载xxhdpi文件下对应的图片资源,如果没有就会去其它的目录中找名称相同的图片资源,如果没有则编译报错。

      常规做法:让美工做一套1920*1080分辨率的切图,然后将这些图片放置mipmap-xxhdpi文件夹下,如果屏幕出现问题,在针对该屏幕对相关的问题图片进行替换。

      示例代码:https://gitee.com/guobao0730/ScreenAdaptation_GraphicsAdapter

 

2、布局适配(不常用)

      该布局适配可以针对指定的分辨率去编写指定的布局文件,如果想编写800*400分辨率手机要展示的布局,那么可以创建一个对应的layout-800x400文件夹,然后再其中创建一个相同文件名的布局文件即可。
      如果当前手机的分辨率不是800*400的分辨率,并且大于所创建的分辨率文件,那么也会使用当前800x400文件下的布局文件。
     如果当前手机的分辨率是1920*1080,而创建的布局分辨率为2560*1440,那么系统就会指定手机使用layout文件下的布局文件,也就是默认的布局文件
     也就是说只有当前手机的分辨率等于或者大于当前文件夹的分辨率才会使用当前指定的那个文件夹的布局文件

              比如测试手机华为BLN-AL20的分辨率是1920*1080,而所创建的布局为layout-2560x1440,那么最终系统只会使用默认的布局文件来显示,也就是layout文件下的布局文件

        示例代码:https://gitee.com/guobao0730/ScreenAdaptation_LayoutAdaptation

 

3、尺寸适配(常用)

PX换算为dp的公式:dp=px/屏幕密度
比如华为BLN-AL手机的分辨率为1920*1080, 其换算公式为1dp = 3px , 那么当前要设置的dp = px/3
一般美工给我们的都是px值,而我们需要根据当前切图的分辨率来将当前的px转换为dp ,
比如这套切图是基于1920*1080来做的,而美工指定的像素值为72px,那么我们实际的值为:24dp(1920*1080分辨率的密度为3,72/3=24)

dp适配
dp适配原理与px适配一样,区别就在于px适配是根据屏幕分辨率,即拿px值等比例缩放,而dp适配是拿dp值来等比缩放而已。
px适配会根据设备的分辨率去找对应的dimens.xml文件(如下图,运行在分辨率为1920x1080的手机上,系统会自动找到对应的values-1920x1080文件),那dp适配呢?
dp适配也是一样的,只不过dp适配是根据“最小宽度(Smallest-width)限定符”来找的,需要注意的是“最小宽度”是不区分方向的,即无论是宽度还是高度,哪一边小就认为哪一边是“最小宽度”。所以如果当前设备最小宽度(以 dp 为单位)为400dp,那么系统会自动找到对应的values-sw400dp文件夹下的dimens.xml文件
使用步骤
1、以某一widthDP为基准,生成所有设备对应的dimens.xml文件,在Android Studio中安装ScreenMatch插件,
2、在项目的默认values文件夹中需要一份dimens.xml文件,我在github源码已经提供了一份,直接复制过来即可。 github地址:https://github.com/wildma/ScreenAdaptation
3、执行生成,插件安装好后,在项目的任意目录或文件上右键,选择ScreenMatch选项
4、然后选择在哪个module下执行适配。即基于哪个module下的res/values/dimens.xml文件作为基准dimens.xml文件,生成的其他尺寸dimens.xml文件放在哪个module下。
5、点击确定就会执行生成命令
6、使用,比如  android:layout_width="@dimen/dp_180"

详见:https://www.jianshu.com/p/1302ad5a4b04


当然,优先情况还是先使用warp_content、math_parent、layout_weight,如果实在需要使用到数值在用该方法

 

 

      示例代码:https://gitee.com/guobao0730/ScreenAdaptation_SizeAdaptation

 

 

4、权重适配   (常用)

 权重适配指的就是 android:layout_weight=""  和 android:weightSum="2" 属性
 android:layout_weight="" 是给线性布局的子条目使用的,通过它可以将布局均匀进行分配,不管是什么分辨率的手机,竖屏还是横屏
 android:weightSum="2" 主要是线性布局的属性,使用它可以指定子控件的权重总个数,如果想实现一个子条目只占用其父容器的一半,么就可以使用该属性

 

    示例代码:https://gitee.com/guobao0730/ScreenAdaptation_WeightAdaptation

 

5、代码适配(常用)

所谓的代码适配就是通过编写代码的方式动态给控件设置宽高,不管当前手机分辨率是多少,横屏还是竖屏都可以动态设值

    


        TextView mainActivity_tv = findViewById(R.id.mainActivity_tv);

        /*动态的给TextView的宽度设置为屏幕的1/3*/
        //动态获取屏幕的宽度
        WindowManager windowManager = getWindowManager();
        int width = windowManager.getDefaultDisplay().getWidth();

        //获取TextView的父容器并给当前的TextView设置宽度
        LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) mainActivity_tv.getLayoutParams();
        layoutParams.width = width/3;

        mainActivity_tv.setLayoutParams(layoutParams);

示例代码:https://gitee.com/guobao0730/ScreenAdaptation_CodeAdaptation

 

 

 

 

发布了284 篇原创文章 · 获赞 132 · 访问量 23万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 点我我会动 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览