android 分辨率适配的方法
android 分辨率适配的方法
发布时间:2016-12-28 来源:查字典编辑
摘要:以前在公司做项目的时候,遇到了分辨率的适配问题,说起来当时挺纠结的,因为没有外网,所以这个问题,都是黑暗中摸索的,尝试了许多方法,最后和徒弟...

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

第一步,先创建一个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);

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新安卓软件开发学习
热门安卓软件开发学习
编程开发子分类