1.屏幕分类和刘海屏的适配原则

1.屏幕分类和刘海屏的适配原则_哔哩哔哩_bilibili


 

百分百布局不在维护 淘汰了 

头条怎么做的 阿里怎么做的? 

将近几千种  rom6 7种,之前适配宽和高  曲面屏 分屏 异形屏 android8 大o 水滴屏 

 每家公司rom 改的面目全非  

1.耳朵区做适配,2.上面不做适配,底下做适配,取决于你的产品

工程机 pos机 app适配 车载 大屏适配

超长屏 我们只能适配一边,如果两个都适配很明显 拉伸了,以他的宽度做适配标杆,高度,借助滚动 就认为的适配了, 岗位多 招不到人为什么?跟面试官交流的时候,他想讲的你没有理解 你想讲的 表达的不够清晰,

屏幕适配的基础原则

 

 

 全面屏跟刘海之间有什么关联

 判断手机是否支持刘海屏 本质通过反射调用的 android.os 拿到系统属性,检测rom的key rom名称

通过属性,我们看你对应的值 判断你是true  false 

取高度  刘海屏的高度,又一个兼容性问题,我们的状态栏跟刘海屏高度是一样的,如果是这样的话,我们可以通过getstarbar拿到状态栏的高度就可以取,如果我们的手机拿到 这个手机 印度阿三 小米手机 很便宜,他给印度的工程机都已经改得不成样子了,反正给阿三用 给他们用 所以说发现千奇百怪 刘海 有可能在右边 有可能在左边 中间 

 摄像头在底下 你在阿里你就要做,我们为广大的阿三服务,海外华人服务,在阿里比之前的小公司还要累,因为你可能遇到千奇百怪的需求 小公司不可能遇到的 边角显示 凹口 

 

如果在手机上面勾选 应用全屏显示 当你把打勾 就出大问题 默认你的手机适配全面屏的,也就是意味你是8.0的系统,也就意味着没有刘海,所以说你在获取这个代码的时候是获取不到的getNotchHeight 理解在阿里的工作是什么样子的 小喽啰,

高度171  有值  刘海屏高度,如果全面屏打开,这个值是0 目前每个手机不一样 小米 oppo验证过了,vivo是不是不知道,公司开发当中要有这个意识 这个值是0 跟设置有关系 怎么做适配?跟什么的值有关系?

 

上面叫刘海屏,下面不知道是啥,为什么会出现这种情况?这就是没有做适配,这个问题,主要通过反射来解决,小米手机 是yes oppo yes  其他手机是不是不知道,通过反射 可以去调 公司有专门做适配的 自己做适配怎么做?就去找

这个是oppo的这个链接上找 rom的代码,他这个类 反射调一下 拿值就行了,大部分是yes的 黑色的条是什么?也就是说我这个系统啊 这个东西,需要大家理解 整个的交互,对launch的启动 ams要有深入的理解 以及window要有深入的了解 启动以后atach出这个window以后,这个东西,系统会默认去算的,如果刘海没有做适配的话,那么他默认取到这个刘海,然后把整个这个宽高往下做这个平移 所以说会出现这个问题,怎么解决,怎么把这个宽高设置到上面去,怎么把黑色的条搞掉? 这块的东西原理是wms

 首先把title去掉了把FLAG_FULLSCREEW全屏

开启沉没式布局模式

 LayoutParams  129  WindowManager 管理一个一个的LayoutParams 的参数 坐标flg

新增参数,显示刘海屏 的模式,在8.0上有这个值,这个值有三个结果LAYOUT_INDISPLAY_cUT0UTLM00EDEFAULT显示刘海屏

设置成lev 禁止,拒绝,永远不 窗口不允许和刘海屏重叁

设置成SHORT_EDGEST 拿到你的window 把这个lp设置进去,拿到

getDecorView 做沉浸式效果,4.4我们需要设置flags 高级ui进阶讲到了view 的体系,讲什么这样设置

三个参数 133 134 :这个是7年前的Navigation 他不是jectpack的Navigation 问你怎么样与远端做交互,问怎么样动态改你的按钮 问aroot路由 又完了 这个Navigation他是导航栏,只不过他是虚拟按键 需要隐藏掉, arouter开源框架 组件化  沉浸式 

