欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android中一種巧妙的drawable.xml替代方案分享

 更新時(shí)間:2018年09月11日 11:56:10   作者:whataa  
這篇文章主要給大家介紹了關(guān)于Android中一種巧妙的drawable.xml替代方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在開發(fā)中我們經(jīng)常要使用圖片或者drawable文件夾下的xml,來實(shí)現(xiàn)一些效果,Drawable的用法都和xml相關(guān),我們可以使用shape、layer-list等標(biāo)簽繪制一些背景,還可以通過selector標(biāo)簽定義View的狀態(tài)的效果等。當(dāng)然了基本每個(gè)標(biāo)簽都對(duì)應(yīng)于一個(gè)真正的實(shí)體類。

所有drawable.xml對(duì)應(yīng)的Java類如下

如何維護(hù)(替換)drawable xml是android開發(fā)中一個(gè)老生常談的話題。按照標(biāo)準(zhǔn)的Android布局開發(fā)模式,我們不得不為各種UI效果新建不同的xml文件進(jìn)行描述,哪怕是簡單的一個(gè)圓角。隨著項(xiàng)目迭代,成百上千的xml連同那模棱兩可的文件名,不僅讓開發(fā)者復(fù)用或清理的成本難以估計(jì),還使得項(xiàng)目體積急劇增大。因此,下面我們探索一種原理巧妙、適配全面的drawable替代方案。

下面話不多說了,來一起看看詳細(xì)的介紹吧

傳統(tǒng)方案總結(jié)

我們先概括下目前市面上已有的方案,大致分為兩種實(shí)現(xiàn)方式。

一種是繼承某個(gè)(或某幾個(gè))常用的控件,然后將drawable.xml中的常用屬性作為當(dāng)前控件的自定義屬性,最后在控件內(nèi)部動(dòng)態(tài)生成drawable作為該控件的背景。這種方案的優(yōu)點(diǎn)很明顯:能直觀地將drawable效果描述作為控件的屬性定義在布局xml中,具有很好的可讀性;但是缺點(diǎn)也不可忽視,這些屬性并不能應(yīng)用到任意控件,導(dǎo)致在很多時(shí)候還是不得不創(chuàng)建drawable.xml文件。

另一種方案則是將drawable的常用屬性封裝為代碼API,以動(dòng)態(tài)的方式在代碼中生成并賦值給控件。這種方案理論上完全拋棄了drawable.xml,可以適配任意控件,但是若想完全以這種方式達(dá)到完全替換xml,個(gè)人覺得不可能,代碼量大,關(guān)聯(lián)性低是其最大的缺點(diǎn),單看布局,無從知曉該控件的最終效果。不過,如果兩相結(jié)合,作為對(duì)第一種方案的補(bǔ)充倒是一個(gè)不錯(cuò)的方案。

新方案探索

上述兩種方案各有千秋,但都無法完全解決問題,我們對(duì)上述兩種方案進(jìn)行分析,提出以下問題:為什么不能有一種「既具有高可讀性,又能全面適配」的drawable.xml替代方案呢?也就是說能同時(shí)兼顧前面提到的兩種方案的優(yōu)點(diǎn),高可讀性意味著對(duì)drawable的描述需要作為屬性定義在布局文件中、全面適配意味這些屬性對(duì)任意控件都有效。思來想去,答案似乎只有一個(gè):DataBinding。說到這里,可能有些朋友已經(jīng)隱隱猜到了,不過別急,容我娓娓道來。

DataBinding是Android官方推出的數(shù)據(jù)綁定庫,盡管已有數(shù)年,但是我估計(jì)仍有部分開發(fā)者還沒有接觸甚至有些抵觸,具體就不細(xì)說,但是我希望你暫且能擁抱它,繼續(xù)閱讀。

數(shù)據(jù)綁定讓數(shù)據(jù)變化能直接反映到布局中,對(duì)于控件已有的屬性,例如TextView的android:text屬性,一旦通過DataBinding綁定:

<TextView
 android:text="@{name}"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content" />

