android开发适配
⑴ Android屏幕适配-应用篇
Android屏幕适配-基础篇
Android屏幕适配-应用篇
从两个大方面阐述一下Android的屏幕适配:
Android推荐使用dp作为尺寸单位来适配UI ,通过dp加上自适应布局和weight比例布局可以基本解决不同手机上适配的问题,这基本是最原始的Android适配方案。
缺点 :
(1)这种方案只能保证我们写出来的界面适配绝大部分手机,部分手机仍然需要单独适配,但dpi的不同,还是会存在差异。
(2)一般的设计稿都是以px为单位的,所以我们在写layout文件的时候需要将px转为dp,影响开发效率。
为了高效的实现UI开发,出现了新的适配方案,我把它称作宽高限定符适配。简单说,就是穷举市面上所有的Android手机的宽高像素值,设定一个基准的分辨率,其他分辨率都根据这个基准分辨率来计算,在不同的尺寸文件夹内部,根据该尺寸编写对应的dimens文件:
鸿洋大神的作品 ,使用也超级简单,核心功能就是在绘制的时候在onMeasure里面做变换,重新计算px。
缺点 :我们自定义的控件可能会被影响或限制,可能有些特定的控件(框架没有做适配的控件),需要单独适配。
小结:上述几种适配方案都是实际开发中用过的方案,但随着技术不断的更新,出现了更好的适配方案。
实现原理 :Android会识别屏幕可用高度和宽度的最小尺寸的dp值( 其实就是手机的宽度值 ),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。
sw限定符适配 和 宽高限定符适配 类似,区别在于,前者有很好的容错机制,如果没有value-sw360dp文件夹,系统会向下寻找,比如离360dp最近的只有value-sw350dp,那么Android就会选择value-sw350dp文件夹下面的资源文件。这个特性就完美的解决了上文提到的宽高限定符的容错问题。
优点: 1.非常稳定,极低概率出现意外
2.不会有任何性能的损耗
3.适配范围可自由控制,不会影响其他三方库
缺点 :就是多个dimens文件可能导致apk变大,几百k。
附件: 生成sw文件的工具
实现原理 : 修改系统的density值 (核心)
今日头条适配是以设计图的宽或高进行适配的,适配最终是改变系统density实现的。
过程:
AndroidAutoSize 是基于今日头条适配方案,该开源库已经很大程度上解决了今日头条适配方案的两个缺点,可以对activity,fragment进行取消适配。也是目前我的项目中所使用的适配方案。
使用也非常简单只需两步:
(1)引入:
(2)在 AndroidManifest 中填写全局设计图尺寸 (单位 dp),如果使用副单位,则可以直接填写像素尺寸,不需要再将像素转化为 dp,详情请查看 demo-subunits
⑵ Android切图适配知识点汇总
对于在工作中没有接触过安卓版本app,或是面试的时候会被问到安卓分辨率等问题,可以通过本文对安卓切图有所了解。我在以往的工作中也没有接触过安卓设计等一系列问题,但是看完一些文章后,大致对安卓分辨率等知识点有所了解。此文是对自己所了解到的知识做一个总结,也希望能帮助到不了解安卓一系列问题的同行们,好啦,马上进入正题!
基本概念
1、手机屏幕尺寸计算方式:对角线尺寸/2.54(1英寸=2.54厘米)
2、分辨率:屏幕上显示的像素个数,单位尺寸内像素点越多,显示的图像就越清楚。
上图中红框框出来的是现在市场上主流的分辨率,只要记这三个就可以。其他的已被淘汰。
3、屏幕密度:屏幕每英寸有多少个像素。
4、单位:dp是开发中用于描述尺寸和间距。
sp是用于描述字号和行距。
用哪种分辨率来设计?
原则上需要为不同的分辨率去单独设计效果图,但由于实际情况,只需要采用一种分辨率去设计,目前多数采用720*1280的分辨率。
需要提供几套切图?
只需要一套切图即可
720*1280尺寸的切图可以适配其他机型,有些特殊的切图需要单独适配的,比如icon等。
适配480 800的机型,只需要把切图/1.5即可。
适配1080 1920的机型,只需要把切图*1.5即可。适配此分辨率的时候,需要在720 1280下画图的时候,尽量采用矢量图形来画图。
例如,图标是48 48的时候,适配1080 1920点时候,48px*1.5=72px.把矢量图形调整为72px即可。开发会把切图放到xxhdpi的文件目录下,就会自动适配1080 1920
同样,适配480 800的时候,48px/1.5=32px.开发把切图放到hdpi文件目录中,会自动适配。
720 1280的切图,开发放到xhdpi的目录下。
注:设计图片的时候尽量采用偶数。
需要提供几套标注?
在720*1280分辨率下进行设计,此分辨率下1dp=2px.
可以直接使用dp标注尺寸,sp标注文字大小
注:使用dp标注尺寸。使用sp标注文字大小
该使用什么字体及字号?
中文字体:思源
英文字体:Android 4.x及以上采用Roboto,Android 2.x和3.x采用Droid Sans.
字号:12sp、14sp、18sp、22sp(也可根据实际情况调整)
目前掌握以上知识点,可能多少也有些小问题,欢迎有经验的大神指正、指导。谢谢啦~
⑶ Android一般开发的时候的屏幕适配是怎么做的
Android中一个layout想适配各种屏幕尺寸那么需要按以下规则去写layout:
1. 尽量使用wrap_content、match_parent、weight 来规定layout的大小。
2. 要确保布局的灵活性并适应各种尺寸的屏幕,应使用 “wrap_content” 和 “match_parent” 控制某些视图组件的宽度和高度。
3. 使用 “wrap_content”,系统就会将视图的宽度或高度设置成所需的最小尺寸以适应视图中的内容,而 “match_parent”(在低于 API 级别 8 的级别中称为“fill_parent”)则会展开组件以匹配其父视图的尺寸。
4. 如果使用 “wrap_content” 和 “match_parent” 尺寸值而不是硬编码的尺寸,视图就会相应地仅使用自身所需的空间或展开以填满可用空间。此方法可让布局正确适应各种屏幕尺寸和屏幕方向。
5. 如果某些地方必须要规定控件的大小,那么要使用dp 或者 dip单位。
6. 字段必须使用 sp单位。
7. 将不同的图片放到不同的drawable目录下,分辨率的匹配规则如下:
drawable-mdpi 320 * 480
drawable-hdpi 480*800
drawable-xhdpi 720 * 1280
drawable-xxhdpi 1080 * 1920
drawable-xxxhdpi 1080+
⑷ android屏幕适配
android设备碎片化严重,因此在实际开发的时候需要做屏幕适配
适配主要是在以下几个方面:
常见的布局适配主要是以下几点:
a.避免写死布局尺寸,使用wrap_content或者martch_parent
b.使用权重,比如linearlayout中的weight;
c.使用relative的相对位置摆放,比如layout_centerInParent="true"
d.ConstraintLayout 原理类似于relatvie,相对摆放,但是性能相对于relatvie会好一点
e.android官方的库Percent-support-lib,该库主要是用的是百分比适配
a. .9图适配,这个是使用了.9图可以在特别区域拉伸不失真的特性来适配
b. 使用多套位图,匹配不同的分辨率,比如在mipmap,mipmap-xhdpi,mipmap-xxhdpi,等文件夹下面放多套分辨率不同的内容相同的图片
是指同一个业务逻辑,在不同的设备上执行不同的跳转方式,比如在手机上打开一个新的activity,但是在平板上,可以在横屏状态下,右侧增加一个fragment,展示打开的页面。
a.分辨率限定符,使用drawable-dpi,drawable-hdpi等
b.尺寸限定符
c.最小宽度限定符
d.屏幕方向限定符
a.android9.0开始 有官方的api进行适配
b.华为,小米,魅族,vivo,oppo各大room厂商有对应的api进行适配
除了以上这些,还有dimens适配,但是都各有缺点,有的需要多套图,有的需要多套资源文件,dimens适配的dimens文件过多,需要针对不同的屏幕分辨率来生成对应的文件,比较繁琐
以上,实际开发中,做的最多的适配为布局适配
开发中屏幕适配的核心是在于屏幕缩放,不论是哪种屏幕适配,都是以这个缩放为基础
已知:设计图手机像素(W,H),设计图上控件的像素值(ViewW,ViewH),目标设备分辨率(TargetW,TargetH)
求:目标设备上view的宽高(TargetViewW,TargetViewH)
公式:宽:ViewW / W * TargetW=TargetViewW
高:ViewH / H * TargetH =TargetViewH
原理:根据当前设备的分辨率,计算出设计图上的控件在该设备上的缩放比,然后根据缩放比,来动态的设置view, 最终换算出来的单位为px
该适配方式是通过自定义外部的ViewGroup,比如LinearLayout,RelativeLayout,在onMeasure方法中,遍历子view,设置宽高以及padding,margin
以下是封装了一个工具类,用来获取屏幕宽高以及计算缩放比:
未完待续
⑸ Android 项目中软件图标适配和mipmap文件夹的规则
参考: Android开发使用mipmap文件夹的正确姿势: px 、dpi 、dp
Android应用图标微技巧,8.0系统中应用图标的适配
测试的在华为手机Android 9.0系统中,但是在切换 targetSdkVersion 大于26和小于26的时候,并没有对图标进行原型切换,26前后对应的图标形状一样。可能是华为对这部分源码进行了修改,将mask层修改为圆角矩形。
mipmap 中的文件夹分别为
新创建的项目都会有这几个文件夹,那么这几个文件夹是怎样的呢?内部的规则是什么呢?都是怎样对应的呢?
讲解这些之前我们需要知道我们平常见到的一些尺寸单位的关系:
px (像素点)和 dpi (像素单位密度)之间的换算公式是:
px,dpi 和 dp 之间关系:
上边一些尺寸的基础知识,感觉很乱啊。。。
接下来就将一下 mipmap 下边几个文件夹的关系 表1-1:
上边 dp 对应 px 的比值我起名为 (luffy) 。
我们在开发的过程中,对图片的展示通常就两种:固定宽高,不固定宽高。
固定宽高会遇到的问题是放置的图片可能会模糊;不固定宽高可能就会和自己想要的尺寸不一样了。
我现在以不固定宽高的来说,比如给一个 TextView 设置 dropLeft ,这样就不能设置宽高,那么 ui 给的图片我到底该放置到哪个 dpi 文件夹里边才合适呢。因为我开发的是特定机器上的 app ,所以只需要一个 mipmap 文件夹就行了。
我现在将一张 32 * 32 的图片分别放到这六个文件夹里边,不固定尺寸的显示图片,并通过 方法 获取图片的宽高,测试机器的 dpi 是 480 。
记住两个数据:图片尺寸是 32 * 32 ;测试机是 480dpi 。
结果如下 表1-2:
结果是同一张图片放到不同的文件夹中,显示的尺寸是不一样的,因为测试机是 480dpi ,对应的本命 mipmap 文件夹是 mipmap-xxhdpi ,所以这个文件夹中的图片在这个测试机上都会原尺寸显示。其他的文件夹中的图片都会根据1-2表格中的 dp 和px的换算比例进行换算。比如,1-2表中 mipmap-xxhdpi 对应的 luffy 是 3 , mipmap-hdpi 的 luffy 值是 1.5 ,如果我们将 32 * 32 的图片放到 mipmap-hdpi 文件夹中,其他文件夹中不放置,软件展示图片的时候就会获取 mipmap-hdpi 文件夹中的图片,显示的效果我们知道是 64 * 64 ,再看对应着刚说的 luffy 值,是不是看出点什么?好像不同文件夹中的图片显示的效果和luffy值有关啊。
比如 ,当将图片放置到mipmap-hdpi 文件夹中:
那么如果我们想不管从哪个文件夹获取图片,展示的都是 32*32 ,那好说啊,按照这个公式,获取不同文件夹中需要放置的图片尺寸。比如 mipmap-hdpi 放置 16 * 16 的图片,就可以在我的测试机上展示 32 * 32 的效果了。
我上边一直说的展示尺寸都是 px ,那么在不同的机器上同时展示 32 * 32 的效果,根据上边的公式可以实现,但是展示的效果肯定各不相同。
上边的需求是我在做特定机器时,只有一种分辨率,一种 dpi ,那我想把所有 mipmap 文件夹都塞满,而且展示的效果都一样,就需要上边的公式。
当手机上不同的机器,不同的 dpi 展示同一种效果时,也就是占用屏幕相同的比例时,那表示这个效果的值就是 dp ,相同的 dp 在不同的机器上展示的效果基本相同,比如我想在 480dpi 的机器上展示的效果要和 320dpi 一样,那就需要它们展示的 dp 一样,我们展示一个 32dp*32dp 的图片。根据公式: px=dp*(dpi/160) 可以得到 32 * luffy=?px ;那么 480dpi 对应的 luffy 值是 3 ,所以 480dpi 对应的 mipmap 中的图片尺寸是 96px * 96px , 320dpi 对应的 mipmap 中的尺寸是 64 * 64 。
要在不同的机器上展示 32dp*32dp 的图片一张表格展示: 1-3
其他 dp 的图片都可以按照这个规则展示。
当合适的 mipmap 文件夹中没有对应的图片的时候,会优先往高的找,会优先找最近的