Window及UI缩放工具WindowUtil
packagecom.example.util;importjava.lang.reflect.Field;importandroid.app.Activity;importandroid.content.Context;importandroid.content.res.Configuration;importandroid.graphics.Rect;importandroid.util.DisplayMetrics;importandroid.util.TypedValue;importandroid.view.MotionEvent;importandroid.view.View;importandroid.view.ViewGroup;importandroid.view.ViewGroup.LayoutParams;importandroid.view.ViewGroup.MarginLayoutParams;importandroid.view.WindowManager;importandroid.widget.TextView;importcom.example.base.BaseApplication;/***Window及UI缩放工具**/@SuppressWarnings("unused")publicclassWindowUtil{/**UI设计的竖向高度,单位:px*/privatestaticfinalintUI_DESIGN_PORTRAIT_SIZE=1800;/**UI设计的横向高度,单位:px*/privatestaticfinalintUI_DESIGN_LANDSCAPE_SIZE=1080;/**自动缩放严格模式标志*/privatestaticfinalStringAUTO_RESIZE_STRICT_TAG="strict_mode";privatestaticfinalStringTAG=WindowUtil.class.getSimpleName();/**状态栏高度*/publicstaticintSTATUS_BAR_HEIGHT;/**缩放比例:水平*/publicstaticfloatSCALE_RATIO_HORIZONTAL;/**缩放比例:垂直*/publicstaticfloatSCALE_RATIO_VERTICAL;/**缩放比例*/publicstaticfloatSCALE_RATIO;/**屏幕旋转度*/publicstaticintWINDOW_ROTATION;privatestaticfloatSCREEN_DENSITY=1.0F;static{computeScaleRatio();computeScreenDensity();computeWindowRotation();}/***View按UI设计大小等比缩放,重新计算view的宽高、边距、文字大小**@paramview*@return*/publicstaticbooleanresize(Viewview){returnresize(view,SCALE_RATIO_HORIZONTAL,SCALE_RATIO);}/***递归重新计算View及其子View的宽高**@paramview*@return*/publicstaticbooleanresizeRecursively(Viewview){returnresizeRecursively(view,SCALE_RATIO,SCALE_RATIO);}/***重新计算view的宽高、边距、文本大小<br>*(其中宽高、文本大小按照相同缩放系数;内外边距水平方向按照水平比例系数,垂直方向按照垂直比例系数)**@paramview*@paramhorizontalRatio*@paramverticalRatio*@return*/publicstaticbooleanresize(Viewview,floathorizontalRatio,floatverticalRatio){if(view==null)returnfalse;/*重新计算宽高*/resizeWidthAndHeight(view,horizontalRatio,verticalRatio);/*重新计算内边距*/repadding(view);/*重新计算外边距*/remargin(view);/*重新计算文本大小*/if(viewinstanceofTextView)resizeText((TextView)view);returntrue;}/***重新计算view的宽高、边距、文本大小<br>*(严格模式)**@paramview*@paramhorizontalRatio*@paramverticalRatio*@return*/publicstaticbooleanresizeStrictly(Viewview,floathorizontalRatio,floatverticalRatio){if(view==null)returnfalse;/*重新计算宽高*/resizeWidthAndHeight(view,horizontalRatio,verticalRatio);/*重新计算内边距*/repadding(view,horizontalRatio,verticalRatio);/*重新计算外边距*/remargin(view,horizontalRatio,verticalRatio);/*重新计算文本大小*/if(viewinstanceofTextView)resizeText((TextView)view);returntrue;}/***重新计算view的宽高**@paramview*@paramhorizontalRatio*@paramverticalRatio*@return*/publicstaticbooleanresizeWidthAndHeight(Viewview,floathorizontalRatio,floatverticalRatio){if(view==null)returnfalse;Objecttag=view.getTag();if(taginstanceofString){StringtagString=(String)tag;if("ignoreSize".equals(tagString)){returntrue;}}LayoutParamsparams=view.getLayoutParams();if(params!=null){intwidth=params.width;intheight=params.height;if(params.width!=LayoutParams.MATCH_PARENT&¶ms.width!=LayoutParams.WRAP_CONTENT){width=(int)(width*horizontalRatio);if(width>1)params.width=width;}if(params.height!=LayoutParams.MATCH_PARENT&¶ms.height!=LayoutParams.WRAP_CONTENT){height=(int)(height*verticalRatio);if(height>1)params.height=height;}view.setLayoutParams(params);}returntrue;}/***重新计算view的Padding(非严格模式)**@paramview*@return*/publicstaticbooleanrepadding(Viewview){returnrepadding(view,SCALE_RATIO_HORIZONTAL,SCALE_RATIO_VERTICAL);}/***重新计算view的Padding(严格模式)**@paramview*@return*/publicstaticbooleanrepadding(Viewview,floathorizontalRatio,floatverticalRatio){if(view==null)returnfalse;view.setPadding((int)(view.getPaddingLeft()*horizontalRatio),(int)(view.getPaddingTop()*verticalRatio),(int)(view.getPaddingRight()*horizontalRatio),(int)(view.getPaddingBottom()*verticalRatio));returntrue;}/***重新计算view的Margin**@paramview*@return*/publicstaticvoidremargin(Viewview){remargin(view,SCALE_RATIO_HORIZONTAL,SCALE_RATIO_VERTICAL);}/***重新计算view的Margin**@paramview*@return*/publicstaticvoidremargin(Viewview,floathorizontalRatio,floatverticalRatio){MarginLayoutParamsmarginParams=null;try{marginParams=(MarginLayoutParams)view.getLayoutParams();}catch(ClassCastExceptione){return;}if(marginParams==null)return;intleft=(int)(marginParams.leftMargin*horizontalRatio);inttop=(int)(marginParams.topMargin*verticalRatio);intright=(int)(marginParams.rightMargin*horizontalRatio);intbottom=(int)(marginParams.bottomMargin*verticalRatio);marginParams.setMargins(left,top,right,bottom);view.setLayoutParams(marginParams);}/***重新计算TextView中文本的大小**@paramview*@return*/publicstaticbooleanresizeText(TextViewview){if(view==null)returnfalse;Objecttag=view.getTag();if(taginstanceofString){StringtagString=(String)tag;if("ignoreSize".equals(tagString)){returntrue;}}floattextSize=view.getTextSize();floatratio=SCALE_RATIO;view.setTextSize(TypedValue.COMPLEX_UNIT_PX,textSize*ratio);returntrue;}/***重新计算view的宽高(高度及宽度均按照水平缩放比例)**@paramview*@return*/publicstaticbooleanresizeWithHorizontalRatio(Viewview){returnresize(view,SCALE_RATIO_HORIZONTAL,SCALE_RATIO_HORIZONTAL);}/***重新计算view的宽高(高度按照垂直缩放比例,宽度按照水平缩放比例)**@paramview*@return*/publicstaticbooleanresizeWithRespectiveRatio(Viewview){returnresize(view,SCALE_RATIO_HORIZONTAL,SCALE_RATIO_VERTICAL);}publicstaticbooleanresizeChildrenRecursively(Viewview){if(view==null)returnfalse;if(!(viewinstanceofViewGroup))returntrue;ViewGroupgroup=((ViewGroup)view);intchildCount=group.getChildCount();Viewchild=null;for(inti=0;i<childCount;i++){child=group.getChildAt(i);resizeRecursively(child);}returntrue;}/***递归重新计算view的宽高(高度按照垂直缩放比例,宽度按照水平缩放比例)**@paramview*@return*/publicstaticbooleanresizeRecursivelyWithRespectiveRatio(Viewview){returnresizeRecursively(view,SCALE_RATIO_HORIZONTAL,SCALE_RATIO_VERTICAL);}/***递归重新计算view的宽高(高度和宽度均按照垂直缩放比例)**@paramview*@return*/publicstaticbooleanresizeRecursivelyWithVerticalRatio(Viewview){returnresizeRecursively(view,SCALE_RATIO_VERTICAL,SCALE_RATIO_VERTICAL);}/***递归重新计算view的宽高**@paramview*@paramhorizontalRatio*水平缩放比例*@paramverticalRatio*垂直缩放比例*@return*/privatestaticbooleanresizeRecursively(Viewview,floathorizontalRatio,floatverticalRatio){if(view==null)returnfalse;/*是否为严格模式*/booleanstrictMode=isStrictMode(view);/*如果当前View需要以严格模式缩放,自动将所有子孙View按照严格模式缩放*/if(strictMode)returnresizeStrictRecursively(view,SCALE_RATIO,SCALE_RATIO);resize(view,horizontalRatio,verticalRatio);if(!(viewinstanceofViewGroup))returntrue;ViewGroupgroup=((ViewGroup)view);intchildCount=group.getChildCount();Viewchild=null;for(inti=0;i<childCount;i++){child=group.getChildAt(i);resizeRecursively(child,horizontalRatio,verticalRatio);}returntrue;}/***递归重新计算view的宽高(严格模式)**@paramview*@paramhorizontalRatio*水平缩放比例*@paramverticalRatio*垂直缩放比例*@return*/privatestaticbooleanresizeStrictRecursively(Viewview,floathorizontalRatio,floatverticalRatio){if(view==null)returnfalse;resizeStrictly(view,horizontalRatio,verticalRatio);if(!(viewinstanceofViewGroup))returntrue;ViewGroupgroup=((ViewGroup)view);intchildCount=group.getChildCount();Viewchild=null;for(inti=0;i<childCount;i++){child=group.getChildAt(i);resizeStrictRecursively(child,horizontalRatio,verticalRatio);}returntrue;}/***是否为严格缩放模式**@paramview*@return*/privatestaticbooleanisStrictMode(Viewview){booleanstrictMode=false;Objecttag=view.getTag();if(tag==null)returnfalse;StringtagString=String.valueOf(tag);if(AUTO_RESIZE_STRICT_TAG.equals(tagString))strictMode=true;returnstrictMode;}/***根据屏幕宽度设置传入View的宽度**@paramview*@paramdesignedWidthResId*UI设计的高度资源ID*@return是否成功设置*/publicstaticbooleansetWidth(Viewview,intdesignedWidthResId){floatdesignedWidth=BaseApplication.getAppContext().getResources().getDimension(designedWidthResId);LayoutParamsparams=null;if(viewinstanceofViewGroup)params=view.getLayoutParams();if(params==null)params=((View)(view.getParent())).getLayoutParams();if(params==null)returnfalse;params.width=(int)(designedWidth*SCALE_RATIO_HORIZONTAL);view.setLayoutParams(params);returntrue;}/***根据屏幕宽度设置传入View的高度**@paramview*@paramdesignedHeightResId*UI设计的高度资源ID(以像素为单位)*@return是否成功设置*/publicstaticbooleansetHeight(Viewview,intdesignedHeightResId){if(view==null)returnfalse;floatdesignedHeight=BaseApplication.getAppContext().getResources().getDimension(designedHeightResId);LayoutParamsparams=null;if(viewinstanceofViewGroup)params=view.getLayoutParams();if(params==null)params=((View)(view.getParent())).getLayoutParams();if(params==null)returnfalse;params.height=(int)(designedHeight*SCALE_RATIO_VERTICAL);view.setLayoutParams(params);returntrue;}/***根据屏幕宽高设置传入View的宽高(按照宽度比例等比缩放)**@paramview*@paramdesignedWidthResId*UI设计的宽度资源ID(以像素为单位)*@paramdesignedHeightResId*UI设计的高度资源ID(以像素为单位)*@return是否成功设置*/publicstaticbooleansetSize(Viewview,intdesignedWidthResId,intdesignedHeightResId){floatdesignedWidth=BaseApplication.getAppContext().getResources().getDimension(designedWidthResId);floatdesignedHeight=BaseApplication.getAppContext().getResources().getDimension(designedHeightResId);LayoutParamsparams=null;if(viewinstanceofViewGroup)params=view.getLayoutParams();if(params==null)params=((View)(view.getParent())).getLayoutParams();if(params==null)returnfalse;params.width=(int)(designedWidth*SCALE_RATIO_HORIZONTAL);params.height=(int)(designedHeight*SCALE_RATIO_HORIZONTAL);view.setLayoutParams(params);returntrue;}/***根据屏幕宽度设置传入View的高度**@paramview*@paramheight*像素值**@return是否成功设置*/publicstaticbooleansetViewHeight(Viewview,intheight){LayoutParamsparams=null;if(viewinstanceofViewGroup)params=view.getLayoutParams();if(params==null)params=((View)(view.getParent())).getLayoutParams();if(params==null)returnfalse;params.height=height;view.setLayoutParams(params);returntrue;}/***设置视图宽高**@paramview*@paramwidth*@paramheight*@return*/publicstaticbooleansetViewSize(Viewview,intwidth,intheight){LayoutParamsparams=null;if(viewinstanceofViewGroup)params=view.getLayoutParams();if(params==null)params=((View)(view.getParent())).getLayoutParams();if(params==null)returnfalse;params.width=width;params.height=height;view.setLayoutParams(params);returntrue;}/***根据屏幕宽度设置传入TextView的文本大小**@paramview*@paramdesignedTextSizeResId*UI设计的文本大小资源ID(以像素为单位)*@return是否成功设置*/publicstaticbooleansetTextSize(TextViewview,intdesignedTextSizeResId){if(view==null)returnfalse;floatdesignedSize=BaseApplication.getAppContext().getResources().getDimension(designedTextSizeResId);floatsize=designedSize*SCALE_RATIO_HORIZONTAL;view.setTextSize(TypedValue.COMPLEX_UNIT_PX,size);returntrue;}/***设置View的外边距(像素值)**@paramview*@paramleft*@paramtop*@paramright*@parambottom*@return*/publicstaticbooleansetMargin(Viewview,intleft,inttop,intright,intbottom){MarginLayoutParamsmarginParams=null;try{marginParams=(MarginLayoutParams)view.getLayoutParams();}catch(ClassCastExceptione){returnfalse;}if(marginParams==null)returnfalse;marginParams.leftMargin=left;marginParams.topMargin=top;marginParams.rightMargin=right;marginParams.bottomMargin=bottom;view.setLayoutParams(marginParams);returntrue;}/***设置View的顶部外边距(像素值)**@paramview*@return*/publicstaticbooleansetMarginTop(Viewview,intmarginTop){MarginLayoutParamsmarginParams=null;try{marginParams=(MarginLayoutParams)view.getLayoutParams();}catch(ClassCastExceptione){returnfalse;}if(marginParams==null)returnfalse;marginParams.topMargin=marginTop;view.setLayoutParams(marginParams);returntrue;}/***设置View的左侧外边距(像素值)**@paramview*@return*/publicstaticbooleansetMarginLeft(Viewview,intmarginLeft){MarginLayoutParamsmarginParams=null;try{marginParams=(MarginLayoutParams)view.getLayoutParams();}catch(ClassCastExceptione){returnfalse;}if(marginParams==null)returnfalse;marginParams.leftMargin=marginLeft;view.setLayoutParams(marginParams);returntrue;}/***设置View的右侧外边距(像素值)**@paramview*@return*/publicstaticbooleansetMarginRight(Viewview,intmarginRight){MarginLayoutParamsmarginParams=null;try{marginParams=(MarginLayoutParams)view.getLayoutParams();}catch(ClassCastExceptione){returnfalse;}if(marginParams==null)returnfalse;marginParams.rightMargin=marginRight;view.setLayoutParams(marginParams);returntrue;}/***设置View的底部外边距(像素值)**@paramview*@return*/publicstaticbooleansetMarginBottom(Viewview,intmarginBottom){MarginLayoutParamsmarginParams=null;try{marginParams=(MarginLayoutParams)view.getLayoutParams();}catch(ClassCastExceptione){returnfalse;}if(marginParams==null)returnfalse;marginParams.bottomMargin=marginBottom;view.setLayoutParams(marginParams);returntrue;}/***设置View的内边距(像素值)**@paramview*@return*/publicstaticbooleansetPadding(Viewview,intleft,inttop,intright,intbottom){if(view==null)returnfalse;view.setPadding(left,top,right,bottom);returntrue;}/***设置View的顶部内边距(像素值)**@paramview*@return*/publicstaticbooleansetPaddingTop(Viewview,inttop){if(view==null)returnfalse;view.setPadding(view.getPaddingLeft(),top,view.getPaddingRight(),view.getPaddingBottom());returntrue;}/***设置View的左侧内边距(像素值)**@paramview*@return*/publicstaticbooleansetPaddingLeft(Viewview,intpaddingLeft){if(view==null)returnfalse;view.setPadding(paddingLeft,view.getPaddingTop(),view.getPaddingRight(),view.getPaddingBottom());returntrue;}/***设置View的右侧内边距(像素值)**@paramview*@return*/publicstaticbooleansetPaddingRight(Viewview,intpaddingRight){if(view==null)returnfalse;view.setPadding(view.getPaddingLeft(),view.getPaddingTop(),paddingRight,view.getPaddingBottom());returntrue;}/***设置View的底部内边距(像素值)**@paramview*@return*/publicstaticbooleansetPaddingBottom(Viewview,intpaddingBottom){if(view==null)returnfalse;view.setPadding(view.getPaddingLeft(),view.getPaddingTop(),view.getPaddingRight(),paddingBottom);returntrue;}/***获取View的宽度(像素值)**@paramview*@return*/publicstaticintgetWidth(Viewview){LayoutParamsparams=view.getLayoutParams();if(params==null)return0;returnparams.width;}/***获取View的高度(像素值)**@paramview*@return*/publicstaticintgetHeight(Viewview){LayoutParamsparams=view.getLayoutParams();if(params==null)return0;returnparams.height;}/***获取高度值(像素)(按照宽度比例缩放)**@return*/publicstaticfloatgetHorizontalScaledDimen(intheightResId){returnBaseApplication.getAppContext().getResources().getDimension(heightResId)*SCALE_RATIO_HORIZONTAL;}/***获取高度值(像素)(按照高度比例缩放)**@return*/publicstaticfloatgetVerticalScaledDimen(intheightResId){returnBaseApplication.getAppContext().getResources().getDimension(heightResId)*SCALE_RATIO_VERTICAL;}/***获取屏幕宽度(像素)**@return*/publicstaticintgetWindowWidth(){DisplayMetricsdm=newDisplayMetrics();dm=BaseApplication.getAppContext().getResources().getDisplayMetrics();if(dm==null)return0;returndm.widthPixels;}/***获取屏幕高度(像素)**@return*/publicstaticintgetWindowHeight(){DisplayMetricsdm=newDisplayMetrics();dm=BaseApplication.getAppContext().getResources().getDisplayMetrics();if(dm==null)return0;returndm.heightPixels;}/***计算资源文件中定义的尺寸像素值**@paramresId*dimen.xml中定义的资源ID*@return*/publicstaticfloatcomputeDimen(intresId){returnBaseApplication.getAppContext().getResources().getDimension(resId);}/***计算资源文件中定义的尺寸像素值,并乘以缩放系数ratio**@return*/publicstaticfloatcomputeScaledDimen(intresId,floatratio){returncomputeDimen(resId)*ratio;}/***重新计算尺寸像素值,并乘以缩放系数ratio**@return*/publicstaticintcomputeScaledSize(intsize){return(int)(size*SCALE_RATIO);}/***重新计算尺寸像素值,并乘以缩放系数ratio**@return*/publicstaticintcomputeScaledSize(floatsize){return(int)(size*SCALE_RATIO);}/***计算资源文件中定义的尺寸像素值,并乘以垂直缩放系数**@paramresId*UI设计的大小资源ID(以像素为单位)*@return*/publicstaticfloatcomputeScaledDimenByVerticalRatio(intresId){returncomputeScaledDimen(resId,SCALE_RATIO_VERTICAL);}/***计算资源文件中定义的尺寸像素值,并乘以水平缩放系数**@paramresId*UI设计的大小资源ID(以像素为单位)*@return*/publicstaticfloatcomputeScaledDimenByHorizontalRatio(intresId){returncomputeScaledDimen(resId,SCALE_RATIO_HORIZONTAL);}/***计算屏幕密度*/publicstaticvoidcomputeScreenDensity(){DisplayMetricsdm=newDisplayMetrics();dm=BaseApplication.getAppContext().getResources().getDisplayMetrics();if(dm==null)return;SCREEN_DENSITY=dm.density;}/***计算UI/字体缩放比例*/publicstaticvoidcomputeScaleRatio(){intwindowWidth=getWindowWidth();intwindowHeight=getWindowHeight();if(windowWidth==0||windowHeight==0)return;intdesignedWidth=(windowWidth>windowHeight)?UI_DESIGN_PORTRAIT_SIZE:UI_DESIGN_LANDSCAPE_SIZE;intdesignedHeight=(windowWidth>windowHeight)?UI_DESIGN_LANDSCAPE_SIZE:UI_DESIGN_PORTRAIT_SIZE;SCALE_RATIO_HORIZONTAL=(float)windowWidth/(float)designedWidth;SCALE_RATIO_VERTICAL=(float)windowHeight/(float)designedHeight;floatratioDesigned=(float)UI_DESIGN_PORTRAIT_SIZE/(float)UI_DESIGN_LANDSCAPE_SIZE;floatratioDevice=(float)windowHeight/(float)windowWidth;/*当设备宽高比例与UI设计的比例相同,或者设备宽高比例比UI设计的比例瘦长时按照宽度等比缩放(主流),相反,如果比UI设计的比例胖扁时按照高度缩放*/SCALE_RATIO=ratioDevice>=ratioDesigned?SCALE_RATIO_HORIZONTAL:SCALE_RATIO_VERTICAL;}/***检查当前屏幕方向是否为横向**@return*/publicstaticbooleanisLandscape(){returnBaseApplication.getAppContext().getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE;}/***dip转换px**@paramdip*@return*/publicstaticintdip2px(floatdip){floatf=BaseApplication.getAppContext().getResources().getDisplayMetrics().density;return(int)(dip*f+0.5F);}/***dip转换px**@paramdip*@return*/publicstaticintpx2dip(floatpx){floatf=BaseApplication.getAppContext().getResources().getDisplayMetrics().density;return(int)(px/f);}/***检查UI事件是否发生在视图view的区域内**@paramv*@paramev*@return*/publicstaticbooleanintersects(Viewv,MotionEventev){if(v==null)returnfalse;Rectrect=newRect();v.getHitRect(rect);Rectr=newRect();r.left=r.right=(int)ev.getX();r.bottom=r.top=(int)ev.getY();returnrect.intersects(r.left,r.top,r.right,r.bottom);}/***通过反射计算状态栏高度**@return*/publicstaticintgetStatusBarHeight(){if(STATUS_BAR_HEIGHT!=0)returnSTATUS_BAR_HEIGHT;Class<?>c=null;Objectobj=null;Fieldfield=null;intx=0,statusBarHeight=0;try{c=Class.forName("com.android.internal.R$dimen");obj=c.newInstance();field=c.getField("status_bar_height");x=Integer.parseInt(field.get(obj).toString());statusBarHeight=BaseApplication.getAppContext().getResources().getDimensionPixelSize(x);STATUS_BAR_HEIGHT=statusBarHeight;}catch(Exceptione1){e1.printStackTrace();}returnSTATUS_BAR_HEIGHT;}/***根据Activity获取状态栏高度**@paramactivityo*@return*/publicstaticintgetStatusBarHeight(Activityactivity){Rectframe=newRect();activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);returnframe.top;}publicstaticvoidcomputeWindowRotation(){WindowManagerwindowManager=(WindowManager)BaseApplication.getAppContext().getSystemService(Context.WINDOW_SERVICE);WINDOW_ROTATION=windowManager.getDefaultDisplay().getRotation();LogUtil.d(TAG,"computeWindowRotationrotation:"+WINDOW_ROTATION);}publicstaticintgetWindowRotation(){returnWINDOW_ROTATION;}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。