Android的碎片化一直都是頭疼的問題若锁,即使使用dp,sp在不同的手機(jī)上表現(xiàn)也差強(qiáng)人意,在github上尋找后沒有發(fā)現(xiàn)合適的参袱,今天就自己擼了個(gè)叮趴。
先上圖轴或,看了真相才知道值不值得擁有然磷。紫谷。。
適配前:
大屏幕
小屏幕
適配后:
大屏幕
小屏幕
是不是按固定比例縮放了N撤铩!撩嚼!
接下來說下實(shí)現(xiàn)
一般我們開發(fā)時(shí)都是拿到按一定比列的設(shè)計(jì)圖停士,比如1920*1080的高寬比的。那么就可以拿設(shè)計(jì)給的比列來作為基準(zhǔn)完丽,進(jìn)行縮放恋技,比如屏幕是1280*768 那么就按1280/1920 ?768/1080 的比列來設(shè)計(jì)。當(dāng)然這里還要分情況:
1.有固定寬高的就要按寬高比來縮放 就可以取1280/1920? 768/1080 中小的(這是拿來做例子)
2.文字大小的縮放怎么縮放逻族,也是按小的比列
3.margin padding 怎么縮放 就按那個(gè)方向就那么了蜻底,比如是marginTop 那就按768/1080
思路就是這樣,代碼
public classAdapterConstraintLayoutextendsConstraintLayout {
private static final intDESIGN_WIDTH=1080;
private static final intDESIGN_HEIGHT=1920;
private static final floatDESIGN_SCALE=3.0f;
private floatmScale;
private floatmFontScale;
private floatmScaleX=0;
private floatmScaleY=0;
publicAdapterConstraintLayout(Context context) {
this(context, null);
}
publicAdapterConstraintLayout(Context context,AttributeSet attrs) {
this(context,attrs,0);
}
publicAdapterConstraintLayout(Context context,AttributeSet attrs, intdefStyle) {
super(context,attrs,defStyle);
Point point =newPoint();
((WindowManager) context.getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getSize(point);
//橫屏
if(point.x> point.y) {
mScaleX= (point.x*1.0f/DESIGN_HEIGHT);
mScaleY= (point.y*1.0f/DESIGN_WIDTH);
}else{//豎屏
mScaleX= (point.x*1.0f/DESIGN_WIDTH);
mScaleY= (point.y*1.0f/DESIGN_HEIGHT);
}
floatdensity =DESIGN_SCALE/ getResources().getDisplayMetrics().density;
floatscaleDensity =DESIGN_SCALE/ getResources().getDisplayMetrics().scaledDensity;
floatminScale = Math.min(mScaleX,mScaleY);
mScale= minScale * density;
mScaleX*= density;
mScaleY*= density;
mFontScale= minScale * scaleDensity;
}
@Override
public voidaddView(View child) {
super.addView(child);
}
@Override
public voidaddView(View child, intindex) {
super.addView(child,index);
}
@Override
public voidaddView(View child, intwidth, intheight) {
super.addView(child,width,height);
}
@Override
public voidaddView(View child,ViewGroup.LayoutParams params) {
if(!isInEditMode()) {
transformSize(child,(LayoutParams) params);
}
super.addView(child,params);
}
private voidtransformSize(View child,LayoutParams params) {
if(params.width>0&& params.height>0) {//按比列
params.width*=mScale;
params.height*=mScale;
}else{
//width
if(params.width>0) {
params.width*=mScaleX;
}
//height
if(params.height>0) {
params.height*=mScaleY;
}
}
//font size
if(childinstanceofAppCompatTextView) {
final floattextSize = ((AppCompatTextView) child).getTextSize();
((AppCompatTextView) child).setTextSize(TypedValue.COMPLEX_UNIT_PX,textSize *mFontScale);
}else if(childinstanceofAppCompatButton) {
final floattextSize = ((AppCompatButton) child).getTextSize();
((AppCompatButton) child).setTextSize(TypedValue.COMPLEX_UNIT_PX,textSize *mFontScale);
}else if(childinstanceofAppCompatEditText) {
final floattextSize = ((AppCompatEditText) child).getTextSize();
((AppCompatEditText) child).setTextSize(TypedValue.COMPLEX_UNIT_PX,textSize *mFontScale);
}
//margin
params.leftMargin*=mScaleX;
params.topMargin*=mScaleY;
params.rightMargin*=mScaleX;
params.bottomMargin*=mScaleY;
//padding
intpaddingLeft = (int) (getPaddingLeft() *mScaleX);
intpaddingTop = (int) (getPaddingTop() *mScaleY);
intpaddingRight = (int) (getPaddingRight() *mScaleX);
intpaddingBottom = (int) (getPaddingBottom() *mScaleY);
child.setPadding(paddingLeft,paddingTop,paddingRight,paddingBottom);
}
}
代碼不復(fù)雜聘鳞,就是對(duì)寬高薄辅,margin padding進(jìn)行設(shè)置
好了 接下來是使用 直接用就行了
這里沒有單獨(dú)抽出去要拂,比如不想用在ConstraintLayout怎么辦 ,可以抽出去站楚,跟百分比一樣
github