整个安卓平台的差异化越来越大。
目前创新互联建站已为近千家的企业提供了网站建设、域名、网页空间、网站托管维护、企业网站设计、柘荣网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
市场上存在的各种安卓系统之间的版本差异只是安卓平台碎片化问题的一个方面。总的来说,安卓平台碎片化问题是指随着安卓系统快速演化。
不同软硬件厂商生产的安卓设备以及定制的安卓系统层出不穷,导致安卓设备之间的差异越来越大,整个安卓的生态系统严重分裂而带来的一系列问题。在这种碎片化环境中,一个安卓应用在不同的设备上可能呈现出完全不同的行为。
为了保证产品能够适配各式各样的移动设备,安卓开发者们必须针对不同的设备对其开发的应用进行特殊的处理。无疑,这给开发者带来不少负担,也使得安卓应用的兼容性面临着巨大的挑战。
扩展资料
兼容性问题顾名思义能够导致应用在不同设备上的表现出不一致的行为。这种不一致具体表现形式为:应用在特定的设备上可能会出现功能性问题,性能问题,或者无法适配而使用户体验下降。
以设备屏幕大小的问题为例,现存的安卓设备屏幕尺寸、分辨率千差万别,屏幕长宽比例也是不尽相同。对于应用开发者来说,如果没有针对不同屏幕尺寸对界面进行优化,那么他们的产品应在部分设备上就可能造成布局问题,而使得用户体验受到严重的影响。
参考资料来源:百度百科-安卓碎片化
公司有一个基于Android的平板产品,在医院中使用。也就是说软件和硬件(平板)都是我们提供给医院的,但是我们是个软件公司,所以平板是我们从设备制造商采购来的。一开始的计划是我们只需要采购同一个型号的设备( 设备A ),所以这个项目几乎不用考虑屏幕适配的问题。但是最近可能公司和设备商没有完全谈拢,我们又换了一批新的设备( 设备B )。设备B从屏幕大小上来看,是和设备A是一模一样的,但是却出现了和设备A差距较大的显示效果
先通过日志打印一下两个设备的屏幕相关信息
设备A 输出结果:
widthPixels: 1280
heightPixels: 737
densityDpi: 210
density: 1.3125
设备B 输出结果:
widthPixels: 1280
heightPixels: 800
densityDpi: 160
density: 1.0
这里主要三个不同,分别是 heightPixels 、 densityDpi 、 density ,我们一个个来分析
问题一:heightPixels不同
一开始我是有点困惑的,这个737是什么鬼,两个屏幕明明是一样大的,为什么一个高800,一个高737?
其实, heightPixels 代表的是屏幕有效的高度,就是
所以,其实就是一个设备带导航栏,而另一个不带,虽然我在应用中隐藏了导航栏,但是这个高度不管你有没有隐藏导航栏,这个值都不会改变。
综合上述,这两台设备的分辨率,其实都是1280像素x800像素。所以 heightPixels 不同,实际上对我们屏幕适配并没有什么影响
问题二:densityDpi不同
densityDpi 就是我们常说的DPI,查阅了计算公式是下面这样的
但是, densityDpi 和屏幕分辨率其实是可以通过adb命令改变的
那这个公式是不是感觉有点奇怪呢,两个都是变量,那对角线的尺寸岂不是也变了?但是显然一个设备生产出来以后,屏幕对角线尺寸肯定是固定的。
查阅了百度百科中对DPI的定义
所以,这里我是这么认为的(如果说的有问题欢迎指正)
我们一开始使用 wm size 和 wm density 查询到的就是原始的屏幕分辨率和DPI,但是之后我们使用adb命令修改后, 实际上屏幕分辨率并没有变化,变化的是图像分辨率,即一个图像像素,其实是已经补充了很多个屏幕像素,从而表现出页面上的元素大小发生了变化
问题三:density不同
density其实就是一个比例系数
所以两个设备的 density 不同,归根结底就是 densityDpi 不同
经过我们上面的分析,我们可以得出这样的结果
两个设备屏幕宽高尺寸相同,分辨率相同,项目中使用dp作为单位,但是原始 densityDpi 不同,导致了两个设备上UI元素显示的大小(px)不同
对于同样尺寸的设备,我们当然希望两端在UI元素的大小上显示效果是一致的,但是Android碎片化严重,即使同样尺寸同样分辨率的设备,也有可能出现DPI不同,这就是Android屏幕适配最大的问题
那我们如何来解决这个问题呢?
Google提供了资源目录的 限定符规则
手机宽度dp值计算方法:
这里我提供了一个自动生成sw文件工具类
由于一开始的UI设计是以设备A为基准的,所以设备A(即values-sw609dp)中的dp值保持不变,设备B(即values-sw800dp)中的1dp = 1.3125dp,这样两个设备上的UI显示就达到了一致的效果
经过我们上面的分析,应该有很多人会发现,我们使用adb命令 wm density 210 的将设备B的 densityDpi 设置成设备A一致,也能达到一样的效果。但是这也只能在开发调试过程中这么做,我们不可能通过这种方法去修改厂家或者所有用户手中的设备
通过本文的分析,你是否对android屏幕的碎片化有一个新的理解呢,并不是分辨率和屏幕大小完全相同的两个设备,它们的页面显示效果就一定是一致的
android碎片化指安卓系统被各个手机厂家改成自已的个性化版本,并没有统一的版本。