首先說明一點 :這個方法不能說萬能的,但是最起碼它解決了分辨率跟密集度的關系,就是所有分辨率,只要傳了第一次的參數,后面都不需要改動了,但是也引來一個問題,就是布局會因為圖片資源小而失真,所以這也需要美工的同志多多配合的,廢話不說,貼代碼:
第一步,先創建一個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); }
效果對比如下:
小的圖片是通過適應過的,大的圖片是沒有做適配的。可以看得出來他們的差異很明顯。如果各位大嬸有什么新的方法,希望多多推薦
效果對比
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
