android机型适配
A. 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(也可根据实际情况调整)
目前掌握以上知识点,可能多少也有些小问题,欢迎有经验的大神指正、指导。谢谢啦~
B. oppo手机安卓12适配名单
手机升级ColorOS12招募信息相关信息如下,不同机型升级时间有所差异,具体时间请以社区官方公告为准哦~
打开手机端““OPPO社区”APP>圈子>(发现更多)>(发现圈子)>(全部圈子/我的圈子)>ColorOS圈>升级尝鲜或关注“版本经理”>找到“ColorOS12适配进度公告集合帖”或“ColorOS12xAndroid12适配进度公告集合帖””,进行查看。
C. Android屏幕配适、版本配适与多语言支持
目前主流的屏幕密度:240dpi (480 * 800px) , 320dpi (720*1280px) , 480dpi(1080*1920px)现在新出的手机几乎全是全高清屏(1080*1920px)
Android图片资源目录
mdpi [1倍]160dpi
hdpi [1.5倍] 240dpi
xhdpi [2倍] 320dpi
xxhdpi [3倍] 480dpi
xxxhdpi [4倍] 640dpi
因此对其他图片资源的建议是:
a.一般采用720 * 1280的屏幕尺寸设计,这样切图可以直接适配720 * 1280的机型。
b.720 * 1280下切的图基本可以适配大部分机型。
d.适配480 * 800的机型,只需要把切图 * 0.75。
e.适配1080 * 1920 的机型,只需要把切图 * 1.50即可。
a.以720 * 1280作为设计标准,画布大小定位720 * 1280 (以后1080*1920px做标准亦可,类推)
b.只使用偶数单位的尺寸
c.尽量只使用 24pt, 28pt , 32pt, 44pt大小的字体
d.设计完成之后,所有尺寸的px值除以2作为dp数据交给开发人员
e.三份切图,分别是:xhdpi,hdpi,mdpi的资源,如果要切一份就使用xhdpi
栅格系统的最小单位是8dp,一切距离、尺寸都应该是8dp的整数倍,所有可操作元素最小点击区域尺寸为48dp X 48dp。以下是一些常见的尺寸与距离:
有时候在自定义view,draw的时候单位往往是px,要做一个dpi的转换,需要通过该类获取屏幕的信息,如:屏幕密度,宽高等。
a.尽量使用线性布局(LinearLayout)和相对布局(RelateLayout),尽量不使用绝对布局(AbsoluteLayout)和帧布局(FrameLayout)。
b.尽量使用wrap_content、mach_parent让view自适应或最大化,尽量不要写宽高的值。
c.使用线下布局的百分比weight权重时,要把能伸缩方向的宽度写成“0dp“,如果写成wrap_coent会使布局效果不佳等问题。
d.尽量使用android的Shape自定义view背景,这样会随之自适应。
e.ImageView的ScaleType有几种方式:matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY;尽量使用fitCenter按比例扩大至view宽度,能取得较好适配和显示效果。(更多请参考: Android中的ImageView配适 )
f.获取屏幕分辨率信息,进行动态适配。(参考第三大点)
a.把屏幕设置成单一的横屏或竖屏:
b.根据横竖屏加载不同布局(android: screenOrientation="sensor")
通过this.getResources().getConfiguration().orientation来判断当前是横屏还是竖屏,然后在onCreate方法中加载不同的布局
采用第二种方式要注意的有两点
布局问题:
需要在res目录先建立layout-land和layout-port目录相应的xml文件名字相同,然后在两个文件夹下创建相同名字的两套xml,系统就会根据不同的屏幕来进行自动寻找。
切换时activity的生命周期:
activity生命周期在切换横竖屏会有一些有趣的变化
a.不设置activity的android:configChanges时,切换横屏,activity的生命周期会重新调用一次,但是切换竖屏时,生命周期会重新调用两次。
b.当设置activity的android:configChanges=“orientation”时,切换横竖屏都会重新调用各生命周期一次。
c.当设置activity的android:configChanges=“orientation|keyboardHidden”(大于api13时,需要设为“orientation|screenSize”)时,切换横竖屏不会重新调用各生命周期,只会调用onConfigurationChanged方法。
一般设为b或者c
平板应用的特性:
对于大屏幕的平板8英寸以上(参考ipad mini,现在很多高端手机都是5-6英寸了,8英寸以上视为平板吧),基与平板应用的特性,平板应用开发一般采取如下两种策略
1)兼容模式
采用单activity(或者尽量少activity)+多fragment的结构开发应用,在layout资源文件中创建三套布局:手机布局、平板横屏布局、平板竖屏布局。
优点:
只需要维护一个app
缺点:
设计及实现的难度变大,更复杂,有时候需要采取折衷方案
手机apk上由于含有平板的大分辨率图片资源(设计上可以减少内置资源)
2)开发另一套只适配平板的app
优点:
与手机app分离独立。不会因为要兼容而采用一些折衷方案,影响其性能、内存
设计和实现更加自由
缺点:
需要维护两套app
目前谷歌推荐第一种方案,但是国内很多应用是采取第二种方案。
可以通过判断sdk的版本(Build.VERSION.SDK_INT),来为能够使用的版本进行个性化设置
例如:沉浸式状态栏配适
在Android系统4.4以前,状态栏的背景色和字体颜色都是不能改变的。但是4.4以后Google增加了改变状态栏背景透明的方法。可以通过判断sdk的版本,来为能够使用的版本进行个性化设置:
沉浸式状态栏是Android在5.0中引入的,在5.0之前是没有的,并且在Android6.0中沉浸式状态栏的使用方法和5.0不一样,因此需要做到版本兼容,针对于不同的Android进行适配,同样也是通过判断Build.VERSION.SDK_INT来区分版本,进行个性化配适
沉浸式状态栏的实现方式有好几种,更多请参考 沉浸式状态栏的实现
原则:内置图片资源不应该出现文字(如果出现文字需要具备)、所有的文字需要放在res资源目录特定语言目录下。
D. android 屏幕适配
@[TOC](文章目录)
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
# 前言
<font color=#999AAA >使用工具Android studio,利用values文件下dimens.xml界面适配安卓屏幕</font>
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
<font color=#999AAA >提示:以下是本篇文章正文内容,下面案例可供参考
# 一、概念
1.屏幕分辨率单位是px,例如Android手机常见的分辨率:320x480px、480x800px、720x1280px、1080x1920px。
2.手机屏幕的密度:每英寸的像素点数,单位是dpi。
| 密度类型 |代表的分辨率(px)| 屏幕像素密度(dpi) | 1dp转换为px |
|:--------|:--------|:--------|:--------|
| 低密度(ldpi) |240x320|120|0.75|
| 中密度(mdpi) |320x480|160|1|
| 高密度(hdpi)|480x800|240| 1.5|
| 超高密度(xhdpi)|720x1280|320|2|
| 超超高密度(xxhdpi) |1080x1920|480|3|
3.由于android的机型屏幕大小品类太多了,有一些是不标准的,这时我们就需要单独去获取屏幕的分辨率和密度了。
# 二、获取屏幕的分辨率和密度
```java
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
float density = displayMetrics.density;
int densityDpi = displayMetrics.densityDpi;
int width = displayMetrics.widthPixels;
int height = displayMetrics.heightPixels;
Log.e("123","密度:"+density+"---"+densityDpi);
Log.e("123","屏幕分辨率:"+width+"x"+height);
Log.e("123","安卓系统:"+android.os.Build.VERSION.RELEASE);
Log.e("123","手表型号:"+android.os.Build.PRODUCT);
```
# 三、SmallestWidth适配
**smallestWidth适配,或者叫sw限定符适配。指的是Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。**
**sw计算公式:sw = 屏幕宽度 / (dpi/160) 注:160是默认的**
**例如:屏幕宽度为1080px、480dpi 的sw = 1080/(480/160)**
# 四、生成 dimens 文件
1、 首先在 res 目录下新建各种尺寸的 values 文件 。文件名为:values-sw(你要适配屏幕的sw值)dp。
例如:

