zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

android分辨率适配的方法

Android方法 适配 分辨率
2023-06-13 09:14:41 时间
以前在公司做项目的时候,遇到了分辨率的适配问题,说起来当时挺纠结的,因为没有外网,所以这个问题,都是黑暗中摸索的,尝试了许多方法,最后和徒弟们一起搞出了这个方法,具体行不行,先和大家分享下,这个方法不能说万能的,但是最起码它解决了分辨率跟密集度的关系,但是也引来一个问题,就是布局会因为图片资源小而失真,所以这也需要美工的同志多多配合的,废话不说,贴代码:
第一步,先创建一个view信息的javabean类
复制代码代码如下:

packagecom.zte.layout.adapter;
importandroid.view.View;
/**
*存储View信息的JavaBean类
*
*@author
*
*/
publicclassLayoutInformation
{
/**
*View的对象
*/
privateViewview;
/**
*View的宽度
*/
privatedoubleviewWidth;
/**
*View的高度
*/
privatedoubleviewHeight;
/**
*View距左边的距离,即marginLeft
*/
privatedoubleviewMarginLeft;
/**
*View距顶部的距离,即MarginTop;
*/
privatedoubleviewMarginTop;
/**
*父类布局的类型为相对布局
*/
publicstaticintR=-1;
/**
*父类布局的类型为线性布局
*/
publicstaticintL=-2;
/**
*此View的父类布局的类型
*/
privateintparentLayoutType;
/**
*存储View信息的JavaBean类
*
*@paramview
*View的对象
*@paramviewWidth
*View的宽
*@paramviewHeight
*View的高
*@paramviewMarginLeft
*View距左边的距离
*@paramviewMargdoubleop
*View距上部的距离
*@paramparentLayoutType
*父类布局的类型,LayoutInformation.R
*(表示相对布局)或者LayoutInformation.L(表示线性布局)
*/
publicLayoutInformation(Viewview,doubleviewWidth,doubleviewHeight,
doubleviewMarginLeft,doubleviewMarginTop,intparentLayoutType)
{
this.view=view;
this.viewWidth=viewWidth;
this.viewHeight=viewHeight;
this.viewMarginLeft=viewMarginLeft;
this.viewMarginTop=viewMarginTop;
this.parentLayoutType=parentLayoutType;
}
/**
*获取View的对象
*
*[url=home.php?mod=space&uid=7300]@return[/url]View对象
*/
publicViewgetView()
{
returnview;
}
/**
*设置View的对象
*/
publicvoidsetView(Viewview)
{
this.view=view;
}
/**
*获取View的宽度
*
*@returnView的宽度,double型
*/
publicdoublegetViewWidth()
{
returnviewWidth;
}
/**
*设置View的宽度,double型
*
*@paramviewWidth
*/
publicvoidsetViewWidth(doubleviewWidth)
{
this.viewWidth=viewWidth;
}
/**
*获取View的高度
*
*@returnView的高度,double型
*/
publicdoublegetViewHeight()
{
returnviewHeight;
}
/**
*设置View的高度,double型
*
*@paramviewHeight
*/
publicvoidsetViewHeight(doubleviewHeight)
{
this.viewHeight=viewHeight;
}
/**
*获取View距离左边的距离
*
*@returnView距离左边的距离,double型
*/
publicdoublegetViewMarginLeft()
{
returnviewMarginLeft;
}
/**
*设置View距离左边的距离,double型
*
*@paramviewMarginLeft
*/
publicvoidsetViewMarginLeft(doubleviewMarginLeft)
{
this.viewMarginLeft=viewMarginLeft;
}
/**
*获取View距离上部的距离
*
*@returnView距离上部的距离,double型
*/
publicdoublegetViewMarginTop()
{
returnviewMarginTop;
}
/**
*设置View距离上部的距离,double型
*
*@paramviewMargdoubleop
*/
publicvoidsetViewMarginTop(doubleviewMarginTop)
{
this.viewMarginTop=viewMarginTop;
}
/**
*获取父类布局的类型
*@returnparentLayoutType,int型
*/
publicintgetParentLayoutType()
{
returnparentLayoutType;
}
/**
*设置父类布局的类型
*@paramparentLayoutType
*/
publicvoidsetParentLayoutType(intparentLayoutType)
{
this.parentLayoutType=parentLayoutType;
}
}

