亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

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

2019-10-21 21:38:55
字體:
來源:轉載
供稿:網友

前言

在開發中我們經常要使用圖片或者drawable文件夾下的xml,來實現一些效果,Drawable的用法都和xml相關,我們可以使用shape、layer-list等標簽繪制一些背景,還可以通過selector標簽定義View的狀態的效果等。當然了基本每個標簽都對應于一個真正的實體類。

所有drawable.xml對應的Java類如下

Android,drawable.xml,替代方案

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

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

傳統方案總結

我們先概括下目前市面上已有的方案,大致分為兩種實現方式。

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

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

新方案探索

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

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

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

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

在運行時內部就會調用TextView內部的setText方法。其實現原理的關鍵就是DataBinding通過提供的@BindingAdapter注解,該注解將任意指定的屬性和任意指定的方法關聯,DataBinding會在編譯的時候動態生成的調用關系,而對于常用的控件,DataBinding已經預置了對應的注解方法,例如以下就是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);}

我們需要關注的就是這個@BindingAdapter注解,「任意指定的屬性」這個屬性并非特指我們在布局中Android提供的標準屬性,也就是說,我們可以提供任意字符串作為屬性,而任意方法很好理解,上面的代碼片段很好的表達了這個意思,我們唯一需要關注的就是這個方法的參數:第一個參數是指定注解中的屬性的作用域,后面的參數則是和注解所聲明的屬性一一對應,那么結合到我們本文的主題,答案也就呼之欲出了:

新方案實現

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

限于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);}

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

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

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

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

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

總結

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

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

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

Github地址:https://github.com/whataa/noD...

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品一区二区三区国产精品| 成人激情电影一区二区| 97在线看福利| 国产亚洲欧美视频| 亚洲日本欧美日韩高观看| 亚洲精品91美女久久久久久久| 国产精品三级在线| 亲爱的老师9免费观看全集电视剧| 午夜免费日韩视频| 日韩视频免费在线观看| 国产性色av一区二区| 96pao国产成视频永久免费| 成人黄色av免费在线观看| 精品夜色国产国偷在线| 午夜剧场成人观在线视频免费观看| 亚洲最新视频在线| 国产在线视频2019最新视频| 日本亚洲欧洲色α| 欧美成人在线免费视频| 亚洲精品福利免费在线观看| 一夜七次郎国产精品亚洲| 欧洲日本亚洲国产区| 91中文字幕一区| 欧美日韩国产区| 亚洲美女精品久久| 国产精品电影一区| 日本中文字幕不卡免费| 欧美性猛交xxxx| 日韩成人av在线| 在线播放日韩精品| 美日韩精品视频免费看| 色偷偷88888欧美精品久久久| 在线精品高清中文字幕| 欧美亚洲在线视频| 日韩av资源在线播放| 欧美性猛交xxxx免费看| 91久久国产综合久久91精品网站| 国产69精品久久久久9999| 久久精品久久久久久国产 免费| 午夜免费久久久久| 欧美一区亚洲一区| 久久免费成人精品视频| 国产一区二区三区欧美| 亚洲3p在线观看| 久久精品国产久精国产思思| 久久69精品久久久久久国产越南| 国产欧美婷婷中文| 日韩在线视频线视频免费网站| 久久久成人精品视频| 欧美日韩免费在线观看| 久久成人18免费网站| 欧美成人精品在线观看| 亚洲国产精品一区二区三区| 精品国产老师黑色丝袜高跟鞋| 亚洲人午夜精品| 久久久久久久久久婷婷| 久久久久www| 亚洲男人天堂古典| 日韩电影视频免费| 久久露脸国产精品| 91亚洲精品一区二区| 欧美性受xxxx黑人猛交| 欧美激情视频在线观看| 精品偷拍一区二区三区在线看| 在线丨暗呦小u女国产精品| 日韩精品高清在线观看| 国产成+人+综合+亚洲欧美丁香花| 欧美日韩在线看| 成人免费网站在线| 在线观看欧美www| 国产日韩在线看片| 97成人精品视频在线观看| 亚洲高清久久久久久| 亚洲综合在线播放| 欧美精品免费在线| 亚洲一区精品电影| 亚洲欧美国产va在线影院| 午夜精品久久久久久99热软件| 成人午夜激情网| 亚洲一区二区黄| 色悠久久久久综合先锋影音下载| 91免费电影网站| 亚洲天堂免费观看| 亚洲综合中文字幕在线观看| 国产一区二区香蕉| 国产精品一区电影| 国产精品视频在线播放| 亚洲天堂久久av| 亚洲福利影片在线| 一区二区三区日韩在线| 这里只有视频精品| 色吧影院999| 久久久久久久激情视频| 久久国产天堂福利天堂| 姬川优奈aav一区二区| 国产在线久久久| 在线中文字幕日韩| 亚洲第一视频在线观看| 国产69精品久久久久久| 91极品视频在线| 97色在线观看| 精品视频一区在线视频| 国产一区二区三区在线播放免费观看| 色综合天天狠天天透天天伊人| 国产91色在线播放| 福利视频一区二区| 亚洲最大激情中文字幕| 欧美俄罗斯乱妇| 91免费综合在线| 欧美黑人视频一区| 国产亚洲精品久久久优势| 亚洲精品日韩久久久| 精品一区二区亚洲| 日本亚洲欧美三级| 国产精品丝袜一区二区三区| 中文字幕欧美日韩va免费视频| 欧美人在线观看| 亚洲免费影视第一页| 一区二区欧美日韩视频| 欧美大尺度电影在线观看| 亚洲已满18点击进入在线看片| 国产亚洲一区二区在线| 91视频免费网站| 最新中文字幕亚洲| 国产成人精品免高潮在线观看| 青草青草久热精品视频在线观看| 美女av一区二区| 亚洲精品久久视频| 97超碰色婷婷| 欧美黑人性视频| 国产日产久久高清欧美一区| 日本亚洲欧洲色| 欧美日韩美女在线观看| 色噜噜狠狠色综合网图区| 青青久久aⅴ北条麻妃| 国产91精品最新在线播放| 91免费看国产| 亚洲电影免费观看高清| y97精品国产97久久久久久| 最近中文字幕mv在线一区二区三区四区| www.欧美精品| 精品欧美激情精品一区| 欧美成人黄色小视频| 亚洲一区二区日本| 伦理中文字幕亚洲| 欧美色视频日本版| 国产精品第一区| 中文字幕av一区二区三区谷原希美| 中文字幕亚洲欧美日韩2019| 视频在线观看99| 日韩专区在线观看| 日韩在线观看网址| 国语自产在线不卡| 国产精品专区第二| 91高清免费视频| 色综合五月天导航| 国产精品美女无圣光视频| 欧美成人精品在线| 91性高湖久久久久久久久_久久99| 搡老女人一区二区三区视频tv| 亚洲精品国产精品自产a区红杏吧| 欧美怡红院视频一区二区三区| 亚洲色图校园春色| 亚洲一区美女视频在线观看免费|