注意:values文件下也生成 dimens文件
**生成dimens值工具类**
1、先生成标准的值。//value = (i + 1) * 1;
2、再用生成其他的值。 //value = (i + 1) * 需要生成的sw值/标准的sw值;
例如:value = (i + 1) * 160 / 320;
```java
public static void genDimen() {
StringBuilder stringBuilder = new StringBuilder();
try {
double value;
for (int i = 0; i < 500; i++) {
//value = (i + 1) * 1; //这里控制对应转换的值,如果是标准尺寸就一对一转换
//value = (i + 1) * 需要生成的sw值/标准的sw值; //这里控制对应转换的值
value = (i + 1) * 1
//value = (i + 1) * 160 / 320;
value = Math.round(value * 100) / 100;
//dp可改成sp
stringBuilder.append("<dimen name=\"size_" + (i + 1) + "\">" + value + "dp</dimen>\r\n");
}
if (stringBuilder.length() > 4000) {
for (int i = 0; i < stringBuilder.length(); i += 4000) {
if (i + 4000 < stringBuilder.length())
Log.e("123", stringBuilder.substring(i, i + 4000));
else
Log.e("123", stringBuilder.substring(i, stringBuilder.length()));
}
} else {
Log.e("123", stringBuilder.toString());
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
```
示例:(我这是以sw320为适配的标准的,你们可改自己的标准)
1、sw320的样例
```java
<resources>
<dimen name="dimen_1">1.0dp</dimen>
<dimen name="dimen_2">2.0dp</dimen>
<dimen name="dimen_3">3.0dp</dimen>
<dimen name="dimen_4">4.0dp</dimen>
<dimen name="dimen_5">5.0dp</dimen>
<dimen name="dimen_6">6.0dp</dimen>
<dimen name="dimen_7">7.0dp</dimen>
<dimen name="dimen_8">8.0dp</dimen>
<dimen name="dimen_9">9.0dp</dimen>
<dimen name="dimen_10">10.0dp</dimen>
<dimen name="size_1">1.0sp</dimen>
<dimen name="size_2">2.0sp</dimen>
<dimen name="size_3">3.0sp</dimen>
<dimen name="size_4">4.0sp</dimen>
<dimen name="size_5">5.0sp</dimen>
<dimen name="size_6">6.0sp</dimen>
<dimen name="size_7">7.0sp</dimen>
<dimen name="size_8">8.0sp</dimen>
<dimen name="size_9">9.0sp</dimen>
<dimen name="size_10">10.0sp</dimen>
</resources>
```
2、sw160的样例
```java
<resources>
<dimen name="dimen_1">0.0dp</dimen>
<dimen name="dimen_2">1.0dp</dimen>
<dimen name="dimen_3">1.0dp</dimen>
<dimen name="dimen_4">2.0dp</dimen>
<dimen name="dimen_5">2.0dp</dimen>
<dimen name="dimen_6">3.0dp</dimen>
<dimen name="dimen_7">3.0dp</dimen>
<dimen name="dimen_8">4.0dp</dimen>
<dimen name="dimen_9">4.0dp</dimen>
<dimen name="dimen_10">5.0dp</dimen>
<dimen name="size_1">0.0sp</dimen>
<dimen name="size_2">1.0sp</dimen>
<dimen name="size_3">1.0sp</dimen>
<dimen name="size_4">2.0sp</dimen>
<dimen name="size_5">2.0sp</dimen>
<dimen name="size_6">3.0sp</dimen>
<dimen name="size_7">3.0sp</dimen>
<dimen name="size_8">4.0sp</dimen>
<dimen name="size_9">4.0sp</dimen>
<dimen name="size_10">5.0sp</dimen>
</resources>
```
3、xml界面控件使用样例
```java
<TextView
android:layout_width="@dimen/dimen_30"
android:layout_height="@dimen/dimen_30"
android:textSize="@dimen/size_20"
android:layout_margin="@dimen/dimen_10"
android:padding="@dimen/dimen_10">
```
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
# 总结
<font color=#999999 >提示:这里对文章进行总结:
如果你的app需要适配dpi较低的屏幕,最好以最小dpi的sw为适配的标准。
E. Android机型适配总结
分辨率对应DPI
ldpi QVGA (240×320)
mdpi HVGA (320×480)
hdpi WVGA (480×800),FWVGA (480×854)
xhdpi 720P(1280*720)
xxhdpi 1080p(1920*1080 )
xxxhdpi 4K(3840×2160)
机型适配方面常规处理方法:
1、开发之前UI给出不同尺寸标准的多套素材,一般情况下给出:hdpi、xhdpi、xxxhdpi 三种尺寸类型的素材。
2、特殊类型图片使用Android Studio内置draw9path工具进行制作,例如聊天界面中内容背景图片。
3、布局编写时尽量使用 Linearlayout 与 RelativeLayout,LinearLayout内部可以使用weight(权重)属性将子控件的尺寸按比例进行设置。RelativeLayout 内部可以使用layout_align...(相对于xxx)属性将子控件的尺寸相对于父控件或相对于其他子控件进行设置。
4、设置尺寸的时候长度单位 布局使用 dp 字符使用 sp。 其实字体大小的尺寸使用 dp 也可以,但是sp的情况下 用户使用系统设置字体大小的时候可以改变控件中字体的大小,但是使用dp设置的字体就不会产生变化。
5、针对每一个屏幕的尺寸生成一套px与dp的转换方案,详情见博客: Android机型适配方案 。
6、google推出了一个百分比布局库,可以使用百分比的方式进行布局尺寸的设置,详情见博客: Android百分比布局库(percent-support-lib)解析与扩展
7、利用自定义View的方式去解决,其实原理也是,在绘制View的时候,获取屏幕的尺寸然后按照一定的比例去设置控件的尺寸
还有一些琐碎知识点需要了解并记住:
1. px (pixels)像素 :
一个像素通常被视为图像的最小的完整采样,这个用的比较多,特别是web开发,页面基本都是使用像素作为单位的.
2.dp:
这个是最常用但也最难理解的尺寸单位。它与“像素密度”密切相关,所以首先我们解释一下什么是像素密度。假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横向)或320/2=160dpi(纵向),160dpi就是这部手机的像素密度,像素密度的单位dpi是Dots Per Inch的缩写,即每英寸像素数量。横向和纵向的这个值都是相同的,原因是大部分手机屏幕使用正方形的像素点。
不同的手机/平板可能具有不同的像素密度,例如同为4寸手机,有480x320分辨率的也有800x480分辨率的,前者的像素密度就比较低。Android系统定义了四种像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它们对应的dp到px的系数分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。例如界面上有一个长度为“80dp”的图片,那么它在240dpi的手机上实际显示为80x1.5=120px,在320dpi的手机上实际显示为80x2=160px。如果你拿这两部手机放在一起对比,会发现这个图片的物理尺寸“差不多”。
3.dip:
与dp完全相同,只是名字不同而已。在早期的Android版本里多使用dip,后来为了与sp统一就建议使用dp这个名字了。
4.sp:
与缩放无关的抽象像素(Scale-independent Pixel)。sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。
还有一些详细的情况需要了解,都在这个博客里: 点击进入
F. Android程序接听及挂断电话,适配所有Android版本
接听来电
拒接来电:
其中文中的接听电话android6-android7的处理方案是利用了监听通知使用权,所以还要新建一个NotificationListenerService的子类,叫ListenerService,需要在AndroidManifests中配置
另外需要提示用户打开通知使用权才可以正常使用
已测试通过了android6-android9各种机型,注意拒接来电在android9以上才有官方支持,所以需要设置compileSdkVersion=28。
需要的权限为:Manifest.permission.CALL_PHONE,Manifest.permission.READ_PHONE_STATE
8.0以上需要Manifest.permission.ANSWER_PHONE_CALLS,Manifest.permission.READ_CALL_LOG。
还不行的请注意三点:
1:检查权限是否都申请及在manifests里注册了
2:compileSdkVersion是否为28
3:android6到android7的手机的接听来电要依赖通知使用权,所以通知使用权打开才可以正常工作。
G. android 屏幕适配基础知识
最近参考 今日头条算法 ,优化了项目的屏幕适配策略。下面是适配过程中的一些心得,部分内容来源于网络。
举个例子:屏幕分辨率为:1920*1080,屏幕尺寸为5吋的话,那么dpi为440。
dp就是密度自适应的像素。1dp表示 在dpi为160的设备上的一颗像素
px与dp的换算公式px = dp * (dpi / 160),很显然,由于相同分辨率但不同屏幕大小的设备dpi是不同的,导致px和dp的基本不存在一个固定的换算关系,为了方便屏幕适配,Android设置了6个通用的密度,换算px与dp时采取通用密度计算,而非设备实际的密度。
以下为6种通用密度,以及其最小的分辨率
得到上面通用密度之后,我们换算dp与px多了一种简便方式。Android系统用mdpi(160dpi)作为基准,此时1px = 1dp,又有px = dp * (dpi / 160),所以我们可以很容易的得到以下换算:
sp在dp的基础上引入了scaleFactor变量,一般用于字号,可在系统设置里调大。
同一张图片放到以上4个分辨率类型的文件夹里,在页面上呈现的效果如下
实际呈现的算法为: 图片尺寸 * 系统density / 文件夹 density
因为图片尺寸、系统density都是固定的,因此图片最终尺寸表现为: 图片放的位置越"low",呈现的尺寸越大
比如 图片宽度200px,系统 density =3,则图片宽度
下面是详细的解释
我们知道,不管在布局文件中填写的是什么单位,它最后都会被系统转化为 px。系统的转换算法如下:
可以看到 px = dp*density 。
横向适配的最终目的:让100dp的宽度,在各个机型上,在屏幕上所占的 比例相同 。
其核心算法是px = dp* density。通过修改density这个变量,我们可以让px和画布标注的px值一致,达到适配的效果。
美工同学提供的画布宽度为 750px(iphone6) ,开发中,我们对这些px标注 除2 得到dp值进行使用。
那么density如何求出呢? 根据系统算法px = dp*density,反推 density =px/dp
拿横向适配画布, density对于不同分辨率的手机修改后如下:
375是我们拿UI画布横向分辨率750/2得出。
H. Android刘海屏适配
刘海屏幕的适配,在全面屏设置下,顶部有刘海的区域,有的会导致刘海把标题栏等内容遮盖如下图,这是美团的统一版本在小米和华为上的适配,可以看到小米的未遮挡内容,但在华为设备上,明显刘海遮住了一部分内容,目前手里只有这两台设备,所以没有更多机型测试,不过根据上线APP反馈,目前这个方法可以满足。此博文为笔记内容,所以内容不多
如果统一留出固定的高度,会在不同设备上造成不同的效果,现在使用动态计算顶部状态栏高度然后预留高度,防止被异形屏遮挡情况,使用之后的效果如下图
使用方法,在布局上设置一个占位条,需要适配的引用进来,因为有些布局是不用设置的