android 分辨率适配的方法_Android

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

时间: 2024-11-05 19:43:02

android 分辨率适配的方法_Android的相关文章

Android分辨率适配小试牛刀

概述 大家在Android开发时,肯定会觉得屏幕适配是个尤其痛苦的事,各种屏幕尺寸适配起来蛋疼无比.如果我们换个角度我们看下这个问题,不知道大家有没有了解过web前端开发,或者说大家对于网页都不陌生吧,其实适配的问题在web页面的设计中理论上也存在,为什么这么说呢?电脑的显示器的分辨率.包括手机分辨率,我敢说分辨率的种类远超过Android设备的分辨率,那么有一个很奇怪的现象: 为什么Web页面设计人员从来没有说过,尼玛适配好麻烦? 那么,到底是什么原因,让网页的设计可以在千差万别的分辨率的分辨

Android新建Activity的方法_Android

本文实例讲述了Android新建Activity的方法.分享给大家供大家参考,具体如下: 在一个Android工程中,如何新建一个Activity?方法如下: 一.新建一个类(*.class),继承自android.app.Activity类. 二.在res/layout目录下新建一个布局xml文件,文件名随意(只能包含小写字母数字或下划线),用来设置新Activity的布局(对于如何设置Activity的布局,可参考本站相关内容). 三.打开AndroidManifest.xml文件,在里面进

android源码探索之定制android关机界面的方法_Android

本文实例讲述了android源码探索之定制android关机界面的方法.分享给大家供大家参考.具体如下: 在Android系统中,长按Power键默认会弹出对话框让你选择"飞行模式","静音","关机"等功能.如下图所示: 但这些功能都对Android-x86和其他终端产品就没什么必要了.本文就简单介绍下如何定制关机界面. 我的目标是长按Power键,将会关机,弹出"设备将要关机"选择对话框.如果可以选择"是&quo

android创建optionsmenu的方法_Android

本文实例讲述了android创建optionsmenu的方法.分享给大家供大家参考.具体实现方法如下: 一.用xml配置 在res文件夹下新建menu文件夹,menu下新建options_menu.xml文件,加入代码 1. <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/about" android:title=&qu

android自定义组件实现方法_Android

本文实例讲述了android自定义组件实现方法.分享给大家供大家参考.具体如下: atts.xml: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="TopBar"> <attr name="titleText" format="string"/> <

android获取时间差的方法_Android

本文实例讲述了android获取时间差的方法.分享给大家供大家参考.具体分析如下: 有些时候我们需要获取当前时间和某个时间之间的时间差,这时如何获取呢? 1. 引用如下命名空间: import java.util.Date; import android.text.format.DateFormat; 2. 设置时间格式: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 3. 获取时间: Date c

在Android中创建菜单项Menu以及获取手机分辨率的解决方法_Android

  在Activity中覆写下面两个方法: 复制代码 代码如下:   // 创建菜单 @Override public boolean onCreateOptionsMenu(Menu menu) {  menu.add(0, 0, 0, "关于");  // menu.add(int groupId, int itemId, int order, CharSequence title)  menu.add(0, 1, 1, "退出");        return

android开发中获取手机分辨率大小的方法_Android

所以,记录下核心代码: 复制代码 代码如下: DisplayMetrics metrics=new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metrics); 获取到本机的分辨率: 复制代码 代码如下: int widthPixels=metrics.widthPixels;int heightPixels=metrics.heightPixels; 当然,可以直接用TextView显示出来,还可以直接

详解Android Checkbox的使用方法_Android

0和1是计算机的基础,数理逻辑中0和1代表两种状态,真与假.0和1看似简单,其实变化无穷. 今天我就来聊聊android控件中拥有着0和1这种特性的魔力控件checkbox. 先来讲讲Checkbox的基本使用.在XML中定义. <?xml version="1.0" encoding="utf-8"?> <CheckBox xmlns:android="http://schemas.android.com/apk/res/android