最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android?Drawable代碼編寫的新姿勢分享

 更新時間:2022年01月27日 15:39:03   作者:weiggle  
Drawable是什么?按照字面翻譯,就是可繪制的,由于能夠繪制的東西很多,所以這個類是一個抽象類,下面這篇文章主要給大家介紹了關于Android?Drawable代碼編寫的新姿勢,需要的朋友可以參考下

概念

Drawable表示一種可以在Canvas上進行繪制的抽象的概念,它有很多種,常見的如顏色和圖片都可以是一個Drawable。

優(yōu)點

  • 首先,它的使用比較簡單,在xml里已經(jīng)定義了大量的屬性方法,我們只要熟悉各個屬性的ui效果和特點就可以自己組合各種的界面效果。
  • 其次,它的實現(xiàn)成本比自定義View低,一些比較簡單的、定制性、重復性的UI效果使用drawable將會縮小開發(fā)成本。但是一些比較復雜的ui場景,drawable卻表現(xiàn)不出自定義view的那種效果。
  • 相比較于圖片而言,drawable占用空間更小,這樣有利于縮小apk的體積。

表現(xiàn)形式

Drawable盡管對于應用程序通常不可見,但Drawable可以采用多種形式:

Bitmap:最簡單的Drawable,一個PNG或JPEG圖像。

Nine Patch:是對PNG格式的擴展允許它指定如何對其進行拉伸和放置的信息

Vector:向量:在XML文件中定義的可繪制的一組點,線和曲線以及相關的顏色信息。 這種類型的繪圖可以縮放而不會損失顯示質(zhì)量。

Shape:形狀:包含簡單的繪圖命令而不是原始位圖,允許在某些情況下調(diào)整更好。

Layers:圖層:一個可繪制的復合物,它在彼此頂部繪制多個底層可繪圖。

States:狀態(tài),一個復合drawable,根據(jù)其狀態(tài)選擇一組drawable中的一個。

Levels:級別:一個復合drawable,根據(jù)其級別從一組drawable中選擇一個。

Scale:比例尺:一個可繪制的單個子組合可繪制的組合,其整體大小根據(jù)當前級別進行修改。

直接子類與非直接子類

xml解析流程

最終的inflateFromTag方法

  @NonNull
    @SuppressWarnings("deprecation")
    private Drawable inflateFromTag(@NonNull String name) {
        switch (name) {
            case "selector":
                return new StateListDrawable();
            case "animated-selector":
                return new AnimatedStateListDrawable();
            case "level-list":
                return new LevelListDrawable();
            case "layer-list":
                return new LayerDrawable();
            case "transition":
                return new TransitionDrawable();
            case "ripple":
                return new RippleDrawable();
            case "adaptive-icon":
                return new AdaptiveIconDrawable();
            case "color":
                return new ColorDrawable();
            case "shape":
                return new GradientDrawable();
            case "vector":
                return new VectorDrawable();
            case "animated-vector":
                return new AnimatedVectorDrawable();
            case "scale":
                return new ScaleDrawable();
            case "clip":
                return new ClipDrawable();
            case "rotate":
                return new RotateDrawable();
            case "animated-rotate":
                return new AnimatedRotateDrawable();
            case "animation-list":
                return new AnimationDrawable();
            case "inset":
                return new InsetDrawable();
            case "bitmap":
                return new BitmapDrawable();
            case "nine-patch":
                return new NinePatchDrawable();
            case "animated-image":
                return new AnimatedImageDrawable();
            default:
                return null;
        }
    }

真實案例

shapecountradio
shape83373%
selector24021%
layer-list50 
animated-rotate7 
animation-list5 
vector3 
rotate2 
level-list1 

我的項目里面,統(tǒng)計了drawable文件的總數(shù)是1140, 其中最多的是shape,總數(shù)833,占比73%, 其次是selector,總數(shù)240,占比21%, 這兩個加起來占比達到94%. 而這兩種類型都是差別很小的,主要是背景顏色和圓角角度不同,導致了大量的文件的產(chǎn)生, 而且對于這類的文件命名也是很難統(tǒng)一,從而難以達到復用的效果,有時候找一個目標文件, 遠遠沒有自己創(chuàng)建一個新的Drawable文件快,所以漸漸的會導致此類文件的爆炸式增長。 從而增大apk的體積。

通過xml解析流程,我們可以發(fā)現(xiàn)其中的奧妙,xml也只是根據(jù)具體的標簽直接new出來對應的是類,然后再直接設置具體的參數(shù), 如此一來,我們完全可以做到,自己創(chuàng)建具體的對象,然后設置參數(shù),這樣就避免了xml解析這一步,

更好的實現(xiàn)方式 —代碼

      mViewBinding.lineDrawable.background = shapeDrawable(this) {
            lineShape()
            dash(10, 5)
            strokeColor(Color.RED)
            strokeWidth(2)
        }
        
       
      mViewBinding.stateListDrawable.background = selectorDrawable {

          pressedDrawable {
                shapeDrawable(this@MainActivity) {
                    solidColor(Color.BLUE)
                    radius(8)
                }
          }

          defaultDrawable {
                shapeDrawable(this@MainActivity) {
                    solidColor(Color.GRAY)
                    radius(8)
                }
          }
      }

