Android 屏幕适配笔记

1.自己怎么做适配的?
2.市面上常用的做适配的方法?

友盟指数

 面试的时候,有面试者说让美工5套图片,
 保存到相应的drawable目录下,
 或者做5份布局来适应不同的屏幕。
 
 缺点1:布局过多或者图片过多,造成包的臃肿,过大,占用很多系统内存
 缺点2:布局或者图片过多,过于麻烦,耗时耗力


1.屏幕大小    
物理屏幕的大小,看屏幕的对角线

2.分辨率:实际上是像素的总和, 分辨率越高,就越清晰,
分辨率越低,就越不清晰 1280*720


3.dpi 密度(每英寸所展示的像素)  


hdpi: 480*800  480*854    x轴480个像素, y轴800个像素
大约每英寸240dpi    
ldpi: 320*240  240*432  240*400  大约每英寸120dpi
mdpi: 320*480       大约每英寸160dpi  参照物       
xhdpi:1280*720      大约每英寸320dpi
xxhdp:              大约每英寸480dpi
 

  ldpi :  mdpi :  hdpi : xhdpi:  xxhdpi  
  120    160     240    320     480
   
  3       4       6      8       12



  0.75    1       1.5     2         3

 36*36   48*48    72*72  96*96     144*144
          
 

 xh     h:   m       l
 320   240  160     120
       

缩放比例  每英寸所占占像素个数的比例
l : m : h : xh
3 :  4 : 6 : 8

   
0.5 : 1 : 1.5 :2

120/160 : 160/160 : 240/160 : 320:160 ====》0.75 : 1 : 1.5 :2

======> 75 :100:150:200====>15:20:30:40===>3:4:6:8:12   


不同dpi每英寸像素点的比例


   
                      ldpi       h      xh      xxh
                     36 * 36   72*72   96*96    144*144

  12个像素点


120/160 : 160/160 : 240/160 : 320/160

0.75 :  1 : 1.5: 2==75 : 100 : 150 : 200==15 : 20 : 30 : 40==3:4:6:8
   
       

ldpi: 0.75       1dp=====0.75px     
mdpi:  1         1dp====1px       
hdpi: 1.5        1dp=====1.5px
xhdpi:2.0        1dp======2px   
xxhdpi:3.0       1dp======3px     


(图标)每一个缩放比例占用多少像素?
以mdpi为例 每一个缩放比例占用48/4=12个像素点
所以ldpi对应的图标的宽高为36*36
所以hdpi对应的图标的宽高为72*72
所以xhdpi对应的图标的宽高为96*96

 也就是说呀,做一套图片放进不同的drawable目录下,他会根据不同的缩放比率对图片进行缩放

(并不是说真的缩放图片,
而是在运行的时候把相应目录下的图片放到不同分辨率的手机上
(也就是说根据手机屏幕的大小(手机屏幕宽和高的分辨率)去加载不同目录下的图片))
 所以可以用一套图去做屏幕适配

演示1:特大分辨率  大分辨率 中分辨率 小分辨率 四种不同分辨率的图片(注意:图片名字都相同) 运行在四种不同屏幕分辨率(...)的手机上
       结论是:各个不同分辨率的手机,
       会显示不同分辨率的图片(不同分辨率的图片会自动找到不同分辨率的手机上显示)



演示2: 把中等分辨率目录下面的图片删掉,刷新工程,全部退出之后 运行中等分辨率的手机
        结果显示:中等分辨率的手机,会先从从中等分辨率的目录(drawable-mdpi)下找图片,如果中等分辨率的目录(drawable-mdpi)下没有图片,
    就会把大分辨率目录(drawable-hdpi)下的图片加载进来




    结论:如果不同的drawable目录下只存放一套图片,
    模拟器运行时还会去加载一张图片,
    
    先从大分辨率的目录(drawable-hdpi)开始找,
    如果大分辨率的目录(drawable-hdpi)有图片,
    
    就会把这个目录(drawable-hdpi)下的图片给加载进来,
    如果大分辨率的目录(drawable-hdpi)没有图片,
    就会加载特大分辨率目录下(drawable-xhdpi)下的图片



结论1:

   高清图放到小分辨率的手机上
高分辨率的图片运行在低分辨率的手机上会出现什么问题?
会自动去压缩高清的图片,图片变小

低分辨率的图片运行在高分辨率的手机上会产生什么问题?
会自动拉伸图片,图片失真,模糊




Q1:通过上面的示例得知:可以用一套图去做屏幕适配,
因为模拟器运行时可以自己去找(哪怕自己的目录下没有图片),
那么问题又来了?当程序员让美工切图的时候,该让美工切多大分辨率的图片呢?
R1:480*800  



演示3: 再次把大分辨率(drawable-hdpi)下的图片删除,刷新工程,全部退出之后 运行中等分辨率的手机
        结果显示:中等分辨率的手机,会先从从中等分辨率的目录下找图片,
    如果没有再从大分辨率的目录下找图片,如果还没就这次就会把特大分辨率目录下的图片给加载进来了。



    结论:如果不同的drawable目录下只存放一套图片, 模拟器运行时还会去加载一张图片,
    先从大分辨率的目录(drawable-hdpi)开始找,如果上面的目录(drawable-hdpi)有图片,
    就会把这个目录(drawable-hdpi)下的图片给加载进来,如果上面的目录(drawable-hdpi)没有图片,
    就会加载特大分辨率目录下(drawable-xhdpi)下的图片




