现在的位置: 首页 > 综合 > 正文

Android与iOS多分辨率适配

2018年03月31日 ⁄ 综合 ⁄ 共 3043字 ⁄ 字号 评论关闭

前言:

以前做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);
			}
		}
	}

        上述代码,是以高度来调整宽度,根据需求不同,调整的方式也不同。比如,将一张图片全屏,就要考虑,图片原始的宽高比,来比例来缩放到屏幕的宽和高上,而不能失帧变形。

抱歉!评论已关闭.