建議

具體的項目可以在封裝一次,減少每次的創(chuàng)建條件設置,這樣只需要傳遞具體的參數(shù)就可以,便于復用, 當然,項目也封裝了幾個通用的方法。比如:

    fun shapeDrawableColorInt(context: Context, @ColorInt colorInt: Int = Color.WHITE, radius: Int = 0) =
        shapeDrawable(context) {
            solidColor(colorInt)
            radius(radius)
    }


    fun shapeDrawableColorRes(context: Context, @ColorRes colorRes: Int, radius: Int = 0) =
        shapeDrawable(context) {
            solidColorRes(colorRes)
            radius(radius)
    }

優(yōu)點

比起xml方式可以提升性能:

  • 避免xml解析流程
  • 復用這些代碼
  • 比xml管理方便

引用方式

github地址

       implementation 'io.github.weiggle:drawable:1.0.1'

總結(jié)

到此這篇關于Android Drawable代碼編寫的新姿勢的文章就介紹到這了,更多相關Android Drawable代碼編寫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Kotlin語言中CompileSdkVersion與targetSdkVersion的區(qū)別淺析

    Kotlin語言中CompileSdkVersion與targetSdkVersion的區(qū)別淺析

    這篇文章主要介紹了Kotlin語言中CompileSdkVersion和targetSdkVersion有什么區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2023-02-02
  • Android編程操作聯(lián)系人的方法(查詢,獲取,添加等)

    Android編程操作聯(lián)系人的方法(查詢,獲取,添加等)

    這篇文章主要介紹了Android編程操作聯(lián)系人的方法,包括針對聯(lián)系人的查詢,獲取,添加等操作,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-01-01
  • 解決android studio中使用monitor工具無法打開data文件夾問題

    解決android studio中使用monitor工具無法打開data文件夾問題

    這篇文章主要介紹了解決android studio中使用monitor工具無法打開data文件夾問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • Android編程實現(xiàn)號碼歸屬地查詢的方法

    Android編程實現(xiàn)號碼歸屬地查詢的方法

    這篇文章主要介紹了Android編程實現(xiàn)號碼歸屬地查詢的方法,涉及Android xml文件的發(fā)送及WebService的操作技巧,需要的朋友可以參考下
    2016-01-01
  • Android實現(xiàn)帶有記住密碼功能的登陸界面

    Android實現(xiàn)帶有記住密碼功能的登陸界面

    這篇文章主要為大家詳細介紹了Android實現(xiàn)帶有記住密碼功能的登陸界面,主要采用SharedPreferences來保存用戶數(shù)據(jù),感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android基于Flutter編寫文件下載管理器

    Android基于Flutter編寫文件下載管理器

    文件下載在很多類型的應用中會涉及,例如音樂、文檔、包括圖片(只是圖片可以使用一些組件完成無感知的下載)。本篇介紹使用Flutter中的Dio下載方法完成文件的下載,需要的可以參考一下
    2022-03-03
  • Android中HttpURLConnection與HttpClient的使用與封裝

    Android中HttpURLConnection與HttpClient的使用與封裝

    這篇文章主要介紹了Android中HttpURLConnection與HttpClient的使用以及封裝方法,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 獲取Android系統(tǒng)唯一識別碼的方法

    獲取Android系統(tǒng)唯一識別碼的方法

    這篇文章主要介紹了獲取Android系統(tǒng)唯一識別碼的方法,涉及通過編程獲取Android系統(tǒng)硬件設備標識的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • Android UI系列-----Dialog對話框示例

    Android UI系列-----Dialog對話框示例

    本篇文章主要介紹了Android UI系列-----Dialog對話框示例,在界面上彈出一個Dialog對話框使我們經(jīng)常需要做的,有需要的可以了解一下。
    2017-01-01
  • 理解Android中的自定義屬性

    理解Android中的自定義屬性

    這篇文章主要介紹了理解Android中的自定義屬性,在android相關應用開發(fā)過程中,固定的一些屬性可能滿足不了開發(fā)的需求,所以需要自定義控件與屬性,本文將以此問題進行詳細介紹,需要的朋友可以參考下
    2016-01-01

最新評論

九寨沟县| 甘南县| 临武县| 马公市| 清新县| 盐边县| 香格里拉县| 吴旗县| 广河县| 宣武区| 星座| 太康县| 钦州市| 绍兴市| 太仆寺旗| 郑州市| 雅江县| 甘孜| 商丘市| 贡觉县| 公安县| 科技| 新民市| 丹东市| 罗定市| 红原县| 台南市| 澎湖县| 车致| 江口县| 茌平县| 连南| 德安县| 九龙县| 东平县| 前郭尔| 兰西县| 浙江省| 天镇县| 古蔺县| 雅江县|