關(guān)于Android界面適配的思考及最終解決方案

一直以來都用px映射表來解決不同界面的適配性問題(參考:Android界面開發(fā)精要1:尺寸)尤仍。最近在一些設(shè)備上發(fā)現(xiàn)遍烦,這種方案也有弊端:以UI圖的基礎(chǔ)設(shè)計是基于720*1280(如Galaxy Nexus)為例,最近發(fā)現(xiàn)有些設(shè)備的像素寬高比并不是如此拨拓,比如Nexus 4就是768*1280肴颊。

720*1280在Galaxy Nexus上

這種情形下,不同的映射方式會有不同的效果:

  1. 采用Google提供的dp映射:就會發(fā)現(xiàn)空白區(qū)域變多渣磷,原本720的寬度應(yīng)該是滿屏婿着,現(xiàn)在就無法滿屏了,因為多出了48


    720*1280在Nexus 4上
  2. 采用百分比來映射拉伸:會發(fā)現(xiàn)正方形的圖片醋界,變成了長方形竟宋。因為寬度和高度的比例變了,基于其推算出來的正方形寬高自然也就不準(zhǔn)了形纺。

仔細(xì)思考就會發(fā)現(xiàn)問題的本質(zhì)是:控件寬高計算基準(zhǔn)是不同的丘侠。

  1. “分辨率不同啊,不單獨適配了逐样,直接拉伸好了”蜗字。這個視角是百分比視角打肝,子控件的寬高隨著父容器的寬高按照比例變動。最大的父容器就是設(shè)備的寬高挪捕。
  2. “我的頭像明明是正方形粗梭,怎么變長了?”级零。這是視角是控件視角断医,其約束條件為 控件的寬等于高。

這讓我想起iOS開發(fā)中妄讯,其界面設(shè)計系統(tǒng)AutoLayout孩锡,就采用了一個計算公式:

A = B*ratio+constant
A——某控件的寬、高亥贸、四周邊距等
B——{另一個控件 或者 設(shè)備本身} 的寬、高浇垦、四周邊距等

也就是說炕置,任何控件都可以以其他控件的屬性值來定義自身的屬性值,所以其可塑性非常高男韧。不過實際應(yīng)用中也會帶來一個問題朴摊,就是太靈活,導(dǎo)致多重約束此虑,有時候會彼此沖突甚纲。

仔細(xì)想想,最常見的視角參數(shù)應(yīng)該就只有3個:

  1. 設(shè)備的寬高朦前。
  2. 父容器的寬高介杆。
  3. 自身的寬高比例。

透過這3個參數(shù)韭寸,應(yīng)該可以定義任意控件的屬性值春哨。

現(xiàn)在問題來了,Android怎么做到呢恩伺?答案是:****android-percent-support-extend****

android-percent-support-extend使用流程

  1. 添加引用
compile 'com.zhy:percent-support-extends:1.1.1'
  1. 用指定控件代替原有布局空間
  • com.zhy.android.percent.support.PercentLinearLayout
  • com.zhy.android.percent.support.PercentRelativeLayout
  • com.zhy.android.percent.support.PercentFrameLayout
  1. 使用新的屬性值來指定約束
  • layout_heightPercent
  • layout_widthPercent
  • layout_marginBottomPercent
  • layout_marginEndPercent
  • layout_marginLeftPercent
  • layout_marginPercent
  • layout_marginRightPercent
  • layout_marginStartPercent
  • layout_marginTopPercent
  • layout_textSizePercent
  • layout_maxWidthPercent
  • layout_maxHeightPercent
  • layout_minWidthPercent
  • layout_minHeightPercent
  • layout_paddingPercent
  • layout_paddingTopPercent
  • layout_paddingBottomPercent
  • layout_paddingLeftPercent
  • layout_paddingRightPercent

對于值可以雀氨场:10%w , 10%h , 10% , 10%sw , 10%sh,縮寫含義為

  • w:父容器寬度
  • h:父容器高度
  • sw:設(shè)備寬度
  • sh:設(shè)備高度

android-percent-support-extend效果

對于一開始的界面晶渠,最后xml文件為:

<?xml version="1.0" encoding="utf-8"?>
<com.zhy.android.percent.support.PercentFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <TextView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:background="#ff7ecc16"
        android:gravity="center"
        android:text="100%w*match_parent"
        app:layout_widthPercent="100%w" />

    <TextView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_gravity="bottom|right"
        android:layout_margin="30dp"
        android:background="#ffff0000"
        android:gravity="center"
        android:text="28%w*28%w"
        app:layout_widthPercent="28%w"
        app:layout_heightPercent="28%w"/>
</com.zhy.android.percent.support.PercentFrameLayout>

效果如下:


反思

這種直接裸寫百分比的方式比價繁瑣凰荚,相較之下,目前采用px映射表的方案中寫的px值直接在UI設(shè)計圖中取就行褒脯,更加簡單便瑟。
  其實px映射表方案也就是百分比的方案,而且x值和y值已經(jīng)分開憨颠,所以也可以解決正方形變形的問題胳徽。
  目前需要客服的問題主要在于px映射為px积锅,導(dǎo)致如果沒有覆蓋到設(shè)備的分辨率,就會出現(xiàn)問題养盗,改成px映射為dp后缚陷,這種問題應(yīng)該會減少很多。

拓展閱讀

  1. Android 增強(qiáng)版百分比布局庫 為了適配而擴(kuò)展
  2. AndroidAutoLayout
  3. screensiz

Panda
2016-11-29

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末往核,一起剝皮案震驚了整個濱河市箫爷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聂儒,老刑警劉巖虎锚,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異衩婚,居然都是意外死亡窜护,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門非春,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柱徙,“玉大人,你說我怎么就攤上這事奇昙』の辏” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵储耐,是天一觀的道長羊初。 經(jīng)常有香客問我,道長什湘,這世上最難降的妖魔是什么长赞? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮禽炬,結(jié)果婚禮上涧卵,老公的妹妹穿的比我還像新娘。我一直安慰自己腹尖,他們只是感情好柳恐,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著热幔,像睡著了一般乐设。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上绎巨,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天近尚,我揣著相機(jī)與錄音,去河邊找鬼场勤。 笑死戈锻,一個胖子當(dāng)著我的面吹牛歼跟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播格遭,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼哈街,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了拒迅?” 一聲冷哼從身側(cè)響起骚秦,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎璧微,沒想到半個月后作箍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡前硫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年胞得,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片开瞭。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡懒震,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嗤详,到底是詐尸還是另有隱情,我是刑警寧澤瓷炮,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布葱色,位于F島的核電站,受9級特大地震影響娘香,放射性物質(zhì)發(fā)生泄漏苍狰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一烘绽、第九天 我趴在偏房一處隱蔽的房頂上張望淋昭。 院中可真熱鬧,春花似錦安接、人聲如沸翔忽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歇式。三九已至,卻和暖如春胡野,著一層夾襖步出監(jiān)牢的瞬間材失,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工硫豆, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留龙巨,地道東北人笼呆。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像旨别,于是被迫代替她去往敵國和親障般。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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