首先說明一點 :這個方法不能說萬能的,但是最起碼它解決了分辨率跟密集度的關系,就是所有分辨率,只要傳了第一次的參數,后面都不需要改動了,但是也引來一個問題,就是布局會因為圖片資源小而失真,所以這也需要美工的同志多多配合的,廢話不說,貼代碼:
第一步,先創建一個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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

