安卓适配问题

Android屏幕适配出现的原因

由于Android系统的开放性,任何用户、开发者、OEM厂商、运营商都可以对Android进行定制,修改成他们想要的样子。但是这种“碎片化”到底到达什么程度呢?在2012年,OpenSignalMaps(以下简称OSM)发布了第一份Android碎片化报告,统计数据表明,2012年,支持Android的设备共有3997种。2013年,支持Android的设备共有11868种。2014年,支持Android的设备共有18796种。右边这张图片所显示的内容足以充分说明当今Android系统碎片化问题的严重性,因为该图片中的每一个矩形都代表着一种Android设备详细的统计数据请到这里查看

而随着支持Android系统的设备(手机、平板、电视、手表)的增多,设备碎片化、品牌碎片化、系统碎片化、传感器碎片化和屏幕碎片化的程度也在不断地加深。而我们今天要探讨的,则是对我们开发影响比较大的——屏幕的碎片化。 右一是Android屏幕尺寸的示意图 蓝色矩形的大小代表不同尺寸,颜色深浅则代表所占百分比的大小。 右二只是4,4s,5,5c,5s和平板的尺寸,现在还应该加上新推出的iphone6和plus,但是和Android的屏幕碎片化程度相比而言,还是差的太远

概念概述

1.什么是屏幕尺寸、屏幕分辨率、屏幕像素密度?

屏幕尺寸:是指屏幕对角线的长度。单位是英寸,1英寸=2.54厘米;           比如常见的屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等 屏幕分辨率:是指在横纵向上的像素点数,单位是px,1px=1像素点,一般是纵向像素横向像素,如1280×720; 屏幕像素密度:是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写,像素密度和屏幕尺寸和屏幕分辨率有关。在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。

三者关系

例如:计算Nexus5的屏幕像素密度: 屏幕尺寸:4.95inch、分辨率:1920×1080,屏幕像素密度:445

2.dp、dip、dpi、sp、px

px我们应该是比较熟悉的,前面的分辨率就是用的像素为单位, 大多数情况下,比如UI设计、Android原生API都会以px作为统一的计量单位, dip和dp是一个意思,都是Density Independent Pixels的缩写,即密度无关像素,上面我们说过,dpi是屏幕像素密度,假如一英寸里面有160个像素,这个屏幕的像素密度就是160dpi,那么在这种情况下,dp和px如何换算呢?在Android中,规定以160dpi为基准,1dip=1px,如果密度是320dpi,则1dip=2px,以此类推。 sp,即scale-independent pixels,与dp类似,但是可以根据文字大小首选项进行放缩,是设置字体大小的御用单位。 假如同样都是画一条480px的线,在720*1280分辨率手机上显示为2/3屏幕宽度,在480*800的手机上则占满了全屏,如果使用dp为单位,在这两种分辨率下160dp都显示为屏幕一般的长度。这也是为什么在Android开发中,写布局的时候要尽量使用dp而不是px的原因。下页图例

3.什么是mdpi、hdpi、xdpi、xxdpi、xxxdpi?如何计算和区分?

用于区分不同的像素密度。 现在主流的手机,都可以找到自己所在的屏幕密度档次。比如一般来说720p的手机是xhdpi,1080p的是xxhdpi。还有一种情况,比如同样都是4 英寸的480*800和4英寸的960*540,尽管实际算出来的dpi不一样,但是都要归到hdpi这一档,dpi都变成了240,这是Android 系统做的一种近似处理,目的是为了简化计算。也就是说,虽然实际上手机的密度有很多种,但是大家会找到自己的近似区间,然后用区间的代表值去做运算。

根据前面讲的屏幕密度区间,你可以记住这样一个简单的计算方法:

dp 是一个虚拟的概念,是在程序运行的时候算出来的。怎么理解呢?Android设备那么多,分辨率也那么多,直接学iOS用px做单位肯定不行的。为此 Google搞了一个叫dp的东西,换算公式是dp=(dpi/160)*px。也就是说,在密度为160dpi的屏幕上,1px就是1dp。依次类推, 在320dpi的屏幕上,1dp就是2px。屏幕密度越大,1个dp对应的px也就越多。

二,解决方案-屏幕适配

1、图片适配

图片的查找顺序: ldpi 、mdpi 、 hdpi 、xhdpi、xxhdpi、xxxhdpi 先找自己对应的文件夹,再往大的找,大的文件夹中没有图片,就再往小的找 例如mdpi(480*320)的手机,查找顺序如下     mdpi 、drawable 、 hdpi 、xhdpi、、xxhdpi、xxxhdpi、ldip

2、尺寸适配

根据分辨率创建相应values文件夹, 比如 values-1280x720 (大值在前)

在values文件夹下创建:dimens xml文件

在values-800x480文件夹下创建:dimens xml文件

在values-1280x720文件夹下创建:dimens xml文件              

代码演示屏幕宽度的一半。

相应的,在开发的时候,Google提供了一些资源目录,你可以把对应大小的图片放进去。

举个例子,你想展示一张100dp*100dp的图片,那么 在mdpi目录下,你需要放100px*100px的原图。 在xxxhdpi下,这张图片就得是 300px*300px。你的APP在运行的时候,如果需要加载这张图片,系统就会根据当前手机的密度,去相应的资源目录下去找。你可能会问,找不到怎么办呢?比如当前是mdpi的手机,系统发现mdpi下没有这张图,就会去比mdpi更大的目录找,然后进行缩放。实在找不到就去比mdpi更小的目录找, 找到之后再拉伸。那么设计师在出图的时候,有两种方法可以选。 一是按照官方的推荐方法,在上面所有目录下各放置一份同样的图片,根据dp和px的换算关系切成不同的大小,让系统自动去寻找最合适的图片。这种方法成倍的增加设计师的工作量不说,还会增加安装包的体积,用户下载的时候要多耗费流量。 第二种方法是选一个基准的屏幕密度,比如xhdpi,720p。所有的资源都放在这里,让系统自动 去缩放。这种方法呢,对于小屏幕的手机来说,因为要在运行的时候把一张大图缩放成小图,不如直接用小图节省内存。对大屏幕的手机呢,比如你720p的图拿 到1080p的手机去显示,肯定会因为缩放而失真。 综合起来的话,我更倾向于第二种方法。具体选择哪种屏幕密度做标准,你可以参考下Google官方的统计或者友盟上面的主流分辨率。

3、布局适配

和图片适配差不多。我们可以为不同的屏幕创建 不同的layout文件夹     如果我们想让大屏幕的手机显示布局和别的手机不一样,就可以再为大屏创建一个layout。 根据分辨率创建layout文件夹:比如layout-1280x720

4、代码适配

应用场景: 1,有些公司为了反编译,把布局用代码生成,而不写布局文件 2,有些广告公司需要给开发者提供jar包,而jar包中不能直接写布局,所以需要用代码写布局,需要用到代码适配

5、权重适配

weight:权重 在线性布局中可以使用weight属性设置控件所占的比例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值