在運(yùn)行時(shí)內(nèi)部就會(huì)調(diào)用TextView內(nèi)部的setText方法。其實(shí)現(xiàn)原理的關(guān)鍵就是DataBinding通過提供的@BindingAdapter注解,該注解將任意指定的屬性和任意指定的方法關(guān)聯(lián),DataBinding會(huì)在編譯的時(shí)候動(dòng)態(tài)生成的調(diào)用關(guān)系,而對(duì)于常用的控件,DataBinding已經(jīng)預(yù)置了對(duì)應(yīng)的注解方法,例如以下就是TextView的setText方法:

@BindingAdapter("android:text")
public static void setText(TextView view, CharSequence text) {
 final CharSequence oldText = view.getText();
 if (text == oldText || (text == null && oldText.length() == 0)) {
  return;
 }
 if (text instanceof Spanned) {
  if (text.equals(oldText)) {
   return; // No change in the spans, so don't set anything.
  }
 } else if (!haveContentsChanged(text, oldText)) {
  return; // No content changes, so don't set anything.
 }
 view.setText(text);
}

我們需要關(guān)注的就是這個(gè)@BindingAdapter注解,「任意指定的屬性」這個(gè)屬性并非特指我們?cè)诓季种蠥ndroid提供的標(biāo)準(zhǔn)屬性,也就是說,我們可以提供任意字符串作為屬性,而任意方法很好理解,上面的代碼片段很好的表達(dá)了這個(gè)意思,我們唯一需要關(guān)注的就是這個(gè)方法的參數(shù):第一個(gè)參數(shù)是指定注解中的屬性的作用域,后面的參數(shù)則是和注解所聲明的屬性一一對(duì)應(yīng),那么結(jié)合到我們本文的主題,答案也就呼之欲出了:

新方案實(shí)現(xiàn)

提供一個(gè)用@BindingAdapter注解的方法,作用域指定為View(即任意控件);參數(shù)約定為drawable.xml中的屬性,不就達(dá)到了目的嗎。是否是感覺到一絲絲巧妙?既然方案有了,下面我們來看具體實(shí)現(xiàn)。

限于drawable屬性的豐富性,本文以常用的屬性solid 和 corner為例展開。如以下片段所示:

@BindingAdapter(value = {
  "drawable_solidColor",
  "drawable_radius",
}, requireAll = false)
public static void setViewBackground(View v, int color, int radius) {
 GradientDrawable drawable = new GradientDrawable();
 drawable.setColor(color);
 drawable.setCornerRadius(radius);
 view.setBackground(drawable);
}

上面代碼片段定義了兩個(gè)屬性:drawable_solidColor, drawable_radius,分別表示solid的color和corner的radius屬性,也就是說稍后我們就就可以在布局文件中為每個(gè)View都指定該屬性了;

這里可能有朋友會(huì)產(chǎn)生疑問,drawable的屬性那么多,這里只定義了兩個(gè)還好,如果把所有的drawable屬性都定義,那豈不是每個(gè)控件都要把每個(gè)屬性都指定一次,即使不需要。所以還需要提一下requireAll參數(shù),它表示是否需要每個(gè)屬性都必須綁定了數(shù)據(jù)才會(huì)調(diào)用setViewBackground方法,設(shè)置為false后,就可以在布局文件中只指定需要的屬性即可。

以上幾行代碼完成了基本定義,下面我們來看看如何使用:

<layout>
 <TextView
  drawable_radius="@{10}"
  drawable_solidColor="@{0xffff0000}"
  
  android:layout_width="60dp"
  android:layout_height="60dp" />
<layout/>

不用懷疑,就是這么簡單,即使這里不貼出效果圖,我想大家腦海中已經(jīng)浮現(xiàn)出來了,是不是覺得一目了然?以此類推,其它的drawable屬性也可以通過本方案逐一實(shí)現(xiàn)。

總結(jié)

回顧本文,并沒有任何復(fù)雜的代碼或高深的邏輯組合,僅提出一種巧妙的drawable.xml替代方案,具有「既具有高可讀性,又能全面適配」的特點(diǎn)。

