Android的碎片化一直都是头疼的问题,即使使用dp,sp在不同的手机上表现也差强人意,在github上寻找后没有发现合适的,今天就自己撸了个。
先上图,看了真相才知道值不值得拥有。。。
适配前:
大屏幕
小屏幕
适配后:
大屏幕
小屏幕
是不是按固定比例缩放了!!!
接下来说下实现
一般我们开发时都是拿到按一定比列的设计图,比如1920*1080的高宽比的。那么就可以拿设计给的比列来作为基准,进行缩放,比如屏幕是1280*768 那么就按1280/1920 768/1080 的比列来设计。当然这里还要分情况:
1.有固定宽高的就要按宽高比来缩放 就可以取1280/1920 768/1080 中小的(这是拿来做例子)
2.文字大小的缩放怎么缩放,也是按小的比列
3.margin padding 怎么缩放 就按那个方向就那么了,比如是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);
}
}
代码不复杂,就是对宽高,margin padding进行设置
好了 接下来是使用 直接用就行了
这里没有单独抽出去,比如不想用在ConstraintLayout怎么办 ,可以抽出去,跟百分比一样
github
网友评论