做了半年android,遇到不少适配问题。
适配问题分两种,一种是各个版本间适配,一种是屏幕分辨率适配。
下面我们就针对这两种适配分别进行说明。作为一个菜鸟,很多理解可能不到位,请大家指正。
关于各个版本间适配:
android 在不断更新版本,但是由于一些原因,很大一部分android手机的系统并不能随之进行升级。所以当我们在做产品时,往往需要考虑手机端应用的向下兼容性。
我们可以使用高版本的sdk进行开发,在程序运行时,对版本进行判断,高版本使用高版本的API,低版本使用低版本的API
Android为我们提供了一个常量类Build,其中最主要是Build中的两个内部类VERSION和VERSION_CODES,
VERSION表示当前系统版本的信息,其中就包括SDK的版本信息,用于成员SDK_INT表示;
对于VERSION_CODES在SDK开发文档中时这样描述的,Enumeration of the currently known SDK version codes. These are the values that can be found in SDK
. Version numbers increment monotonically with each official platform release.
其成员就是一些从最早版本开始到当前运行的系统的一些版本号常量。
在我们自己开发应用过程中,常常使用如下的代码形式判断运行新API还是旧的API:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // 包含新API的代码块 } else { // 包含旧的API的代码块 }
但是上面的并不能完全解决问题,因为部分手机比如小米,会对现有的android系统进行改造,这也会造成一定的问题,要解决这种问题就需要
(1)相关更改文档(2)你的经验。
屏幕分辨率适配:
(1)使用webview
在使用webview时你需要确定是由前端同学使用css来控制字体大小还是由你来控制。
如果是你来控制,那么你可以通过以下函数进行判断并进行适配:
//适配不同密度问题
int screenDensity = getResources().getDisplayMetrics(). densityDpi ;
WebSettings.ZoomDensity zoomDensity = WebSettings.ZoomDensity. MEDIUM ;
switch (screenDensity){
case DisplayMetrics.DENSITY_LOW :
zoomDensity = WebSettings.ZoomDensity.CLOSE;
break ;
case DisplayMetrics.DENSITY_MEDIUM :
zoomDensity = WebSettings.ZoomDensity.MEDIUM;
break ;
case DisplayMetrics.DENSITY_HIGH :
zoomDensity = WebSettings.ZoomDensity.FAR;
break ;
}
newsInfoWebview .getSettings().setDefaultZoom(zoomDensity) ;
(2)不使用webview
1、分辨率无关
(1)使用密度无关的像素。
由于android设备屏幕尺寸和分辨率的不同,基于屏幕的DPI可以使仙童数量的像素对应不同设备上的不同物理尺寸。因此我们使用dp来指定尺寸使用sp来指定文本大小。
(2)像素密度的资源限定符
位图图像的缩放会导致图像细节的损失(缩小)和图像的模糊(放大)。巍峨使应用程序的界面清晰,最好为不同像素的密度提供多个图像资源。
res/drawable-ldpi 为120dip左右的尺寸提供低密度资源
res/drawable-mdpi 为160dip左右的尺寸提供中等密度的资源
res/drawable-tvdip 为213dip左右的尺寸提供中高密度资源;这是在API版本13中为了优化面向电视的应用程序而引入的。
res/deawable-hdpi 为240dpi左右的屏幕提供高密度资源
res/drawable-xhdpi 为320dpi左右的屏幕提供超高密度的资源
res/drawable-nodpi 用于不管宿主屏幕密度如何都不进行缩放的资源
2、为不同的屏幕大小提供支持和优化
没有必要为每个特定屏幕创建不同的绝对布局,最好使用下面的方法:
(1)保证所有的布局都能在一个合理的范围内进行缩放。(比如使用wrap_content或者fill_parent)
(2)创建一组范围重叠的备选布局来满足所有可能的屏幕配置。
android使用long和notlong修饰符来为正常的宽屏显示提供有化布局
res/layout-long-land/ //为宽屏横屏模式提供布局
res/layout-notlong-port/ //为非宽屏竖屏模式提供布局
更多的修饰符请查询官网文档。
3、创建可缩放的图形资源
(1)使用纯色
(2)使用<shape>标签制作形状
(3)使用NinePatch图像
.9.png图像左侧和上侧用于标识拉伸区域,右侧的下侧用于标识内容区域
4、灵活使用布局layout。
比如当需要三个按钮均匀的分布在一行时,我们可以使用linearlayout 并设置权重都为1。如果使用relativelayout就没有这么方便了。
如果上面让你觉得复杂,你可以让适配最小的屏幕,然后在所有的屏幕上都只显示那么大的部分,但是这样用户体验也相应的下降很多。