Android 上无侵入的样式动态修改库

1,036 阅读2分钟
原文链接: ie8384.com

Luffy 是Android上一个无侵入的样式动态修改库。

Luffy 通过配置来修改指定view的样式,这个配置需要自己从服务端获取。

配置里包含了需要修改的view id以及样式,没有设置id的view也可以通过设置id的view的父view和子view一层层来找到。

view的id可通过apk反编译后的 /res/values/public.xml 找到,里面存储了name和id的对应列表。

配置示例

[
    {
        "version": "1.9.1.1",
        "style": [
            {
                "page": "com.showjoy.shop.module.user.UserFragment",
                "views": [
                    {
                        "id": "0x7f0e02cb",
                        "properties": {
                            "type": "text",
                            "text": "test",
                            "textColor": "#ff0000",
                            "background": "#ff0000",
                            "textSize": 20,
                            "image": "http://dsdsdd.png",
                            "visibility": 0
                        }
                    },
                    {
                        "id": "0x7f0e02cc",
                        "properties": {
                            "children": [
                                {
                                    "index": 1,
                                    "views": [
                                       {
                                            "id": "0x7f0e02cb",
                                             "properties": {
                                                "type": "text",
                                                "text": "test",
                                                "textColor": "#ff0000",
                                                "textSize": 20,
                                                "visibility": 0
                                            }
                                        }
                                    ]
                                }
                            ]
                        }
                    }
                ]
            }
        ]
    }
    ]
  • 1、 这是一个数组,每一项给指定的版本使用,因为每个版本的view id 可能不一样,层级也不一样。
  • 2、字段 style 是一个数组, 每一项表示一个页面,fragment或者activity
    • page: fragment或activity的全路径
    • views: 是一个数组,每一项表示一个需要修改的view
      • id: view的id,十六进制表示
      • properties: view的属性
        • type: view类型,目前支持 “text” or “image” or “view”
        • text: TextView的文字内容
        • textColor: TextView的文字颜色 “#ff0000”
        • textSize:TextView的文字大小, ‘20’
        • background:view的背景色
        • image: 图片链接,不支持本地图片
        • visibility: 0 表示 VISIBLE, 4 表示 INVISIBLE, 8 表示 GONE
        • children: 子view列表,可用来寻找没有设置id的view,以及listview这样含有重复id的view
          • index: 子view的位置
          • views: 同上面的 views
          • properties: 同上面的 properties
        • parent: 父view,也可用来选择没有设置id的view
          • views: 同上面的 views
          • properties: 同上面的 properties

在应用中使用Luffy

gradle依赖:

compile 'com.showjoy.android:luffy:1.0.0'

如果使用混淆,请加上以下这行:

-keep class com.showjoy.**.entities.** {*;}

源码https://github.com/ShowJoy-com/Luffy/

  • 1、如果要修改图片,首先请设置 image adapter
    Luffy.getInstance().setStyleImageAdapter(new IStyleImageAdapter() {
                @Override
                public void setImageUrl(View imageView, String imageUrl) {
                 //do sth like below...
                    if (imageView instanceof SHImageView) {
                        ((SHImageView)imageView).setImageUrl(imageUrl);
                    }else if (imageView instanceof ImageView) {
                        ((ImageView)imageView).setImageBitmap(ImageUtils.getNetBitmap(imageUrl));
                    }
                }
            });
            
  • 2、调用 parse 来解析配置
    Luffy.getInstance().parse(context, configuration);
  • 3、调用 doStyle 来改变样式,你可以在onresume的结尾调用它。大部分都会有baseFragment 和 baseActivity 或类似的类,只要在这样的基类的onresume的结尾调用即可。
    Luffy.getInstance().doStyle(activity);
    //or 
    //Luffy.getInstance().doStyle(fragment);
    
赏一个 您的支持是对我最大的鼓励。加班再忙,也要熬夜继续码字分享! 码字辛苦 赏个五毛 支持: 微信支付 支付宝

好人一生平安 谢谢!

微信支付 支付宝

用 [微信] 扫描二维码打赏

用 [支付宝] 扫描二维码打赏