经常困扰Android开发者的一个问题就是UI的自适应性,Android设备太多,屏幕大小五花八门(哎,还是iOS省心)
一、横竖屏切换处理
1)不予处理
2)禁止转屏
a、简单又霸道,免得切来切去麻烦死了,直接规定只能横屏或竖屏,省心又安心。
b、设置方法
通过在AndroidManifest.xml中设置activity中的android:screenOrientation属性值来实现。
固定竖屏: android:screenOrientation="portrait"
固定横屏:android:screenOrientation="landscape",为横屏显示。
也可以代码设置:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)
3)允许切屏,但是Activity不重启
a、默认Android设备切屏时候Activity会销毁重启,重新执行OnCreate函数如果不想让Activity重启则可以对Acitivity属性进行设置
b、设置方法
AndroidManifest.xml中对该Activity做如下设置:
android:configChanges="keyboardHidden|orientation|screenSize"
则在切屏是Acitivity不重启,仅调用 onConfigurationChanged(Configuration newConfig)函数,通过 newConfig.orientation可以判断当前屏幕方向,进而进行相关的操作。
4)切屏自适应
a、获得当前是横屏还是竖屏
可以通过getWith函数获得屏幕的长和宽,比较大小从而得出当前的状态,横屏还是竖屏,也可以通过getConfiguration()来判断,如下所示。
public class BaseUtil {
public static boolean isTabletDevice(Context context) {//判断是不是平板
return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
public static boolean isScreenOriatationPortrait(Context context) {//判断横竖屏
return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
}
}
b、横竖屏分别布局,在res文件夹下建立layout-land(横屏),layout-port(竖屏)两个文件夹,系统启动时默认根据当前屏幕状态加载相应的布局。
c、切屏时保存当前信息
其实Android系统的UI控件,如EdixtText,都有自己保存当前状态的功能(Google大大牛牛哒),onSaveInstanceSate()和onRestoreInstanceState()会对UI状态进行保存和恢复,如果需要保存其他数据,Android为我们提供了onRetainNonConfigurationInstance()方法来暂时保存数据。
二、不同尺寸屏幕自适应处理
1)基本概念
2)通过限定符
Android项目res文件夹下建立多个drawable文件夹,分别对应不同的dpi如:
-
drawable-ldpi (dpi=120, density=0.75)
-
drawable-mdpi (dpi=160, density=1)
-
drawable-hdpi (dpi=240, density=1.5)
-
drawable-xhdpi (dpi=320, density=2)
-
drawable-xxhdpi (dpi=480, density=3)
Android SDK会自动屏幕尺寸选择对应的资源文件进行渲染,如SDK检测到你手机dpi是160的话会优先到drawable-mdpi文件夹下找对应的图片资源,注意只是优先,假设你手机dpi是160,但是你只在xhpdi文件夹下有对应的图片资源文件,程序一样可以正常运行。所以理论上来说只需要提供一种规格的图片资源就ok了,如果只提供ldpi规格的图片,对于大分辨率的手机如果把图片放大就会不清晰,所以需要提供一套你需要支持的最大dpi的图片,这样即使用户的手机分辨率很小,这样图片缩小依然很清晰。
使用宽度限定符
3) 使用尺寸限定符
4)获得当前屏幕长度和宽度,动态设置UI
Display display = this.getWindowManager().getDefaultDisplay();
width = display.getWidth();
height=display.getHeight();
getWindowManager().getDefaultDisplay().getMetrics(displayMertrcs);
5) 判断是不是平板
public class BaseUtil {
public static boolean isTabletDevice(Context context) {//判断是不是平板
return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_LARGE;
}
}
