分辨率适配的方法

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

 

posted on 2012-11-28 13:30  nuliniao  阅读(833)  评论(1编辑  收藏  举报