您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    Kotlin 作风,应该这样写drawable !
    时间:2021-08-18 12:07 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    通常我们在res/drawable下面自定义shape和selector来满足一些UI的设计,但是由于xml最终转换为drawable需求经过IO或反射创立,会有一些功用损耗,另外随着项目的增大和模块化等,很多通用的样式并不能快速复用,需求合理的项目资源管理标准才能实施。那么经过代码直接创立这些drawable,可以在一定水平上降低这些反作用。本篇引见用kotlin DSL繁复的语法特性来完成常见的drawable。

    Kotlin 作风,应该这样写drawable !

    代码对应效果预览

    Kotlin 作风,应该这样写drawable !

    Kotlin 作风,应该这样写drawable !

    Kotlin 作风,应该这样写drawable !

    Kotlin 作风,应该这样写drawable !

    集成和运用

    在项目级的build.gradle文件种添加仓库Jitpack:

    allprojects { 

        repositories { 

            ... 

            maven { url 'https://jitpack.io' } 

        } 

    添加依赖

    dependencies {   

     implementation 'com.github.forJrking:DrawableDsl:0.0.3’ 

    丢弃xml创立方式示例(其他参见demo)

    // infix用法用于去掉括号愈加繁复,详细前面阐明 

    image src shapeDrawable { 

        //指定shape样式 

        shape(ShapeBuilder.Shape.RECTANGLE) 

        //圆角,支持4个角独自设置 

        corner(20f) 

        //solid 颜色 

        solid("#ABE2E3"

        //stroke 颜色,边框dp,虚线设置 

        stroke(R.color.white, 2f, 5f, 8f) 

    //按钮点击样式 

    btn.background = selectorDrawable { 

        //默许样式 

        normal = shapeDrawable { 

            corner(20f) 

            gradient(90, R.color.F97794, R.color.C623AA2) 

        } 

        //点击效果 

        pressed = shapeDrawable { 

            corner(20f) 

            solid("#84232323"

        } 

    完成思绪 xml如何转换成drawable

    xml变成drawable,经过android.graphics.drawable.DrawableInflater这个类来IO解析标签创立,然后经过解析标签再设置属性:

    //标签创立 

    private Drawable inflateFromTag(@NonNull String name) { 

        switch (name) { 

            case "selector"

                return new StateListDrawable(); 

            case "level-list"

                return new LevelListDrawable(); 

            case "layer-list"

                return new LayerDrawable(); 

            .... 

            case "color"

                return new ColorDrawable(); 

            case "shape"

                return new GradientDrawable(); 

            case "vector"

                return new VectorDrawable(); 

            ... 

        } 

    //反射创立 

    private Drawable inflateFromClass(@NonNull String className) { 

        try { 

            Constructor<? extends Drawable> constructor; 

            synchronized (CONSTRUCTOR_MAP) { 

                constructor = CONSTRUCTOR_MAP.get(className); 

                if (constructor == null) { 

    (责任编辑:admin)