欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android 分辨率适配的方法

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

package com.zte.layout.adapter;
import android.view.view;
/**
* 存储view信息的javabean类
*
* @author
*
*/
public class layoutinformation
{
/**
* view的对象
*/
private view view;
/**
* view的宽度
*/
private double viewwidth;
/**
* view的高度
*/
private double viewheight;
/**
* view距左边的距离,即marginleft
*/
private double viewmarginleft;
/**
* view距顶部的距离,即margintop;
*/
private double viewmargintop;
/**
* 父类布局的类型为相对布局
*/
public static int r=-1;
/**
* 父类布局的类型为线性布局
*/
public static int l=-2;
/**
* 此view的父类布局的类型
*/
private int parentlayouttype;
/**
* 存储view信息的javabean类
*
* @param view
* view的对象
* @param viewwidth
* view的宽
* @param viewheight
* view的高
* @param viewmarginleft
* view距左边的距离
* @param viewmargdoubleop
* view距上部的距离
* @param parentlayouttype
* 父类布局的类型,layoutinformation.r
* (表示相对布局)或者layoutinformation.l(表示线性布局)
*/
public layoutinformation(view view, double viewwidth, double viewheight,
double viewmarginleft, double viewmargintop, int parentlayouttype)
{
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对象
*/
public view getview()
{
return view;
}
/**
* 设置view的对象
*/
public void setview(view view)
{
this.view = view;
}
/**
* 获取view的宽度
*
* @return view的宽度,double型
*/
public double getviewwidth()
{
return viewwidth;
}
/**
* 设置view的宽度,double型
*
* @param viewwidth
*/
public void setviewwidth(double viewwidth)
{
this.viewwidth = viewwidth;
}
/**
* 获取view的高度
*
* @return view的高度,double型
*/
public double getviewheight()
{
return viewheight;
}
/**
* 设置view的高度,double型
*
* @param viewheight
*/
public void setviewheight(double viewheight)
{
this.viewheight = viewheight;
}
/**
* 获取view距离左边的距离
*
* @return view距离左边的距离,double型
*/
public double getviewmarginleft()
{
return viewmarginleft;
}
/**
* 设置view距离左边的距离,double型
*
* @param viewmarginleft
*/
public void setviewmarginleft(double viewmarginleft)
{
this.viewmarginleft = viewmarginleft;
}
/**
* 获取view距离上部的距离
*
* @return view距离上部的距离,double型
*/
public double getviewmargintop()
{
return viewmargintop;
}
/**
* 设置view距离上部的距离,double型
*
* @param viewmargdoubleop
*/
public void setviewmargintop(double viewmargintop)
{
this.viewmargintop = viewmargintop;
}
/**
* 获取父类布局的类型
* @return parentlayouttype,int型
*/
public int getparentlayouttype()
{
return parentlayouttype;
}
/**
* 设置父类布局的类型
* @param parentlayouttype
*/
public void setparentlayouttype(int parentlayouttype)
{
this.parentlayouttype = parentlayouttype;
}
}

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

import java.util.list;
import android.app.activity;
import android.content.context;
import android.util.displaymetrics;
import android.view.view;
import android.view.viewgroup.layoutparams;
import android.widget.linearlayout;
import android.widget.relativelayout;
/**
* 分配率通配类
*
* @author
*
*/
public class mylayoutadapter
{
/**
* 基准分辨率的宽
*/
public double standard_screen_width;
/**
* 基准分辨率的高
*/
public double standard_screen_height;
/**
* 系统当前的分辨率的宽
*/
public double current_screen_width;
/**
* 系统当前的分辨率的高
*/
public double current_screen_height;
/**
* 基准屏幕密度
*/
public static final double standard_density = 160;
/**
* 当前屏幕密度
*/
private double current_density;
/**
* 屏幕密度比例
*/
private double density_ratio;
/**
* 屏幕宽度比例
*/
private double width_ratio;
/**
* 屏幕高度比例
*/
private double height_ratio;
/**
* 组件基准的宽度
*/
private double viewstandardwidth;
/**
* 组件基准的高度
*/
private double viewstandardheight;
/**
* 组件基准的距离左边的距离
*/
private double viewstandardmarginleft;
/**
* 组件基准的距离顶部的距离
*/
private double viewstandardmargintop;
/**
* 组件当前的宽
*/
private double viewcurrentwidth;
/**
* 组件当前的高
*/
private double viewcurrentheight;
/**
* 组件当前距离左边的距离
*/
private double viewcurrentmarginleft;
/**
* 组件当前距离顶部的距离
*/
private double viewcurrentmargintop;
/**
* ui组件的对象
*/
private view view;
/**
* 此view的父类布局的类型
*/
private int parentlayouttype;
/**
* 父类布局的类型为相对布局
*/
private final int layout_type_relativelayout = layoutinformation.r;
/**
* 父类布局的类型为线性布局
*/
private final int layout_type_linearlayout = layoutinformation.l;
/**
* 布局属性为wrap_content
*/
private final int layoutparams_warp_content = layoutparams.wrap_content;
/**
* 布局属性为fill_parent
*/
private final int layoutparams_fill_parent = layoutparams.fill_parent;
private context context;
/**
* 类对象实例化时,设置 基准屏幕宽度,高度
*
* @param context
* context
* @param standardwidth
* 基准屏幕的宽
* @param standardheight
* 基准屏幕的高
*/
public mylayoutadapter(context context, double standardwidth,
double standardheight)
{
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;
}
/**
* 获取当前屏幕大小和密度
*/
private void getscreensize()
{
displaymetrics displaymetrics = new displaymetrics();
((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;
}
/**
* 进行通配
*
* @param listdata
*/
public void setviewlayout(list<layoutinformation> listdata)
{
for (int i = 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();
}
}
/**
* 判断布局属性的值,设置布局的属性
*/
private void setlayoutparams()
{
// 如果基准的宽是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设置布局
*/
private void setlayoutbyparentlayouttype()
{
if (parentlayouttype == layout_type_relativelayout)
{
relativelayout.layoutparams params = new relativelayout.layoutparams(
(int) viewcurrentwidth, (int) viewcurrentheight);
params.setmargins((int) viewcurrentmarginleft,
(int) viewcurrentmargintop, 0, 0);
view.setlayoutparams(params);
} else if (parentlayouttype == layout_type_linearlayout)
{
linearlayout.layoutparams params = new linearlayout.layoutparams(
(int) viewcurrentwidth, (int) viewcurrentheight);
params.setmargins((int) viewcurrentmarginleft,
(int) viewcurrentmargintop, 0, 0);
view.setlayoutparams(params);
}
}
/**
* 设置字体大小
*
* @param standardsize
* 原始大小
* @return int
*/
public int settextsize(int standardsize)
{
int currentsize;
currentsize = (int) (standardsize * width_ratio * density_ratio);
return currentsize;
}
}

第三步,写一个接口
复制代码 代码如下:

public interface initallview{
/**
* 初始化控件的大小
*/
public void initallview();
}

第四步:代码控制
复制代码 代码如下:

/**
* 通配方法
*/
private void initwildcard() {
mylayout = new mylayoutadapter(this, 320, 480);
listinfo = new arraylist<layoutinformation>();
listinfo.add(new layoutinformation(mbtn1, layoutparams.wrap_content,
layoutparams.wrap_content, 0, 0, layoutinformation.r));
listinfo.add(new layoutinformation(mnowregisterbtn, 80, 27.3, 14.7, 0,
layoutinformation.r));
listinfo.add(new layoutinformation(mnextregisterbtn, 80, 27.3, 14.7, 0,
layoutinformation.r));
// listinfo.add(new layoutinformation(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);
}