現在的位置: 首頁 > 綜合 > 正文

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);
			}
		}
	}

        上述代碼,是以高度來調整寬度,根據需求不同,調整的方式也不同。比如,將一張圖片全屏,就要考慮,圖片原始的寬高比,來比例來縮放到屏幕的寬和高上,而不能失幀變形。

抱歉!評論已關閉.