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的對象
         * 
         * @return 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);
        }

效果對比如下:
小的圖片是通過適應過的,大的圖片是沒有做適配的。可以看得出來他們的差異很明顯。如果各位大嬸有什么新的方法,希望多多推薦

效果對比

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM