前言:
以前做feature phone的朋友,特别是MMI的,对各公司出的分辨率适配,估计都叫烦,以为做智能机开发了,算好点了,可是,现在又涉及到各分辨率(主流)的适配了。
目前,Android主流分辨率有:
1. Density 为 1.5的有:480x800, 480x854, 540x960;
2. Density 为 2.0的有:1280x720, 1280x800;
特别的:对于Android OS 4.0以上的来说,有些设备厂商,为了节省硬件成本,使用了系统自带的虚拟键盘,而去掉了物理键盘(返回键,Home键,菜单键),而虚拟键盘,会占用一定的高度,这对于Android App开发来说,都需要在应用第一个界面开始时,做一些工作,来确保显示给用户时,能够正常显示,而不会出现控件,界面偏差,或者图片的失帧。
而iOS设备,目前主流的是:
iPhone4/4S, iTouch4, iPhone5, iTouch5;
其中,4,4S的分辨率,都是640x960,而到了5的分辨率,就变成了1136x640,同样,存在着分辨率适配的问题。
适配:
1. iOS
苹果的分辨率较少,就两种,适配起来,也比较简单,咱们只需要在需要动态调整坐标,大小的控件所在处之前,判断一下当前的self.view的高度就行:
if(self.view.frame.size.height == 460){
// iPhone4/4S, iTouch4
} else {
// iPhone5, iTouch5
}
为什么判断高度为460,而不是480?
这里有两点需要说明的,对于刚开始学习iOS开发的朋友,肯定对这里会有疑惑:
1.因为在模拟器上,它是320x480,是以像素点来计算,而到了设备640x960上,变成了视网膜屏,是4个像素点等于模拟器上1个像素点,所以,咱们只需要按照实际的像素点来计算就行;
2.默认情况下,在640x960的设备上,系统状态栏是需要占用20个像素点,所以,self.view的高度就是460。
2. Android
Android的分辨率太多了,不过,值得庆幸一点的是,现在,使用320x480,密度值为1.0的手机,几乎没有了,有也不是主流,所以,大多数产品,或公司策略在开始时,就不会要求去适配这块,而主要适配的,就是我开头所说的那些。要怎么做?废话说这么多!好吧,咱们开始啦,这里只说我个人比较喜欢用的方法,如果有好的方法,大家可以告诉我,咱们一起研究,
1. 设置一个基准屏幕分辨率,及对应的密度值;这里我是以480x800,密度值为1.5来定为hdpi base,而密度值为2.0的,则定1280x720的xhdpi为base,好处么?其它相同密度值的分辨率,都比这个要大点,所以,变大了调整布局肯定是比变小的调整要好的。
2. 在第一个activity的onCreate中,获取当前系统的分辨率,密度值,保存到静态类中,供全局使用:
private void getSystemPixelsAndDensity(){ DisplayMetrics dm = getResources().getDisplayMetrics(); CommonData.mCurWidthPixels = dm.widthPixels; CommonData.mCurHeightPixels = dm.heightPixels; CommonData.mCurDensity = dm.density; Log.d(TAG, "CommonData.mCurWidthPixels = " + CommonData.mCurWidthPixels + ", CommonData.mCurHeightPixels = " + CommonData.mCurHeightPixels + ", CommonData.mCurDensity = " + CommonData.mCurDensity); }
然后,在需要调整的地方,判断一下,并设置控件的LayoutParams即可:
private void resizeBanner(){ // 调整 Banner高度,以及PageControl的margin_top RelativeLayout layout = (RelativeLayout)rootView.findViewWithTag("bannerbar"); PageControlView page = (PageControlView)rootView.findViewWithTag("page_control"); LayoutParams lp = layout.getLayoutParams(); if(CommonData.mCurDensity == BASE_LCD_DENSITY){ if(CommonData.mCurHeightPixels != BASE_LCD_HEIGHT || CommonData.mCurWidthPixels != BASE_LCD_WIDTH){ float scale = (float)CommonData.mCurHeightPixels / (float)BASE_LCD_HEIGHT; lp.height *= scale; layout.setLayoutParams(lp); int pageMarginTop = (int) (BASE_BANNER_PAGE_MARGIN_TOP * BASE_LCD_DENSITY * scale); lp = (ViewGroup.LayoutParams) page.getLayoutParams(); ((MarginLayoutParams) lp).setMargins(0, pageMarginTop, 0, 0); page.setLayoutParams(lp); } }else if(CommonData.mCurDensity == BASE_XHDIP_LCD_DENSITY){ if(CommonData.mCurHeightPixels != BASE_XHDIP_LCD_HEIGHT || CommonData.mCurWidthPixels != BASE_XHDIP_LCD_WIDTH){ float scale = (float)CommonData.mCurHeightPixels / (float)BASE_XHDIP_LCD_HEIGHT; lp.height *= scale; layout.setLayoutParams(lp); int pageMarginTop = (int) (BASE_XHDIP_BANNER_PAGE_MARGIN_TOP * BASE_XHDIP_LCD_DENSITY * scale); lp = (ViewGroup.LayoutParams) page.getLayoutParams(); ((MarginLayoutParams) lp).setMargins(0, pageMarginTop, 0, 0); page.setLayoutParams(lp); } } }
上述代码,是以高度来调整宽度,根据需求不同,调整的方式也不同。比如,将一张图片全屏,就要考虑,图片原始的宽高比,来比例来缩放到屏幕的宽和高上,而不能失帧变形。