解决了黑条子的问题 

135  

刘海的地方搞一个鲜花 来个imageview 一般做完全面屏 沉浸式已经ok了,这个时候跑在真机上会有问题 

 这个刘海把这个button干掉了,必须适配,这就是阿里干的事情,并不是很高大上 都是很浅显易懂的业务 怎么在简单的业务中做出不平凡的价值 你就提升了

取到这个status bar  把这个值写道button里面 是不是就解决了?

 有一个方法获取刘海的位置 比如说你的let right 拿到这两个值去控制addview就可以了,

 getDisplayCutout 就是刘海屏 

getBoundingRects 矩阵 相当于矩形   生命周期,因为在oncreate里面掉的,你的这个东西还没有附着到window上面,

当我们这个activity附着在window上面你才能够 去处理

拿到像数值,在去绘制的时候,可以偏移可以做addview 

 RectList是多个刘海屏的机制吗?不是的 这个List就相当于,我们在底层绘制的时候我们会有多个选择 一般来说这个list的值也只有0  只有1个 未来能不能有多个刘海屏也不好说,也许真有两个 google做了这样的一个扩容,给你一个集合 你不是更好吗?你理解 Rect是一个矩形就可以了

看理论知识 

 

蓝湖 px转dp  你是几倍图? 440 dpi 330dpi 不同手机宽高比不一样,这个时候就会产生图象被拉伸 放大和缩小的问题,我的ppi缩小了,意味着我的屏幕是放大的 

我这个屏幕ppi是每寸存在多少颗粒 我的颗粒减小了,但是我屏幕的尺寸,宽是一样的 颗粒数变小了,我需要更多的空间去存储我的这些颗粒,所以说ppi减小了,你这个图反而放大了,ppi减少,同样的像素,他需要更多的地方来展示他的尺寸,这就会存在,同一个控件,在不同的手机上 他的大小 他的宽高都不一样的 颗粒就是px

头条适配思路

 

 scaledDensity缩放的功能,老年人 字体需要大一点

