Android第三方開源框架——AndroidAutoSize

這篇筆記是根據(jù)作者博客中的介紹,進行記錄總結箍邮。GitHub中文README

AndroidAutoSize

屏幕適配框架AndroidAutoSize是根據(jù)今日頭條屏幕適配方案優(yōu)化的。

配置第三方遠程依賴

<!--私有依賴-->
implementation 'me.jessyan:autosize:1.1.2'
<!--共有依賴-->
api 'me.jessyan:autosize:1.1.2'

使用以及功能介紹

AndroidAutoSize 在使用上非常簡單吨凑,只需要填寫設計圖尺寸這一步即可接入項目口猜;

<manifest>
    <application>            
        <meta-data
            android:name="design_width_in_dp"
            android:value="540"/>
        <meta-data
            android:name="design_height_in_dp"
            android:value="960"/>           
     </application>           
</manifest>

有兩種類型的布局單位可以選擇,一個是 主單位 (dp蓬推、sp),一個是 副單位 (pt澡腾、in沸伏、mm)

  • 主單位: 使用 dp、sp 為單位進行布局动分,侵入性最低毅糟,會影響其他三方庫頁面、三方庫控件以及系統(tǒng)控件的布局效果澜公,但 AndroidAutoSize 也通過這個特性姆另,使用 ExternalAdaptManager 實現(xiàn)了在不修改三方庫源碼的情況下適配三方庫的功能

  • 副單位: 使用 pt、in坟乾、mm 為單位進行布局迹辐,侵入性高,對老項目的支持比較好甚侣,不會影響其他三方庫頁面右核、三方庫控件以及系統(tǒng)控件的布局效果,可以徹底的屏蔽修改 density 所造成的所有未知和已知問題渺绒,但這樣 AndroidAutoSize 也就無法對三方庫進行適配

在使用主單位時,design_width_in_dpdesign_height_in_dp 的單位必須是 dp,計算公式 dp = px / (DPI / 160) 將 px 尺寸轉換為 dp 尺寸宗兼,如果實在找不到設備的 DPI 那就直接將 px 尺寸除以 3 或者 2 躏鱼。

框架接入完成

這就是 AndroidAutoSize 的基礎功能,AndroidAutoSize 的使用方法在這里就結束了殷绍,只需要上面這一步染苛,即可幫助你以最簡單的方式接入 AndroidAutoSize。

進階使用

在 AndroidManifest.xml 中填寫的設計尺寸主到,是整個項目的全局設計圖尺寸茶行,但是如果某些 Activity 頁面由于某些原因,這個頁面的設計圖尺寸和在 AndroidManifest.xml 中填寫的設計圖尺寸不一樣該怎么辦呢登钥?則可以讓這個頁面的 Activity 實現(xiàn) CustomAdapt 畔师,CustomAdapt 接口的第一個方法可以修改當前頁面的設計尺寸。

  • 自定義Activity
public class CustomAdaptActivity extends AppCompatActivity implements CustomAdapt {

     /**
     * 是否按照寬度進行等比例適配 (為了保證在高寬比不同的屏幕上也能正常適配, 所以只能在寬度和高度之中選擇一個作為基準進行適配)
     *
     * @return {@code true} 為按照寬度進行適配, {@code false} 為按照高度進行適配
     */
    @Override
    public boolean isBaseOnWidth() {
        return false;
    }

     /**
     * 設計圖尺寸為 1080px * 1920px, 高換算成 dp 為 960 (1920px / 2 = 960dp)
     * <p>
     * 返回的設計尺寸, 單位 dp
     * {@link #getSizeInDp} 須配合 {@link #isBaseOnWidth()} 使用, 規(guī)則如下:
     * 如果 {@link #isBaseOnWidth()} 返回 {@code true}, {@link #getSizeInDp} 則應該返回設計圖的總寬度
     * 如果 {@link #isBaseOnWidth()} 返回 {@code false}, {@link #getSizeInDp} 則應該返回設計圖的總高度
     * 如果您不需要自定義設計圖上的設計尺寸, 想繼續(xù)使用在 AndroidManifest 中填寫的設計圖尺寸, {@link #getSizeInDp} 則返回 {@code 0}
     *
     * @return 單位 dp
     */
    @Override
    public float getSizeInDp() {
        return 667;
    }
}