Q2:如果低分辨率的图片,运行到高分辨率的手机上会有什么效果?
R2:图片会变得模糊

 那怎么解决这个问题;
 第一种解决方案就是 9patch(点九的图片)
 第二种解决方案就是 图片不填充屏幕就不会拉伸了,
 如果图片是欢迎界面(或者背景图片)的时候,就要切两套图片了
  一套图片是大分辨率480*800 另一套图片就是特大分辨率的 1280*720
 示例:项目开发中drawable-hdpi目录下存放的图片都是 480*800或者480*854的图片(也包括欢迎界面),
 特大分辨率drawable-xhdpi目录下存放的都是1280*720(欢迎界面或者背景图片)和点九的图片
  drawable-ldpi目录下没放图片 drawable-mdpi中存放项目icon图标(320*480) drawable-xhdpi中存放的项目icon图标(1280*720)

 所以只需要一套图就可以做整个适配了




结论(记住)
2.切两套图片(背景图片/欢迎界面) 第一套图片(hdpi:480*800|480*854)
第二套图片(背景图片/欢迎界面) 第二套图片(xhdpi:1280*768|1280*720 );      
3.apk图标 切5个 ldpi 36*36   mdpi: 48*48  hdpi:72*72 xhdpi:96*96
4.其他图标放在xhdpi里面,其他点9图片放在hdpi里面
 

 点9图片上下左右四条线各代表什么作用




Q3:如果把高分辨率的图片(特高清的图片),运行到低分辨率的手机上会有什么效果?
R3:内存溢出,直接就崩了


Q4:你为什么把480*800的图片放到drawable-hdpi目录下?放到其他目录下面行不行?
R4:详情见图片(480 -800的图片放到drawable-hdpi目录下的原因) 不能放到其他目录下



***********************************************************************************************************************************************************


以上全部都是适配图片,以下是适配布局layout

布局适配一:权重 包括内容  填充父窗体

权重和dimens文件相结合,要么只用权重(weight)在res目录下新建四个文件夹分别是: values-1280*720 values-320*240 values-480*320  values-800*480
四个目录下面都是dimens.xml文件  里面都有个<dimen name="width">180dp</dimen>标签 160dp
注意写法:values后面的乘数的值要比被乘数的值大 (要写成values-480*320,但是不能写成values-320*480,这点注意)



布局适配二:

除此之外还可以在res目录下再创建两个目录分别是layout-1280*720
和layout—800*480 注意写法:values后面的乘数的值要比被乘数的值大

如果没有其他的布局,会默认加载主布局


布局适配三:
横竖屏切换时候的布局适配,
横屏竖屏自动切换:
解决方法一:

可以在res目录下建立layout-port-800*480和layout-land-800*480两 个 目录,(注意其他三个的目录也一样)
里面分别放置竖屏和横屏两种布局文件,这样在手机屏幕方向变化 的 时候系统会自动调用相应 的 布局文件,避免一种布局文件无法满足两种屏幕显示 的 问题。
不同分辨率横屏竖屏自动切换:
以800x600为例
可以在res目录下建立layout-port-800*480和layout-land-800x480两个目录


解决方法二:
不切换:设置横竖屏不能切换


布局适配四(通用适配利用java代码适配):
 1.布局文件(xml文件先写死,随便写)
 2.动态获得当前手机屏幕的宽和高的像素值
 3.然后动态设置当前控件的宽高所占当前所在布局(当前手机屏幕)
 的百分比
 
 结论:这个方法是通用的,所有的适配都可以用这种方法
  (注意:这个适配方法,图片的话只需做一套,都是点9的图片)

 加0.5的原因是减少(double类型在转换为int类型过程中容易损失精度)
 从而减少误差


(记住)
布局适配   第一种通用的适配方式
不建议在res里面创建多个不同分辨率的布局目录,一般应用将屏幕设置死(纵向)
1.结合动态设置控件大小(以屏幕宽高为准,设置当前控件的宽高所占屏幕宽高的百分比)
和充分利用控件的权重和dimens.xml做屏幕适配


=============================  屏幕适配最后总结 =========================================================

总结:

图片适配
1.一套图片适配整个屏幕
2.切两套图片(背景图片/欢迎界面) 第一套图片(hdpi:480*800|480*854)
第二套图片(背景图片/欢迎界面) 第二套图片(xhdpi:1280*768|1280*720 );      
3.apk图标 切5个 ldpi 36*36   mdpi: 48*48  hdpi:72*72 xhdpi:96*96
4.其他图片都用点9图片 -----> 放在xhdpi里面

 
布局控件适配
以后开发编写布局文件时时,根据UI给出的设计图(APP需求说明文档上一般标注有某个控件的宽和高分别为多少像素(一般标注的是像素px值)),
那么我们可以快速的按照其标识的px单位结合不同values目录下的dimens文件(见压缩包)进行编写布局。
基本解决了适配的问题。http://blog.csdn.net/lmj623565791/article/details/45460089
(详见博客)


不建议在res里面创建多个不同分辨率的布局目录,一般应用将屏幕设置死(纵向)
1.结合动态设置控件大小(以屏幕宽高为准,设置当前控件的宽高所占屏幕宽高的百分比)
和充分利用控件的权重和dimens.xml做屏幕适配
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值