我们开发的程序将会在各种设备上运行,这些设备会有不同的密度和不同的屏幕尺寸,可以从以下几个方面优化:
一、支持多屏幕多像素
1、以dp为计量单位。1dp相当于分辨率为160dpi(点每英寸)的屏幕上的一个点。dp转化为屏幕像素点: px=dp*dpi/160;这样在不同屏幕尺寸下的界面效果不会相差很大。
2、使用Fragment
3、避免使用觉得的宽度和高度
4、提供替代资源
1)提供替代Layout:横竖屏、每种屏幕尺寸设计不同的Layout,如 layout-sw600dp-port文件夹下的布局文件就是7英寸纵向的 时候会加载的布局文件。
2)提供替代位图:为5种屏幕密度(ldpi、mdpi、hdpi、xhdpi、xxhdpi)都提供位图,防止图片失真。也可以使用矢量图。
二、支持多版本系统
在AndroidManifest.xml中有如下代码:
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
其中,minSdkVersion表示程序运行需要的最低版本,如果设备低于此版本则无法运行;targetSdkVersion表示设计、编译和测试时所用的API级别,通常会将设为targetSdkVersion最新的级别。
常量类Build中定义了每个版本的唯一编码,可以根据这个编码来实现不同版本上的不同展示效果。
如,在API大于等于11的情况下使用actionBar,而低于11的时候使用菜单。
if(Build.VERSION.SDK_INT>=11){
ActionBar ab=getActionBar();
//....
}else{
textView.setText("Press Menu Button to display menu");
}
可以使用Android Support Library支持低版本系统。
我们在项目中经常会导入一个库:android.support.v4.app.*;这里的v4是表示API的最低需要级别为4,v7就表示最低需要级别为7。
我们经常使用到的android.support.v4.app.Fragment就来自于这个支持库,如果使用android.app.Fragment的话,则最少要API>=11,这样10的就无法使用Fragment。而使用android.support.v4.app.Fragment就不会有这个问题。
三、通过锚定适应屏幕方向
1、锚定控件,即以屏幕四边的相对位置来定义控件的位置。这样,控件不会因为屏幕尺寸变化而消失。在布局文件中,推荐使用RelativeLayout,它比LinearLayout更容易实现各种效果,比如,很多效果LinearLayout要嵌套多层才能实现,而层数越多,在界面绘制的时候消耗的资源也越多。
2、定义替代Layout