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适配--一种解决方法相关推荐
- android Run模式也会出现Waiting for debugger的解决方法
android Run模式也会出现"Waiting for debugger"的解决方法 出现"waiting for debugger"窗口是在debug模式 ...
- Android DialogFragment 遇到 java.lang.IllegalStateException: Fragment already added: 的解决方法
Android DialogFragment 遇到 java.lang.IllegalStateException: Fragment already added: 的解决方法 参考文章: (1)An ...
- Win2008 远程时提示“要登录到此远程计算机,您必须被授予允许通过终端登录登录的权限“的解决方法
Win2008 远程时提示"要登录到此远程计算机,您必须被授予允许通过终端登录登录的权限"的解决方法 参考文章: (1)Win2008 远程时提示"要登录到此远程计算机, ...
- 安装linux 系统报错:No DEFAULT or UI configuration directive found 解决方法
安装linux 系统报错:No DEFAULT or UI configuration directive found 解决方法 参考文章: (1)安装linux 系统报错:No DEFAULT or ...
- 安卓(android)建立项目时失败,出现Android Manifest.xml file missing几种解决方法?...
安卓(android)建立项目时失败,出现AndroidManifest.xml file missing几种解决方法? Eclipse新建项目,遇到这样的问题,注意如下: 1.文件名最好不要用中文. ...
- 台安变频器n2按键说明_台安变频器N2型号说明参数设置故障代码及故障解决方法...
原标题:台安变频器N2型号说明参数设置故障代码及故障解决方法 台安变频器N2额定电压.功率范围: 220V单/三相(0.4KW-22KW) 380V三相(0.75KW-22KW) 台安变频器N2特点: ...
- vue移动端html5页面根据屏幕适配的四种解决方法
最近做了两个关于h5页面对接公众号的项目,不得不提打开微信浏览器内置地图导航的功能确实有点恶心.下次想起来了的话,进行总结分享一下如何处理.在vue移动端h5页面当中,其中适配是经常会遇到的问题,这块 ...
- android删除打开方式,Android 打开方式选定后默认了改不回来?解决方法(三星s7为例)...
Android 打开方式选定后默认了改不回来?解决方法(三星s7为例) 刚刚在测试东西,打开一个gif图,然后我故意选择用支付宝打开,然后...支付宝当然不支持,我觉得第二次打开它应该还会问我,没想到 ...
- 安卓(android)建立项目时失败,出现Android Manifest.xml file missing几种解决方法?(总结中)
安卓(android)建立项目时失败,出现Android Manifest.xml file missing几种解决方法?(总结中) 参考文章: (1)安卓(android)建立项目时失败,出现And ...
最新文章
- php接收表单图片,如何在PHP中获取表单图片数据
- R语言处理Web数据
- Leet Code OJ 171. Excel Sheet Column Number [Difficulty: Easy]
- Pxe+Kickstart批量网络安装操作系统
- 一步步学习SPD2010--第四章节--创建和修改网页(9)--附上母版页
- 自学python免费教材-Python 有哪些入门学习方法和值得推荐的经典教材?
- Apache Tika源码研究(三)
- 简单算术表达式计算器
- signature=e7a4f21fa0bd38abc7e1a2451a8b7b26,进阶作业.ipynb
- XShell收费?5款免费且超赞的SSH工具,一个比一个香
- videojs-dynamic-watermark: video.js 视频添加文字水印
- 接近中心性(Closeness Centrality)、中介中心性(Betweenness Centrality)
- 二分算法:数的三次方根
- 开发者故事|朝九晚六大小周,我就是快乐的技术人
- 搭建Hadoop HA集群
- Docker常见错误
- 胆固醇PEG胆固醇,CLS-PEG-CLS
- ORA-03113: end-of-file on communication channel 解决方法
- 02论文分享与分析——基于ROS的移动机械臂底层规划及运动仿真
- 域名证书到期监控告知