從成本來說,本方案應(yīng)該是最低的(特別是對(duì)一些已經(jīng)在使用DataBinding的項(xiàng)目):只需要定義一個(gè)方法即可,而效果卻是最優(yōu)的:理論來講,實(shí)現(xiàn)該方案后,可以減少99%的drawable.xml創(chuàng)建。
如果非要說出本方案的缺點(diǎn),那么它的實(shí)現(xiàn)原理所依賴的核心庫DataBinding可能是有些開發(fā)者所不能接受的。

讀到這里,是否覺得意猶未盡?沒錯(cuò),我已依據(jù)本文的方案替大家整理好了幾乎所有常用的drawable屬性提交到了GitHub,核心依然是只有一個(gè)方法,直接可用。

Github地址:https://github.com/whataa/noD...(本地下載)

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Android的廣播Receiver動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)示例

    Android的廣播Receiver動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)示例

    本篇文章主要介紹了Android的廣播Receiver動(dòng)態(tài)注冊(cè)和靜態(tài)注冊(cè)示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Android仿QQ好友詳情頁下拉頂部圖片縮放效果

    Android仿QQ好友詳情頁下拉頂部圖片縮放效果

    這篇文章主要為大家詳細(xì)介紹了Android仿QQ好友詳情頁下拉頂部圖片縮放效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 淺談Android系統(tǒng)的基本體系結(jié)構(gòu)與內(nèi)存管理優(yōu)化

    淺談Android系統(tǒng)的基本體系結(jié)構(gòu)與內(nèi)存管理優(yōu)化

    這篇文章主要介紹了Android系統(tǒng)的基本體系結(jié)構(gòu)與內(nèi)存管理優(yōu)化,非常簡潔明了地總結(jié)了系統(tǒng)服務(wù)及垃圾回收等安卓的一些主要特性,需要的朋友可以參考下
    2016-02-02
  • Android自定義Dialog內(nèi)部透明、外部遮罩效果

    Android自定義Dialog內(nèi)部透明、外部遮罩效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義Dialog內(nèi)部透明、外部遮罩效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • Android徹底清除APP數(shù)據(jù)的兩種方案總結(jié)

    Android徹底清除APP數(shù)據(jù)的兩種方案總結(jié)

    大家在用Android手機(jī)的時(shí)候肯定都遇到過內(nèi)存剩余空間越來越小的情況,所以下面這篇文章主要給大家介紹了關(guān)于Android徹底清除APP數(shù)據(jù)的兩種方案,需要的朋友可以參考下
    2021-11-11
  • android開發(fā)中常用的Eclipse快捷鍵詳細(xì)整理

    android開發(fā)中常用的Eclipse快捷鍵詳細(xì)整理

    android開發(fā)中常用的Eclipse快捷鍵詳細(xì)整理方便查找,需要的朋友可以了解下
    2012-12-12
  • Android編程簡單實(shí)現(xiàn)九宮格示例

    Android編程簡單實(shí)現(xiàn)九宮格示例

    這篇文章主要介紹了Android編程簡單實(shí)現(xiàn)九宮格,結(jié)合具體實(shí)例形式分析了Android實(shí)現(xiàn)九宮格的具體步驟與相關(guān)布局、功能實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-06-06
  • Android?Kotlin?中的groupBy方法詳解

    Android?Kotlin?中的groupBy方法詳解

    在Kotlin中,groupBy函數(shù)可以對(duì)集合進(jìn)行分組,形成一個(gè)Map,其中key是分組標(biāo)準(zhǔn),value是對(duì)應(yīng)的元素列表,本文通過實(shí)例詳細(xì)解釋groupBy的使用方法和常見應(yīng)用場景,如按員工年齡分組或產(chǎn)品類型統(tǒng)計(jì)數(shù)量等,展示了groupBy的靈活性和實(shí)用性
    2024-09-09
  • Android Binder 通信原理圖文詳解

    Android Binder 通信原理圖文詳解

    這篇文章主要為大家介紹了Android Binder 通信原理圖文詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • App中如何獲取gradle的配置信息

    App中如何獲取gradle的配置信息

    這篇文章主要給大家介紹了關(guān)于App中如何獲取gradle的配置信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02

最新評(píng)論