① android 屏幕适配
摘自: https://www.jianshu.com/p/ec5a1a30694b
摘自: https://www.jianshu.com/p/337c47721690
摘自: https://www.jianshu.com/p/4669814362ee
因为ui设计师给你的设计图是以px为单位的,Android开发则是使用dp作为单位的,那么我们需要进行转换:
扩展:
Android屏幕适配-基础篇
Android推荐使用dp作为尺寸单位来适配UI ,通过dp加上自适应布局和weight比例布局可以基本解决不同手机上适配的问题,这基本是最原始的Android适配方案。
缺点:
(1)这种方案只能保证我们写出来的界面适配绝大部分手机,部分手机仍然需要单独适配,但dpi的不同,还是会存在差异。
(2)一般的设计稿都是以px为单位的,所以我们在写layout文件的时候需要将px转为dp,影响开发效率。
为了高效的实现UI开发,出现了新的适配方案,我把它称作宽高限定符适配。简单说,就是模仿市面上所有的Android手机的宽高像素值,设定一个基准的分辨率,其他分辨率都根据这个基准分辨率来计算,在不同的尺寸文件夹内部,根据该尺寸编写对应的dimens文件:
鸿洋大神的作品 ,使用也超级简单,核心功能就是在绘制的时候在onMeasure里面做变换,重新计算px。
缺点:
我们自定义的控件可能会被影响或限制,可能有些特定的控件(框架没有做适配的控件),需要单独适配。
小结:上述几种适配方案都是实际开发中用过的方案,但随着技术不断的更新,出现了更好的适配方案。
1.SmallestWidth适配(sw限定符适配)
实现原理:
Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。
sw限定符适配 和 宽高限定符适配 类似,区别在于,前者有很好的容错机制,如果没有value-sw360dp文件夹,系统会向下寻找,比如离360dp最近的只有value-sw350dp,那么Android就会选择value-sw350dp文件夹下面的资源文件。这个特性就完美的解决了上文提到的宽高限定符的容错问
优点:
1.非常稳定,极低概率出现意外
2.不会有任何性能的损耗
3.适配范围可自由控制,不会影响其他三方库
缺点:
就是多个dimens文件可能导致apk变大,几百k。
这里有个问题:
在项目的其他 mole 中怎么实现适配?难道也要多套 dimens 文件?
解答:
并不需要多套 dimens 文件,只需要在 values 文件夹下有一套与 app mole 一样的 dimens 文件即可达到适配。因为经过编译,所有 mole 中的 dimen 数据都会统一归类到主 mole(即 app mole)中的 values/dimens.xml 文件中了,然后系统又会根据你设置的值去找对应 values-swxxxdp 文件夹下的dimens.xml 文件中的值。
附件: [生成sw文件的工具]( https://links.jianshu.com/go ?
to=https%3A%2F%2Fgithub.com%2Fladingwu%2Fdimens_sw)
实现原理:修改系统的density值(核心)
今日头条适配是以设计图的宽或高进行适配的,适配最终是改变系统density实现的。
过程:
缺点:
1.只需要修改一次 density,项目中的所有地方都会自动适配,这个看似解放了双手,减少了很多操作,但是实际上反应了一个缺点,那就是只能一刀切的将整个项目进行适配,但适配范围是不可控的。
2.这个方案依赖于设计图尺寸,但是项目中的系统控件、三方库控件、等非我们项目自身设计的控件,它们的设计图尺寸并不会和我们项目自身的设
AndroidAutoSize 是基于今日头条适配方案,该开源库已经很大程度上解决了今日头条适配方案的两个缺点,可以对activity,fragment进行取消适配。也是目前我的项目中所使用的适配方案。
使用也非常简单只需两步:
第一步: 导入依赖
第二步: 配置AndroidManifest
在 AndroidManifest 中填写全局设计图尺寸 (单位 dp),如果使用副单位,则可以直接填写像素尺寸,不需要再将像素转化为 dp,详情请查看 demo-subunits
老师给的UI设计是在蓝湖上的,因为还没工作,接触就蓝湖,SW个人感觉好处就是蓝湖上尺寸多少你就写多少就行
② android 怎样pixes转化程dp
在android中为了适应不同分辨率的屏幕,引入了密度无关像素density-independent pixes,也就是dip,也可以简写为dp。之所以是与密度无关,是因为android为不同的密度提供了不同的scale值,比如mdpi的值为1,hdpi为1.5,xhdpi为2.这样,如果使用相同的dp值,系统在转换为px时,会使用dp*scale值,这样得到的比例大家都相同,而比例相同了,也就意味着屏幕适配了。如480*800,4.0inch的屏幕,为hdpi。屏幕的一半可以用160dp表示,其px = 160 * 1.5 = 240px,恰好为480的一半。而320*640的 3.5inch的屏幕,为mdpi。屏幕的一半也是160dp,其px = 160 * 1 = 160px,恰好为320的一半。这样dp就实现了不同屏幕的适配。
但是现在xhdpi的屏幕也很普遍,比如720*1280 4.5inch的屏幕,其scale值为2,所以整个屏幕为360dp,这样与hdpi和mdpi就不太相同了,用dp表示比例就有些误差了。不过这种误差也是在可以接受的范围之内。
上面所说的都是以屏幕宽度为基准,因为ui设计时也是尽量已宽度为基准,如果以高度为基准,dp值表示的比例就相差更大了。
而对于平板很多情况下以高度作为标准。都是hdpi的平板其宽高就更不一样了。比如高度分别是1200和1600的平板,都是hdpi。这就意味着如果是表示一半的高度,dp值分别为400dp和533,相差如此之大,所以用dp来布局显然不再适用。
解决方法:
既然dp的引入其实就是为了用同一个dp值表示相同的比例,那么我们其实可以直接用比例表示(dp的本质也是比例,只不过scale的划分无法面面俱到)。当然前提是不同的屏幕比例不能相差过大,比如横屏和竖屏就无法通用,需要写两个layout
例如ui给一张设计图,尺寸为2560 * 1920,其长宽比为4:3. 所有的标注均以该尺寸为准。这样为了能够通用这些标注,不必手动计算,可以定义如下个方法
private int px_x(float px) {//以宽度为基准计算x方向上的比例
return (int)(px / 2560 * mScreenHight);
}
private int px_y(float px) {
return (int)(px / 1920* mScreenWidth);
}
这样在代码中重新设置一下跟尺寸相关的属性即可以保证相关内容可以适配到不同尺寸的屏幕上。
需要注意的是:
这样写的一个缺点就是无法再xml里的layout中直接定义好布局。尤其是各个控件之间的距离。不过xml并非没有用处,可以通过xml很方便的定义控件直接的相对位置,比如above,below等属性,这样在代码中就不必重复定义了。可以通过 view.getLayoutParameters()方法获取到布局属性,然后覆盖与尺寸相关的内容即可。(注:不可以用new parameter()的方法,这样会完全覆盖xml中的设置)
③ 一种非常好用的Android屏幕适配
网上关于屏幕适配的文章已经铺天盖地了,为什么我还要讲?因为网上现在基本都是使用 屏幕分辨率限定符 进行适配,即每种屏幕分辨率的设备需要定义一套 dimens.xml 文件。由于不同分辨率的设备太多了,而且有些设备还有虚拟按键(例如华为手机),这样就还需要每个有虚拟按键的设备加多一套 dimens.xml 文件,再加上平板那些你会发现 dimens.xml 文件所占的体积已经超过 2M 了!这绝对不是我们想要的。
我这里要讲的是使用 sw<N>dp 限定符,即 smallestWidth(最小宽度) 限定符 来进行适配,使用这种方式只需要少量 dimens.xml 文件即可达到适配,而且根本不用考虑虚拟按键的问题。如果只适配手机,dimens.xml 文件所占的体积只有 100 多 KB,即使加上平板和 TV,也就 500 多 KB,完全可以接收。这种方案已经在自己多个项目中应用过了,经过几十台手机测试过,基本不会出现适配有问题的情况。制作生成对应 dimens.xml 文件插件(后面会讲)的作者也说过他在待过的两家大公司实践过,所以请放心使用。
关于为什么要进行屏幕适配,什么是 dp、dpi 这些概念我就不去一一讲解了,网上很多文章。这里我推荐几篇讲的比较好的:
屏幕分辨率限定符适配需要在 res 文件夹下创建各种屏幕分辨率对应的 values-xxx 文件夹,如下图:
然后根据一个基准分辨率,例如基准分辨率为 1280x720,将宽度分成 720 份,取值为 1px~720px,将高度分成 1280 份,取值为 1px~1280px,生成各种分辨率对应的 dimens.xml 文件。如下分别为分辨率 1280x720 与 1920x1080 所对应的横向 dimens.xml 文件:
假设设计图上的一个控件的宽度为 720px,那么布局中就写 android:layout_width="@dimen/x720" ,当运行程序的时候,系统会根据设备的分辨率去寻找对应的 dimens.xml 文件。例如运行在分辨率为 1280x720 的设备上,系统会自动找到对应的 values-1280x720 文件夹下的 lay_x.xml 文件,由上图可知 x720 对应的值为
720.px,可铺满该屏幕宽度。运行在分辨率为 1920x1080 的设备上,系统会自动找到对应的 values-1920x1080 文件夹下的 lay_x.xml 文件,由上图可知 x720 对应的值为 1080.0px,可铺满该屏幕宽度。这样就达到了屏幕适配的要求!
smallestWidth 限定符适配原理与屏幕分辨率限定符适配原理一样,系统都是根据限定符去寻找对应的 dimens.xml 文件。例如程序运行在最小宽度为 360dp 的设备上,系统会自动找到对应的 values-sw360dp 文件夹下的 dimens.xml 文件。区别就在于屏幕分辨率限定符适配是拿 px 值等比例缩放,而 smallestWidth 限定符适配是拿 dp 值来等比缩放而已。需要注意的是“最小宽度”是不区分方向的,即无论是宽度还是高度,哪一边小就认为哪一边是“最小宽度”。如下分别为最小宽度为 360dp 与最小宽度为 640dp 所对应的 dimens.xml 文件:
ScreenUtils——> ScreenUtils
既然原理都一样,都需要多套 dimens.xml 文件,那为什么要选择 smallestWidth 限定符适配呢?
大多数 UI 设计师提供的设计图无非就几种,它们对应的获取方式如下:
这些文件当然不会手动去写,网上已经有大神提供了自动生成这些文件的插件 ScreenMatch 。但是这个插件还是有点问题的:
基于以上问题,我在该插件的源码上优化生成了新的插件 ScreenMatch ,由于插件库已经有原作者的插件了,所以我就不重复造轮子上传到插件库了,你直接用本地安装的方式安装即可。
工具使用步骤:
然后选择在哪个 mole 下执行适配。即基于哪个 mole 下的 res/values/dimens.xml 文件作为基准 dimens.xml 文件,生成的其他尺寸 dimens.xml 文件放在哪个 mole 下。例如选择 app,然后点击 OK ,出现如下界面表示生成文件成功。如下图:
然后再看看 res 目录下会自动生成一堆 dimens.xml 文件,如下图:
通过上面的步骤就已经生成了所有设备对应的 dimens.xml 文件。
步骤 3 是以插件默认的最小宽度基准值为 360dp,适配的设备最小宽度为
320,360,384,392.7272,400,410,411.4285,432,480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365(包含了平板和 TV )生成的文件,但实际情况要根据设计图和需求设置。
例如设计图的最小宽度为 375dp,则需要更改最小宽度基准值为 375dp。如果项目只需要适配手机的话,适配的设备最小宽度保留 320,360,384,392.7272,400,410,411.4285,432,480 即可,若发现手机还有其他最小宽度自行加上即可,也麻烦把该最小宽度提供给我,我们一起来完善该份适配。
以上修改需要在配置文件里修改,即 screenMatch.properties 文件,该配置文件是执行完上面第 3 步后自动生成在项目的跟目录下的。如下图:
打开配置文件,修改下图中 1、3、4 的值即可。(图中单位均为 dp)
1:最小宽度基准值,填写设计图的最小宽度值即可。
2:插件默认适配的最小宽度值,即默认情况下会生成如下值的 dimens.xml 文件。
3:需要适配的最小宽度值(如果是小数,则保留 4 位小数。例如 392.727272...,则取 392.7272),即你想生成哪些 dimens.xml 文件。
4:忽略不需要适配的最小宽度值,即忽略掉插件默认生成的 dimens.xml 文件。
配置文件修改完成后,重新执行第 3 步,生成新的 dimens.xml 文件。
当然!如果你的设计图也是标准的 360dp,那么上面的步骤你可以忽略。直接复制我 github 上你需要的 dimens.xml 文件到你的项目即可, 默认的 values 文件夹下也需要一份 。
设计图标注多少 dp,布局中就写多少 dp ,非常方便!
大多数 UI 设计师提供的设计图无非就几种,它们对应的使用方式如下:
说了这么多,其实只需要简单的 2 步:
很多人肯定会有疑问,难道我用了这套适配方案就可以全部直接写死宽高了?那肯定不是的,如果一些好用的适配技巧能实现的,那就不要用直接写死宽高的方式。这套适配方案搭配下面这些适配技巧可以让你的屏幕适配更完美。
绝对布局(AbsoluteLayout)直接使用 X、Y 坐标来控制控件的位置,对于屏幕碎片化这么严重的今天,使用绝对布局对于屏幕适配来说就是灾难性的,所以 Google 已经废弃了该控件。
相对布局(RelativeLayout)或者约束布局(ConstraintLayout)就不一样了,相对布局的子控件之间使用 相对位置 的方式排列,即使屏幕的大小改变,控件的相对位置也不会变化,与屏幕大小无关,灵活性很强。约束布局也是类似的,通过对某些控件进行约束来确定它们之间的位置。
Nine-Patch 图片是一种被特殊处理过的 PNG 图片,你可以指定哪些区域可以拉伸而哪些区域不可以。例如聊天界面中的聊天气泡背景图就需要做成 Nine-Patch 图片,因为每条消息的字数不是固定的,如果背景图片不能随着字数的长短进行缩放,那么就会导致背景图片变形。
因为各种屏幕高宽比并不是固定的,有 16:9、4:3,还有全面屏的 19.5:9 等等,如果强行将宽高都适配那只会导致布局变形。
例如一个控件的宽高为 360dp 和 640dp,如果将它显示在宽高为 360dp 和 640dp 的设备上是正常铺满整个屏幕的,但是显示在宽高为 360dp 和 780dp 的设备上高度则不能铺满,如果你让高度铺满,而宽度又保持不变,那就会出现变形的情况。所以这也就是为什么目前市面上的屏幕适配方案只能以宽或高一个维度去适配,另一个方向用滑动或权重的方式去适配的原因。
那你为什么说高度也能适配呢?
这里说的高度也能适配指的是在不同分辨率和密度的手机上能达到等比缩放的适配,其他屏幕适配方案也是一样的。
注意:smallestWidth 限定符适配的效果是让不同分辨率和密度的设备上能达到以设计图等比缩放的适配,如果设备与设计图相差太大时并不能达到很好的适配效果,需要单独出图,其他屏幕适配方案也是一样的。
同横屏道理一样,平板、TV 与手机的宽高差距太大,想要平板、TV 也能完全适配,那就只能让设计师出一套平板、TV 的设计图,然后单独写一套平板、TV 的布局文件。
注意:再说一遍,smallestWidth 限定符适配的效果是让不同分辨率和密度的设备上能达到以设计图等比缩放的适配,如果设备与设计图相差太大时并不能达到很好的适配效果,需要单独出图,其他屏幕适配方案也是一样的。
github 地址: ScreenAdaptation
参考资料:
④ Android屏幕适配—被偷走的dp
DPI概念自行网络
Android手机按照不同DPI分为:ldpi、mdpi、 hdpi、 xhdpi、 xxhdpi等。
在不同的DPI上,px和dp有不同的比例关系,关系如下
由上表可知:
目前主流的分辨率一般为720x1280和1080x1920,所以一般设计师在设计Android应用时会选择720x1280的画布进行设计,如果只切一套图,工程师会把图放到xhdpi的资源文件夹中,此时,在xhdpi和xxhdpi的屏幕上都可以正常适配,但是在hdpi的屏幕上就会出现问题。
从上面的表格可以知道在xhdpi和xxhdpi时,屏幕的dp宽都是360dp;而在480x800的hdpi时,屏幕的dp宽度是320dp,少了40个dp,如果屏幕的dp宽度保持360dp的话,需要的像素宽度应该是540px,但市面上大部分的hdpi的手机都是480px的像素宽度。
为了适配480x800的手机屏幕,需要设计师在切图的时候也要切出一套hdpi的图,并且是480*800分辨率下的hdpi的图。
另外在写布局文件设置宽度的时候,也要需要考虑这个差值,hdpi下的dp宽度应该是xhdpi或xxhdpi下的dp宽度的0.8~0.9倍
⑤ vivos9最小宽度是多少dp
S9机型最小宽度值是360dp,建议不要使用代码操作手机,也不要修改开发者模式中的设置,以免手机使用出现异常;在手机的使用过程中有疑惑,可进入vivo官网--我的--在线客服--输入人工,咨询在线客服反馈。
⑥ android的gridview的问题
layout_height被设定后是不会按比例缩小的,若想按比例变化高度,可设置layout_weight比重的值
⑦ 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
⑧ 荣耀30最小宽度多少dp最好
荣耀30最小宽度360dp最好。
开发者选项里面有个最小宽度显示,很多人没搞懂,dp是安卓开发里面用来替代直接使用屏幕像素的一个单位,用它比直接用像素px。具体网络,它和像素换算关系为px=dp*(dpi/160)开发者选项里面这个其实这个不是ppi,改完之后自己看看显示那里就知道了,等于四屏幕宽度为1080px,换算一下432dp对应400dpi,数字越小dpi越大。
首先打开 ,设置,然后找到 开发者选项 点击打开。最后找到 最小宽度 ,随着智能手机的进化手机屏幕也跟着越来越精致,每款手机都有一个最佳最小宽度值;一般这个都是手机系统默认的,可以自行调控。
调控前最好记住手机系统默认值,以便后期自行改回初始值。
⑨ oppok3最小宽度360dp是啥意思
个人更喜欢OPPO K3手机哦。
OPPO硬核少年K3高能来袭~全系标配6.5 英寸的全景屏,搭载高通骁龙710处理器,全新光感屏幕指纹+升降式摄像头+VOOC闪充3.0,前后1600万像素AI拍照,更有超清夜景2.0,拍出夜的美。更多信息敬请关注OPPO官网。
本回答适用于OPPO所有机型。