如果某個 Activity 想放棄適配牧牢,讓這個 Activity 實現(xiàn) CancelAdapt 接口即可看锉,比如修改 density 影響到了老項目中的某些 Activity 頁面的布局效果,這時就可以讓這個 Activity 實現(xiàn) CancelAdapt 接口

public class CancelAdaptActivity extends AppCompatActivity implements CancelAdapt {

}
  • 自定義Fragment

Fragment 的自定義方式和 Activity 是一樣的塔鳍,只不過在使用前需要先在 App 初始化時開啟對 Fragment 的支持

AutoSizeConfig.getInstance().setCustomFragment(true);
  • 實現(xiàn) CustomAdapt
public class CustomAdaptFragment extends Fragment implements CustomAdapt {

    @Override
    public boolean isBaseOnWidth() {
        return false;
    }

    @Override
    public float getSizeInDp() {
        return 667;
    }
}
  • 實現(xiàn) CancelAdapt
public class CancelAdaptFragment extends Fragment implements CancelAdapt {

}

萬能解決方案

在任何情況下本來適配正常的布局突然出現(xiàn)適配失效伯铣,適配異常等問題,只要重寫 Activity 的 getResources() 方法即可轮纫,如果是 Dialog腔寡、PopupWindow 等控件出現(xiàn)適配失效或適配異常,同樣在每次 show() 之前調用 AutoSize#autoConvertDensity() 即可掌唾。

解決方案來自:Blankj

@Override
public Resources getResources() {
    //需要升級到 v1.1.2 及以上版本才能使用 AutoSizeCompat
    AutoSizeCompat.autoConvertDensityOfGlobal((super.getResources());//如果沒有自定義需求用這個方法
    AutoSizeCompat.autoConvertDensity((super.getResources(), 667, false);//如果有自定義需求就用這個方法
    return super.getResources();
}

總結

到目前為止我們已經掌握了AndroidAutoSize的基本使用放前,但是這個框架怎么實現(xiàn)的屏幕適配我們還得自己去看源碼。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末郑兴,一起剝皮案震驚了整個濱河市犀斋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌情连,老刑警劉巖叽粹,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異却舀,居然都是意外死亡虫几,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門挽拔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辆脸,“玉大人,你說我怎么就攤上這事螃诅》惹猓” “怎么了状囱?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長倘是。 經常有香客問我亭枷,道長,這世上最難降的妖魔是什么搀崭? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任叨粘,我火速辦了婚禮,結果婚禮上瘤睹,老公的妹妹穿的比我還像新娘升敲。我一直安慰自己,他們只是感情好轰传,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布驴党。 她就那樣靜靜地躺著,像睡著了一般绸吸。 火紅的嫁衣襯著肌膚如雪鼻弧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天锦茁,我揣著相機與錄音攘轩,去河邊找鬼。 笑死码俩,一個胖子當著我的面吹牛度帮,可吹牛的內容都是我干的。 我是一名探鬼主播稿存,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼笨篷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓣履?” 一聲冷哼從身側響起率翅,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袖迎,沒想到半個月后冕臭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡燕锥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年辜贵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片归形。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡托慨,死狀恐怖,靈堂內的尸體忽然破棺而出暇榴,到底是詐尸還是另有隱情厚棵,我是刑警寧澤蕉世,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站婆硬,受9級特大地震影響讨彼,放射性物質發(fā)生泄漏。R本人自食惡果不足惜柿祈,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哩至。 院中可真熱鬧躏嚎,春花似錦、人聲如沸菩貌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箭阶。三九已至虚茶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間仇参,已是汗流浹背嘹叫。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留诈乒,地道東北人罩扇。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像怕磨,于是被迫代替她去往敵國和親喂饥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內容