xdpi=397.565,ydpi  x轴y轴的dpi 这就是DisptayNetrics{显示矩阵给到我们的元素,一般来说这个dp值一般来说我是不能改的,density=px/dp的 那么美工会给到你设计稿,那这个px他是不会变的,他是固定的,这个值固定,我们可以认为改这个density去适配我所有的机型呢? 这个控件在不同手机 他的宽高我们是不知道的,我们没办法改这个宽高,但是每个手机,设计稿上的宽度是不是定死的?设计稿的宽度px定死了, 我是动态控制density去适配不同的机型,这是头条成功的地方,也是他失败的地方,我抓住了机会,做出了这个框架,在腾讯 阿里 百度,如果你有这样的机会抓住  那是千载难逢的,

设计图的宽度360dp 设备有很多种,建议ui一定要给到你的是dp的,不能给到你的pt px的 所以在公司你专不专业,要在这个细节上显得你专业,

dp就是dpi 头条框架有致命弱点的,

头条适配思路缺点

 这个地方用的306dp 那么人家的sdk 人家的三方库都用的是360吗 系统的控件他用的是360吗 这个时候就会有问题,没法做到大屏幕显示更多内容 这也是他的缺陷,

这个问题怎么解决?需要借助设计模式深度解决,这个尺寸,这个头条的适配 我们需要他更灵活,对于某一个activity fragment 我们可以自动的去控制,如果说一个第三方库,一个view 他的设计稿,并不是ui给到我们的,那么就需要不适配,需要用别的办法去适配,这样的话我需要去灵活的控制,当年我们做这个框架的时候就想到这个问题了,这个东西用什么样的思维,用什么样的架构去做?这就是能力,

 autosize 不多说

ScreenAdaptation你觉得他好不好?

 自动生成对应的dimens文件,

可以改 375是默认ui给的尺寸  你可以改成360 可以设置这些默认的ppi dpi都可以的 还可以过滤,比如说320不想要,可以忽略掉ignore_dp=320  有什么样的问题?面试:a框架和b框架你为什么选择a? 深度思考, 一个致命问题,一旦这个地方要改,这个地方要全部

高度侵染 污染 了代码,这个框架是不能用的 所以说我们面试当中有很多细节, 这个框架很好,作者 思维的度很不多,但从商业化的角度不能用

 

比如说横屏竖屏的切换,读取的是 有没有做过横屏的适配呢?真正的牛人,不管技术怎么去改 他岿然不动 横竖屏的切换我们这个地方有限定符的概念,res  night 如果你是夜晚模式,我们会读这个night  系统在处于某一个临界点的时候,他会读取你对应这里面的资源目录,所以说你在做横竖屏切换的时候,也要写对应的资源的包,如果这样去做,这样的框架就不能用了,还有这么的dimens app的体积就大了,

 

 布局太多,不能用 

 头条适配思路缺点 他不能做三方适配,

从源码角度,这个库做的还挺不错的, 头条这个库我们是用的,我在它的基础上改的

 架构师角度如何看待开源框架和写出目己的架构

activity 不能一棒子打死,我想适配就适配,不想适配不适配,

 sdk有个懒加载的问题,这个地方在哪个地方加载?使用CgntentProvidor完成自动初始化

取消适配我可以写一个单独的接口,应用适配<I>我可以写两个函数,第一个函数我可以判断你匹配的是宽度还是高度,单一原则,第二个函数从适配的角度,也就是说我们用这个框架去hook到我们这个屏幕的UI 那么我们需要拿 计算这个DPI 也就是说 我需要把UI给的定死的布局传进来

这两个接口大家应该明白,面向接口编程,这个 应用适配<I>  接口 后面去用他也有子类去实现

我写框架,我需要做一个manager或者说一个核心类,所有的开源框架都是这样做的,这里提供一个框架核心类 这种写法一般是单例 单例的写法有很多种,我写的是静态内部类,那么在这种核心类当中我要提供一个核心的方法 什么方法?我要完成今日头条的代码他的适配,今日头条的代码是什么?今日头条的代码其实主要在这句话里面,很明显

他是 设备的真实宽度/360 看图👆 这里有setCustomDensity我会通过Applicatlon获取到Metrics然后

除以360 这个值是外界传过来,然后算出来一个targetDensityDpi需要适配的这个DensityDpi 把这个dpi最终赋值了我们这个activity 完成activity的整个的适配,所以类似这样的代码我需要做封装,我写到核心的框架配置类里面提供一个函数,这个函数 我可以实现 取消适配的函数,我也可以在这个函数地方自己写一个函数 这叫面向组合编程,随便你怎么去架构,架构师仁者见仁智者见智 ,所以说我是写了一个方法取消适配,这个有一个很关键的点 什么叫取消适配?到底什么意思叫取消适配

density 这个值,我的手机默认就有一个density=2.75 在Applicatlon加载的时候,把这个值能不能把他缓存起来?

这个360我可以存起来,这个地方我可以不/360 我这个targetDOnsityDpi我可以直接设置成Applicatlon启动的时候 取到设备的原始的density就可以了,取消适配怎么取消?实际上就是把默认的density保存起来,在合适的地方给他还原,

在这个类当中,我需要缓存一个对象,  DisplayMeticsInfo 这些值都要缓存起来,

如何实现取消的功能呢? 获取屏幕原始的DisplayMetics 然后设置到system当中,然后这个地方还有一个很关键的点,就是头条的框架他这适配的功能不好去操作,所以说我借助一个很重要的东西,通过生命周期👇

 生命周期的管理,我这里会有Applicatlon当中会有这个ActivityLiecycleCaIlbacks 还有FragmentLiecycleCaIlbacks通过这两个东西,我能自动监听到我的核心类 这个监听 这个回调当中我可以做什么样的事情?我可以通过策略模式来搭配去完成比如说我的应用可以适配,我的应用可以取消

 那我的这个Callback当中我去写一个策略模式 我通过策略模式在这个取消适配的这个类当中 策略模式是一个接口,取消适配是一个实现类,我通过取消适配,我是不是就可以回调到我这里的取消功能了 黄 system

我们通过适配你会发现, 我们就能调到这里的函数,黄 system 当然底层 也是依赖一些工具类的

粉红,所以我这里也做了一个框架管理这个Manager ,通过Manager干什么?  通过这个Manager我可以获取用户也就是业务这个同学,他会在清单文件当中写一个meta信息

autosize 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值