android 屏幕完美适配,Android完美适配不同屏幕
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
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的android 屏幕完美适配,Android完美适配不同屏幕的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android获取app用户数据,And
- 下一篇: 杏色的地板搭配什么颜色的门和墙?