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.youkuaiyun.com/lmj623565791/article/details/45460089
(详见博客)
不建议在res里面创建多个不同分辨率的布局目录,一般应用将屏幕设置死(纵向)
1.结合动态设置控件大小(以屏幕宽高为准,设置当前控件的宽高所占屏幕宽高的百分比)
和充分利用控件的权重和dimens.xml做屏幕适配
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.youkuaiyun.com/lmj623565791/article/details/45460089
(详见博客)
不建议在res里面创建多个不同分辨率的布局目录,一般应用将屏幕设置死(纵向)
1.结合动态设置控件大小(以屏幕宽高为准,设置当前控件的宽高所占屏幕宽高的百分比)
和充分利用控件的权重和dimens.xml做屏幕适配