前言:
以前做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); } } }
上述代碼,是以高度來調整寬度,根據需求不同,調整的方式也不同。比如,將一張圖片全屏,就要考慮,圖片原始的寬高比,來比例來縮放到屏幕的寬和高上,而不能失幀變形。