Android屏幕配适、版本配适与多语言支持

1 阅读7分钟

屏幕配适

1. Drawable资源

image.png

目前主流的屏幕密度:240dpi (480 * 800px) , 320dpi (7201280px) , 480dpi(10801920px)现在新出的手机几乎全是全高清屏(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即可。

2. 设计的尺寸建议

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。以下是一些常见的尺寸与距离:

  • 顶部状态栏高度:24dp
  • Appbar最小高度:56dp
  • 底部导航栏高度:48dp
  • 悬浮按钮尺寸:56x56dp/40x40dp
  • 用户头像尺寸:64x64dp/40x40dp
  • 小图标点击区域:48x48dp
  • 侧边抽屉到屏幕右边的距离:56dp
  • 卡片间距:8dp
  • 分隔线上下留白:8dp
  • 大多元素的留白距离:16dp
  • 屏幕左右对齐基线:16dp
  • 文字左侧对齐基线:72dp

另外注意56dp这个数字,许多尺寸可变的控件,比如对话框、菜单等,宽度都可以按56的整数倍来设计

3. DisplayMetrics类

有时候在自定义view,draw的时候单位往往是px,要做一个dpi的转换,需要通过该类获取屏幕的信息,如:屏幕密度,宽高等。

DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
float density = displayMetrics.density; //屏幕密度
int densityDpi = displayMetrics.densityDpi;//屏幕密度dpi
int heightPixels = displayMetrics.heightPixels;//屏幕高度的像素        
int widthPixels = displayMetrics.widthPixels;//屏幕宽度的像素
float scaledDensity = displayMetrics.scaledDensity;//字体的放大系数
float xdpi = displayMetrics.xdpi;//宽度方向上的dpi
float ydpi = displayMetrics.ydpi;//高度方向上的dpi

4. 页面控件属性常用适配方法

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. 获取屏幕分辨率信息,进行动态适配。(参考第三大点)

5. 手机横竖屏切换兼容适配

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

6. 超大屏幕平板适配

平板应用的特性:

a. 多页面显示:由于屏幕大,空间会很足,如果是像手机只显示单一页面,会造成浪费,体验也不好,所以平板往往会显示手机上的多个子功能模块页面拼接在一起形成的大页面;

b. 内置图片需要较大的分辨率,也就是需要较大的内存,apk会比一般的手机版apk要大。

对于大屏幕的平板8英寸以上(参考ipad mini,现在很多高端手机都是5-6英寸了,8英寸以上视为平板吧),基与平板应用的特性,平板应用开发一般采取如下两种策略

1)兼容模式

采用单activity(或者尽量少activity)+多fragment的结构开发应用,在layout资源文件中创建三套布局:手机布局、平板横屏布局、平板竖屏布局。

优点缺点
只需要维护一个app1、设计及实现的难度变大,更复杂,有时候需要采取折中方案
2、手机apk上由于含有平板的大分辨率图片资源(设计上可以减少内置资源)

2)开发另一套只适配平板的app

优点:

  • 与手机app分离独立。不会因为要兼容而采用一些折衷方案,影响其性能、内存

  • 设计和实现更加自由 缺点:

  • 需要维护两套app

优点缺点
1、与手机app分离独立(不会因为要兼容而采用一些折衷方案,影响其性能、内存)需要维护两套app,增加研发及维护成本
2、设计和实现更加自由

目前谷歌推荐第一种方案,但是国内很多应用是采取第二种方案。

7. 版本SDK配适

可以通过判断sdk的版本(Build.VERSION.SDK_INT),来为能够使用的版本进行个性化设置

例如:沉浸式状态栏配适

在Android系统4.4以前,状态栏的背景色和字体颜色都是不能改变的。但是4.4以后Google增加了改变状态栏背景透明的方法。可以通过判断sdk的版本,来为能够使用的版本进行个性化设置:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {        
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

沉浸式状态栏是Android在5.0中引入的,在5.0之前是没有的,并且在Android6.0中沉浸式状态栏的使用方法和5.0不一样,因此需要做到版本兼容,针对于不同的Android进行适配,同样也是通过判断Build.VERSION.SDK_INT来区分版本,进行个性化配适

沉浸式状态栏的实现方式有好几种,更多请参考沉浸式状态栏的实现

8. 多语言支持

原则:内置图片资源不应该出现文字(如果出现文字需要具备)、所有的文字需要放在res资源目录特定语言目录下。

image.png