Android完美適配不同屏幕

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

github 鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末脱惰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子窿春,更是在濱河造成了極大的恐慌拉一,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旧乞,死亡現(xiàn)場(chǎng)離奇詭異蔚润,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)尺栖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門嫡纠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人决瞳,你說我怎么就攤上這事货徙。” “怎么了皮胡?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵痴颊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我屡贺,道長(zhǎng)蠢棱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任甩栈,我火速辦了婚禮泻仙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘量没。我一直安慰自己玉转,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布殴蹄。 她就那樣靜靜地躺著究抓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袭灯。 梳的紋絲不亂的頭發(fā)上刺下,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音稽荧,去河邊找鬼橘茉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的畅卓。 我是一名探鬼主播擅腰,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼髓介!你這毒婦竟也來了惕鼓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤唐础,失蹤者是張志新(化名)和其女友劉穎箱歧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體一膨,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呀邢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了豹绪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片价淌。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瞒津,靈堂內(nèi)的尸體忽然破棺而出蝉衣,到底是詐尸還是另有隱情,我是刑警寧澤巷蚪,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布病毡,位于F島的核電站,受9級(jí)特大地震影響屁柏,放射性物質(zhì)發(fā)生泄漏啦膜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一淌喻、第九天 我趴在偏房一處隱蔽的房頂上張望僧家。 院中可真熱鬧,春花似錦裸删、人聲如沸八拱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)肌稻。三九已至,卻和暖如春伤塌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轧铁。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工每聪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓药薯,卻偏偏與公主長(zhǎng)得像绑洛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子童本,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容