第二步:创建一个计算方法
复制代码代码如下:

importjava.util.List;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.util.DisplayMetrics;
importandroid.view.View;
importandroid.view.ViewGroup.LayoutParams;
importandroid.widget.LinearLayout;
importandroid.widget.RelativeLayout;
/**
*分配率通配类
*
*@author
*
*/
publicclassMyLayoutAdapter
{
/**
*基准分辨率的宽
*/
publicdoubleSTANDARD_SCREEN_WIDTH;
/**
*基准分辨率的高
*/
publicdoubleSTANDARD_SCREEN_HEIGHT;
/**
*系统当前的分辨率的宽
*/
publicdoubleCURRENT_SCREEN_WIDTH;
/**
*系统当前的分辨率的高
*/
publicdoubleCURRENT_SCREEN_HEIGHT;
/**
*基准屏幕密度
*/
publicstaticfinaldoubleSTANDARD_DENSITY=160;
/**
*当前屏幕密度
*/
privatedoubleCURRENT_DENSITY;
/**
*屏幕密度比例
*/
privatedoubleDENSITY_RATIO;
/**
*屏幕宽度比例
*/
privatedoubleWIDTH_RATIO;
/**
*屏幕高度比例
*/
privatedoubleHEIGHT_RATIO;
/**
*组件基准的宽度
*/
privatedoubleviewStandardWidth;
/**
*组件基准的高度
*/
privatedoubleviewStandardHeight;
/**
*组件基准的距离左边的距离
*/
privatedoubleviewStandardMarginLeft;
/**
*组件基准的距离顶部的距离
*/
privatedoubleviewStandardMarginTop;
/**
*组件当前的宽
*/
privatedoubleviewCurrentWidth;
/**
*组件当前的高
*/
privatedoubleviewCurrentHeight;
/**
*组件当前距离左边的距离
*/
privatedoubleviewCurrentMarginLeft;
/**
*组件当前距离顶部的距离
*/
privatedoubleviewCurrentMarginTop;
/**
*UI组件的对象
*/
privateViewview;
/**
*此View的父类布局的类型
*/
privateintparentLayoutType;
/**
*父类布局的类型为相对布局
*/
privatefinalintLAYOUT_TYPE_RELATiVELAYOUT=LayoutInformation.R;
/**
*父类布局的类型为线性布局
*/
privatefinalintLAYOUT_TYPE_LINEARLAYOUT=LayoutInformation.L;
/**
*布局属性为wrap_content
*/
privatefinalintLAYOUTPARAMS_WARP_CONTENT=LayoutParams.WRAP_CONTENT;
/**
*布局属性为fill_parent
*/
privatefinalintLAYOUTPARAMS_FILL_PARENT=LayoutParams.FILL_PARENT;
privateContextcontext;
/**
*类对象实例化时,设置基准屏幕宽度,高度
*
*@paramcontext
*Context
*@paramstandardWidth
*基准屏幕的宽
*@paramstandardHeight
*基准屏幕的高
*/
publicMyLayoutAdapter(Contextcontext,doublestandardWidth,
doublestandardHeight)
{
this.context=context;
getScreenSize();
STANDARD_SCREEN_HEIGHT=standardHeight;
STANDARD_SCREEN_WIDTH=standardWidth;
//计算宽高比率
WIDTH_RATIO=CURRENT_SCREEN_WIDTH/STANDARD_SCREEN_WIDTH;
HEIGHT_RATIO=CURRENT_SCREEN_HEIGHT/STANDARD_SCREEN_HEIGHT;
}
/**
*获取当前屏幕大小和密度
*/
privatevoidgetScreenSize()
{
DisplayMetricsdisplayMetrics=newDisplayMetrics();
((Activity)context).getWindowManager().getDefaultDisplay()
getMetrics(displayMetrics);
CURRENT_SCREEN_WIDTH=displayMetrics.widthPixels;
CURRENT_SCREEN_HEIGHT=displayMetrics.heightPixels;
CURRENT_DENSITY=displayMetrics.densityDpi;
DENSITY_RATIO=STANDARD_DENSITY/CURRENT_DENSITY;
}
/**
*进行通配
*
*@paramlistdata
*/
publicvoidsetViewLayout(List<LayoutInformation>listdata)
{
for(inti=0;i<listdata.size();i++)
{
view=listdata.get(i).getView();
viewStandardWidth=listdata.get(i).getViewWidth();
viewStandardHeight=listdata.get(i).getViewHeight();
viewStandardMarginLeft=listdata.get(i).getViewMarginLeft();
viewStandardMarginTop=listdata.get(i).getViewMarginTop();
setLayoutParams();
viewCurrentMarginLeft=viewStandardMarginLeft*WIDTH_RATIO;
viewCurrentMarginTop=viewStandardMarginTop*HEIGHT_RATIO;
parentLayoutType=listdata.get(i).getParentLayoutType();
setLayoutByParentLayoutType();
}
}
/**
*判断布局属性的值,设置布局的属性
*/
privatevoidsetLayoutParams()
{
//如果基准的宽是wrap_content或者fill_parent则使用原值,否则进行计算得到通配后的值
if(viewStandardWidth==LAYOUTPARAMS_WARP_CONTENT
||viewStandardWidth==LAYOUTPARAMS_FILL_PARENT)
{
viewCurrentWidth=viewStandardWidth;
}else
{
viewCurrentWidth=viewStandardWidth*WIDTH_RATIO;
}
//如果基准的宽是wrap_content或者fill_parent则使用原值,否则进行计算得到通配后的值
if(viewStandardHeight==LAYOUTPARAMS_WARP_CONTENT
||viewStandardHeight==LAYOUTPARAMS_FILL_PARENT)
{
viewCurrentHeight=viewStandardHeight;
}else
{
viewCurrentHeight=viewStandardHeight*HEIGHT_RATIO;
}
}
/**
*通过判断此View父类的布局类型,给此View设置布局
*/
privatevoidsetLayoutByParentLayoutType()
{
if(parentLayoutType==LAYOUT_TYPE_RELATiVELAYOUT)
{
RelativeLayout.LayoutParamsparams=newRelativeLayout.LayoutParams(
(int)viewCurrentWidth,(int)viewCurrentHeight);
params.setMargins((int)viewCurrentMarginLeft,
(int)viewCurrentMarginTop,0,0);
view.setLayoutParams(params);
}elseif(parentLayoutType==LAYOUT_TYPE_LINEARLAYOUT)
{
LinearLayout.LayoutParamsparams=newLinearLayout.LayoutParams(
(int)viewCurrentWidth,(int)viewCurrentHeight);
params.setMargins((int)viewCurrentMarginLeft,
(int)viewCurrentMarginTop,0,0);
view.setLayoutParams(params);
}
}
/**
*设置字体大小
*
*@paramstandardSize
*原始大小
*@returnint
*/
publicintsetTextSize(intstandardSize)
{
intcurrentSize;
currentSize=(int)(standardSize*WIDTH_RATIO*DENSITY_RATIO);
returncurrentSize;
}
}

第三步,写一个接口
复制代码代码如下:
publicinterfaceInitAllView{
/**
*初始化控件的大小
*/
publicvoidinitAllView();
}

第四步:代码控制
复制代码代码如下:
/**
*通配方法
*/
privatevoidinitWildcard(){
myLayout=newMyLayoutAdapter(this,320,480);
listInfo=newArrayList<LayoutInformation>();
listInfo.add(newLayoutInformation(mBtn1,LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT,0,0,LayoutInformation.R));
listInfo.add(newLayoutInformation(mNowRegisterBtn,80,27.3,14.7,0,
LayoutInformation.R));
listInfo.add(newLayoutInformation(mNextRegisterBtn,80,27.3,14.7,0,
LayoutInformation.R));
//listInfo.add(newLayoutInformation(mCheckBtn,17.3,17.3,14.7,0,
//LayoutInformation.L));
mBtn1.setTextSize(myLayout.setTextSize(12));
mNowRegisterBtn.setTextSize(myLayout.setTextSize(12));
mNextRegisterBtn.setTextSize(myLayout.setTextSize(12));
myLayout.setViewLayout(listInfo);
}