android 不同型号的终端的UI适配--一种解决方法
生活随笔
收集整理的這篇文章主要介紹了
android 不同型号的终端的UI适配--一种解决方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
書寫一個管理類,在每一個activity加載的時候初始化這個管理類,然后在控件創建綁定的時候去調用方法適配每一個控件view。
import android.app.Activity; import android.app.Service; import android.content.pm.ActivityInfo; import android.util.DisplayMetrics; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import android.widget.TextView;/** * 屏幕管理類* @ClassName:DisplayManager * @Description: 管理屏幕相關的內容,包括寬度和高度像素值。需要在應用剛啟動時的第一個Activity中初始化下。* @author: * @date: * */ public class DisplayManager {/** 日志標簽 */private final static String LOG_TAG = "DisplayManager";/******************************參考的屏幕數據***************************//** 參照分辨率 */private static int miReferencedMaxWidth = 1280;/** 參照分辨率 */private static int miReferencedMaxHeight = 752;/** 參照屏幕密度,基于160dpi */private static float mfReferencedScreenDensity = 1.0f;/** 參照字體縮放比重 */private static float mfReferencedFontDensity = 1.0f;/******************************實際的屏幕數據***************************//** 寬度 */private static int miDisplayWidth = 1280;/** 高度 */private static int miDisplayHeight = 752;/** 屏幕密度 */private static float mfScreenDensity = 1.0f;/** 當前系統設置字體密度 */private static float mfFontDensity = 1.0f;/** 屏幕方向 */private static int miScreenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;/******************************計算的屏幕數據***************************//** 設備屏幕相對標準屏幕伸縮比例 */private static float mfDeviceScaleRate = 1.0f;/** 相對標準屏幕,此設備水平拉伸比率 */private static double mfWidthScaleRate = 1.0f;/** 相對標準屏幕,此設備高度拉伸比率 */private static double mfHeightScaleRate = 1.0f;/** 是否需要縮放 */private static boolean mbNeedScaleView = false;/** 字體大小類型 0:dp,1:px */private static int mTextSizeType = 0;/*** * 設置參考的樣張屏幕分辨率最大寬度和高度* @param iMaxWidth 樣張屏幕分辨率最大寬度* @param iMaxHeight 樣張屏幕分辨率最大高度*/public static void setReferenceMaxWidthHeight(int iMaxWidth, int iMaxHeight){LogEx.i(LOG_TAG, "iMaxWidth=" + iMaxWidth + ",iMaxHeight=" + iMaxHeight);miReferencedMaxWidth = iMaxWidth;miReferencedMaxHeight = iMaxHeight;}/*** * 設置參考的樣張屏幕密度* <p>* Description: 設置參考的樣張屏幕密度,默認值1.0* <p>* @param fDensity 參考屏幕密度*/public static void setReferencedDensity(float fDensity){LogEx.i(LOG_TAG, "fDensity=" + fDensity);mfReferencedScreenDensity = fDensity;}/*** * 設置參考的樣張字體比重* <p>* Description: 設置參考的樣張字體比重,默認值1.0* <p>* @param fDensity 參考字體比重*/public static void setReferencedScaledDensity(float fDensity){LogEx.i(LOG_TAG, "fDensity=" + fDensity);mfReferencedFontDensity = fDensity;}/*** * 獲取屏幕寬度(像素)* @date * @return 寬度像素值*/public static int getDisplayWidth(){return miDisplayWidth;}/*** * 獲取屏幕高度(像素)* * @return 高度像素值*/public static int getDisplayHeight(){return miDisplayHeight;}/*** * 根據px像素值換算成對應的dip值。* @param iPXValue 像素值* @return DIP對應的值*/public static int getDipValueByPX(int iPXValue){return iPXValue;}/*** 獲取換算后的寬度,以最大分辨率及樣張的圖上的參考寬度來換算。* @date * @param iReferenceWidth 參考寬度(像素)* @return 實際屏幕上的寬度(像素)*/public static int getRealWidth(int iReferenceWidth){if (miReferencedMaxWidth > 0){//此處計算去除屏幕密度,等同于傳入的值的單位是dpreturn (int) ((iReferenceWidth * miDisplayWidth) / (miReferencedMaxWidth/* * mfScreenDensity*/));}else{LogEx.w(LOG_TAG, "Invalid miReferencedMaxWidth=" + miReferencedMaxWidth);return 0;}}/*** 獲取換算后的高度, 以最大分辨率及樣張的圖上的參考高度來換算。* @date * @param iReferenceHeight 參考高度(像素)* @return 實際屏幕上的高度(像素)*/public static int getRealHeight(int iReferenceHeight){if (miReferencedMaxHeight > 0){//此處計算去除屏幕密度,等同于傳入的值的單位是dpreturn (int) ((iReferenceHeight * miDisplayHeight) / (miReferencedMaxHeight/* * mfScreenDensity*/));}else{LogEx.w(LOG_TAG, "Invalid miReferencedMaxHeight=" + miReferencedMaxHeight);return 0;}}/*** * 獲取屏幕方向* <p>* Description: 獲取屏幕方向* <p>* @return 屏幕方向*/public static int getScreenOrientation(){return miScreenOrientation;}/*** * 更新屏幕相關數據* <p>* Description: 更新屏幕分辨率、屏幕方向、密度等,每次屏幕參數發生變化,都需要調用更新下。* <p>* @param activity 活動窗口*/public static void updateDisplayInfo(Activity activity){if (null != activity){//獲取分辨率等信息DisplayMetrics dm = new DisplayMetrics();activity.getWindowManager().getDefaultDisplay().getMetrics(dm);//更新當前屏幕方向miScreenOrientation = activity.getResources().getConfiguration().orientation;LogEx.i(LOG_TAG, "miScreenOrientation=" + miScreenOrientation);updateDisplayInfo(dm);}}/*** * 更新屏幕相關數據* <p>* Description: 更新屏幕分辨率、屏幕方向、密度等,每次屏幕參數發生變化,都需要調用更新下。* <p>* @param Service 服務*/public static void updateDisplayInfo(Service service){if (null != service){//獲取分辨率等信息DisplayMetrics dm = service.getResources().getDisplayMetrics();//更新當前屏幕方向miScreenOrientation = service.getResources().getConfiguration().orientation;LogEx.i(LOG_TAG, "miScreenOrientation=" + miScreenOrientation);updateDisplayInfo(dm);}}/*** * 更新屏幕相關數據* <p>* Description: 更新屏幕分辨率、屏幕方向、密度等,每次屏幕參數發生變化,都需要調用更新下。* <p>* @param activity 活動窗口*/private static void updateDisplayInfo(DisplayMetrics dm){miDisplayWidth = dm.widthPixels;miDisplayHeight = dm.heightPixels;LogEx.i(LOG_TAG, "miDisplayWidth=" + miDisplayWidth + ",miDisplayHeight="+ miDisplayHeight);mfFontDensity = dm.scaledDensity;LogEx.i(LOG_TAG, "mfFontDensity=" + mfFontDensity);mfScreenDensity = dm.density;LogEx.i(LOG_TAG, "mfScreenDensity=" + mfScreenDensity);LogEx.i(LOG_TAG, "densityDpi=" + dm.densityDpi);mbNeedScaleView = false;//判斷是否需要縮放(寬、高、屏幕密度、字體密度)if (miDisplayWidth != miReferencedMaxWidth|| miDisplayHeight != miReferencedMaxHeight|| Math.abs(mfScreenDensity - mfReferencedScreenDensity) >= 0.001|| Math.abs(mfFontDensity - mfReferencedFontDensity) >= 0.001){mbNeedScaleView = true;}//寬度的縮放比例mfWidthScaleRate = 1.0f;if (miReferencedMaxWidth > 0){mfWidthScaleRate = 1.0 * miDisplayWidth/ (miReferencedMaxWidth * mfScreenDensity / mfReferencedScreenDensity);LogEx.i(LOG_TAG, "mfWidthScaleRate=" + mfWidthScaleRate);}//高度的縮放比例mfHeightScaleRate = 1.0f;if (miReferencedMaxHeight > 0){mfHeightScaleRate = 1.0 * miDisplayHeight/ (miReferencedMaxHeight * mfScreenDensity / mfReferencedScreenDensity);LogEx.i(LOG_TAG, "mfHeightScaleRate=" + mfHeightScaleRate);}//取較小者mfDeviceScaleRate = (float) (mfWidthScaleRate < mfHeightScaleRate? mfWidthScaleRate: mfHeightScaleRate);LogEx.i(LOG_TAG, "mfDeviceScaleRate=" + mfDeviceScaleRate);//縮放比例為1,則不需要進行比例縮放處理if (Math.abs(mfDeviceScaleRate - 1.0) <= 0.001){mbNeedScaleView = false;}LogEx.i(LOG_TAG, "mbNeedScaleView=" + mbNeedScaleView);}/*** * 根據當前設備與標準設備其高度和寬度的比例,選取最小比例(mfDeviceScaleRate)對view進行等比例縮放;* 其中修改的項涉及width,height,padding,margin,* 若控件是TextView 或其子類,還會對其字體大小進行縮放,* 若width,height使用的是 WRAP_CONTENT 或者 FILL_PARENT ,則width,height不會被縮放。* * @param view 需要進行縮放的的視圖*/public static void scaleView(View view){if (null != view){scaleView(view, mfDeviceScaleRate);}else{LogEx.w(LOG_TAG, "scaleView : view is null");}}/*** * 選取最小比例fRate對view進行等比例縮放;* 其中修改的項涉及width,height,padding,margin,* 若控件是TextView 或其子類,還會對其字體大小進行縮放,* 若width,height使用的是 WRAP_CONTENT 或者 FILL_PARENT ,則width,height不會被縮放。* @date * @param view 需要進行縮放的的視圖* @param fRate 縮放比例*/public static void scaleView(View view, float fRate){if (!mbNeedScaleView || view == null || fRate <= 0.001){return;}//對TextView的字體大小單獨處理if (view instanceof TextView){TextView txtView = (TextView) view;//默認dpfloat f = (float) (txtView.getTextSize() * fRate/** mfScreenDensity*// mfFontDensity);if (mTextSizeType == 1) //px{f = (float) (txtView.getTextSize() * fRate * mfScreenDensity / mfFontDensity);;}txtView.setTextSize(f);}ViewGroup.LayoutParams params = (ViewGroup.LayoutParams) view.getLayoutParams();if (null != params){//Width & Heightif (params.width != ViewGroup.LayoutParams.WRAP_CONTENT&& params.width != ViewGroup.LayoutParams.MATCH_PARENT){params.width = (int) (params.width * fRate + 0.5f);}if (params.height != ViewGroup.LayoutParams.WRAP_CONTENT&& params.height != ViewGroup.LayoutParams.MATCH_PARENT){params.height = (int) (params.height * fRate + 0.5f);}//Paddingview.setPadding((int) (view.getPaddingLeft() * fRate + 0.5f),(int) (view.getPaddingTop() * fRate + 0.5f),(int) (view.getPaddingRight() * fRate + 0.5f),(int) (view.getPaddingBottom() * fRate + 0.5f));}//MarginViewGroup.MarginLayoutParams params2 = (ViewGroup.MarginLayoutParams) view.getLayoutParams();if (params2 != null){params2.leftMargin *= fRate;params2.rightMargin *= fRate;params2.topMargin *= fRate;params2.bottomMargin *= fRate;}}/*** getScreenDensity* <p>* Description: 獲取屏幕密度* <p>* @return*/public static float getScreenDensity(){return mfScreenDensity;}public static double getWidthScaleRate(){return mfWidthScaleRate;}public static double getHeightScaleRate(){return mfHeightScaleRate;}/*** * 設置 字體大小類型 0:dp,1:px ,默認dp* @date * @author * @param iTextSizeType 0:dp,1:px */public static void setTextSizeType(int iTextSizeType){mTextSizeType = iTextSizeType;}/*** * 遍歷全部子控件進行布局適配* <p>* Description: 這里用一句話描述這個方法的作用* <p>* @param root*/public static void scaleViewGroup(ViewGroup root){for (int i = 0, n = root.getChildCount(); i < n; i++){View v = root.getChildAt(i);scaleView(v);if (v instanceof ViewGroup){scaleViewGroup((ViewGroup) v);}}} }使用方法: activity初始化:
DisplayManager.setReferenceMaxWidthHeight(480, 800); DisplayManager.updateDisplayInfo(this);控件的適配:?
DisplayManager.scaleView(mReplyList); DisplayManager.scaleView(mImgClose); DisplayManager.scaleView(mTxtCommentName); DisplayManager.scaleView(mTxtCommentTime); DisplayManager.scaleView(mTxtCommentTxt);?
?
總結
以上是生活随笔為你收集整理的android 不同型号的终端的UI适配--一种解决方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 音乐《读书郎》幼小衔接教案
- 下一篇: Tomcat servlet工作原理