电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

基于Android-Skin-Loader實現換膚效果

瀏覽:52日期:2022-09-26 10:45:14

skin-loader框架的換膚是通過插件化的形式替換資源文件,實現換膚效果。好處是可以在線更新皮膚換膚

android-skin-loader源碼

Demo樣例

基于Android-Skin-Loader實現換膚效果

基于Android-Skin-Loader實現換膚效果

流程

整個框架大概的流程是加載皮膚包,找到被標記的控件,通過自定義的Factory工程過濾掉其他控件,使用皮膚包中的資源文件更新被標記的ui。

使用操作

1、導入android-skin-loader框架包 androidStudio File->new->import Module選擇android-skin-loader 項目右鍵->open Module Setting->app中加載依賴android-skin-loader庫

2、在MyApplication 初始化框架

SkinManager.getInstance().init(this);SkinManager.getInstance().load();

3、需要換膚的activity需要繼承skin-loader中的BaseActivity 需要換膚的控件添加skin:enable=”true”,控件xml添加命名空間xmlns:skin=”http://schemas.android.com/android/skin”

4、準備需要替換的color或drawable同名的資源文件包將其打包,重命名以.skin結尾 本地測試可以使用adb命令將.skin包放在sdcard adb push 文件目錄/test.skin /sdcard

樣例代碼

xml文件,使用databinding,不知道的自行百度

<?xml version='1.0' encoding='utf-8'?><layout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:skin='http://schemas.android.com/android/skin'> <LinearLayout android:layout_width='match_parent' android:layout_height='match_parent' android:orientation='vertical'> <LinearLayout android:layout_width='match_parent' android:layout_height='wrap_content' android:orientation='horizontal'> <Button android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:textColor='@color/text_color' android:background='@color/button_background' skin:enable='true' android:text='默認皮膚'/> <Button android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_marginLeft='20dp' android:textColor='@color/text_color' android:background='@color/button_background' skin:enable='true' android:text='更改皮膚'/> <Button android: android:layout_width='wrap_content' android:layout_height='wrap_content' android:layout_marginLeft='20dp' android:textColor='@color/text_color' android:background='@color/button_background' skin:enable='true' android:text='動態添加布局'/> </LinearLayout> <TextView android:layout_width='match_parent' android:layout_height='wrap_content' android:textColor='@color/text_color' android:text='文字文字文字文字文字文字' skin:enable='true' /> <ImageView android:layout_width='wrap_content' android:layout_height='wrap_content' android:src='http://www.hdgsjgj.cn/bcjs/@drawable/skin' skin:enable='true'/> <LinearLayout android: android:layout_width='match_parent' android:layout_height='wrap_content' skin:enable='true' android:orientation='vertical'> </LinearLayout> </LinearLayout></layout>

public class SkinChangeAct extends BaseActivity{ private ActivitySkinchangeBinding binding; //skin包名 private String SKIN_NAME = 'test.skin'; //skin皮膚包的路徑 private String SKIN_DIR = Environment.getExternalStorageDirectory()+ File.separator+SKIN_NAME; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_skinchange); //更換皮膚 binding.btnChangeSkin.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { File skin = new File(SKIN_DIR); if(skin == null || !skin.exists()){ Toast.makeText(getApplicationContext(), '請檢查' + SKIN_DIR + '是否存在', Toast.LENGTH_SHORT).show(); return; } SkinManager.getInstance().load(skin.getAbsolutePath(), new ILoaderListener() { @Override public void onStart() { System.out.println('start'); } @Override public void onSuccess() { System.out.println('onSuccess'); } @Override public void onFailed() { System.out.println('onFailed'); } }); } }); //恢復默認皮膚 binding.btnDefault.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { SkinManager.getInstance().restoreDefaultTheme(); } }); //動態加載控件 binding.btnAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { dynamicAddTextView(); } }); } /**動態添加textview*/ private void dynamicAddTextView() { TextView textView = new TextView(this); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.addRule(RelativeLayout.CENTER_IN_PARENT); textView.setLayoutParams(params); textView.setTextColor(SkinManager.getInstance().getColor(R.color.text_color)); textView.setText('hellohello'); textView.setTextSize(28); //將動態添加的布局也更換皮膚,否則之前添加的不能更改 List<DynamicAttr> mDanamicAttr = new ArrayList<DynamicAttr>(); mDanamicAttr.add(new DynamicAttr(AttrFactory.TEXT_COLOR,R.color.text_color)); dynamicAddView(textView,mDanamicAttr); binding.addLayout.addView(textView); }}

資源文件color.xml

<?xml version='1.0' encoding='utf-8'?><resources> <color name='colorPrimary'>#3F51B5</color> <color name='colorPrimaryDark'>#303F9F</color> <color name='colorAccent'>#FF4081</color> <color name='text_color'>#ff0000</color> <color name='button_background'>#00ff00</color></resources>

skin皮膚包中的資源文件color.xml

<?xml version='1.0' encoding='utf-8'?><resources> <color name='colorPrimary'>#3F51B5</color> <color name='colorPrimaryDark'>#303F9F</color> <color name='colorAccent'>#FF4081</color> <color name='text_color'>#ffff00</color> <color name='button_background'>#00ffff</color></resources>

對比一下,只是更改了數值,名字相同。

框架迭代,增加功能

android-skin-loader框架是沒有對于src屬性的修改,案例中使用imageView模擬了src的更改。 在AttrFactory中增加對于src的支持

public class AttrFactory { public static final String BACKGROUND = 'background'; public static final String TEXT_COLOR = 'textColor'; public static final String LIST_SELECTOR = 'listSelector'; public static final String DIVIDER = 'divider'; //增加src屬性 public static final String SRC='http://www.hdgsjgj.cn/bcjs/src'; public static SkinAttr get(String attrName, int attrValueRefId, String attrValueRefName, String typeName){ SkinAttr mSkinAttr = null; System.out.println('attrName='+attrName); if(BACKGROUND.equals(attrName)){ mSkinAttr = new BackgroundAttr(); }else if(TEXT_COLOR.equals(attrName)){ mSkinAttr = new TextColorAttr(); }else if(LIST_SELECTOR.equals(attrName)){ mSkinAttr = new ListSelectorAttr(); }else if(DIVIDER.equals(attrName)){ mSkinAttr = new DividerAttr(); }else if(SRC.equals(attrName)){ //自定義加載src mSkinAttr =new SrcAttr(); }else{ return null; } mSkinAttr.attrName = attrName; mSkinAttr.attrValueRefId = attrValueRefId; mSkinAttr.attrValueRefName = attrValueRefName; mSkinAttr.attrValueTypeName = typeName; return mSkinAttr; } /** * Check whether the attribute is supported * @param attrName * @return true : supported <br> * false: not supported */ public static boolean isSupportedAttr(String attrName){ if(BACKGROUND.equals(attrName)){ return true; } if(TEXT_COLOR.equals(attrName)){ return true; } if(LIST_SELECTOR.equals(attrName)){ return true; } if(DIVIDER.equals(attrName)){ return true; } //支持src if(SRC.equals(attrName)){ return true; } return false; }}

srcAttr繼承SkinAttr定義加載src

public class SrcAttr extends SkinAttr{ @Override public void apply(View view) { if(view instanceof ImageView){ ImageView imageView = (ImageView) view; if(RES_TYPE_NAME_COLOR.equals(attrValueTypeName)){ imageView.setImageResource(SkinManager.getInstance().getColor(attrValueRefId)); }else if(RES_TYPE_NAME_DRAWABLE.equals(attrValueTypeName)){ Drawable bg = SkinManager.getInstance().getDrawable(attrValueRefId); imageView.setImageDrawable(bg); } } }}

各種控件的支持都可以自己添加。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
主站蜘蛛池模板: 齿轮减速机电机一体机_齿轮减速箱加电机一体化-德国BOSERL蜗轮蜗杆减速机电机生产厂家 | 氨水-液氨-工业氨水-氨水生产厂家-辽宁顺程化工 | 平面钻,法兰钻,三维钻-山东兴田阳光智能装备股份有限公司 | 密集架-手摇-智能-移动-价格_内蒙古档案密集架生产厂家 | 无水硫酸铝,硫酸铝厂家-淄博双赢新材料科技有限公司 | 清管器,管道清管器,聚氨酯发泡球,清管球 - 承德嘉拓设备 | wika威卡压力表-wika压力变送器-德国wika代理-威卡总代-北京博朗宁科技 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 东莞市海宝机械有限公司-不锈钢分选机-硅胶橡胶-生活垃圾-涡电流-静电-金属-矿石分选机 | 拖鞋定制厂家-品牌拖鞋代加工厂-振扬实业中国高端拖鞋大型制造商 | 东莞猎头公司_深圳猎头公司_广州猎头公司-广东万诚猎头提供企业中高端人才招聘服务 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 粘度计维修,在线粘度计,二手博勒飞粘度计维修|收购-天津市祥睿科技有限公司 | 数控车床-立式加工中心-多功能机床-小型车床-山东临沂金星机床有限公司 | 减速机三参数组合探头|TSM803|壁挂式氧化锆分析仪探头-安徽鹏宸电气有限公司 | 美甲贴片-指甲贴片-穿戴美甲-假指甲厂家--薇丝黛拉 | 办公室家具_板式办公家具定制厂家-FMARTS福玛仕办公家具 | 铝机箱_铝外壳加工_铝外壳厂家_CNC散热器加工-惠州市铂源五金制品有限公司 | 紫外线老化试验箱_uv紫外线老化试验箱价格|型号|厂家-正航仪器设备 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 慈溪麦田广告公司,提供慈溪广告设计。 | YAGEO国巨电容|贴片电阻|电容价格|三星代理商-深圳市巨优电子有限公司 | 高温热泵烘干机,高温烘干热泵,热水设备机组_正旭热泵 | 电动车头盔厂家_赠品头盔_安全帽批发_山东摩托车头盔—临沂承福头盔 | 重庆LED显示屏_显示屏安装公司_重庆LED显示屏批发-彩光科技公司 重庆钣金加工厂家首页-专业定做监控电视墙_操作台 | 广州市哲铭油墨涂料有限公司,水性漆生产研发基地 | 工控机-图像采集卡-PoE网卡-人工智能-工业主板-深圳朗锐智科 | 无负压供水设备,消防稳压供水设备-淄博创辉供水设备有限公司 | 多功能真空滤油机_润滑油全自动滤油机_高效真空滤油机价格-重庆润华通驰 | 中高频感应加热设备|高频淬火设备|超音频感应加热电源|不锈钢管光亮退火机|真空管烤消设备 - 郑州蓝硕工业炉设备有限公司 | 据信,上课带着跳 D 体验-别样的课堂刺激感受引发网友热议 | 噪声治理公司-噪音治理专业隔音降噪公司 | 蒸压釜_蒸养釜_蒸压釜厂家-山东鑫泰鑫智能装备有限公司 | 政府园区专业委托招商平台_助力企业选址项目快速落地_东方龙商务集团 | 自动气象站_气象站监测设备_全自动气象站设备_雨量监测站-山东风途物联网 | 3d打印服务,3d打印汽车,三维扫描,硅胶复模,手板,快速模具,深圳市精速三维打印科技有限公司 | 浙江上沪阀门有限公司 | 上海噪音治理公司-专业隔音降噪公司-中广通环保 | 手表腕表维修保养鉴定售后服务中心网点 - 名表维修保养 | 多功能干燥机,过滤洗涤干燥三合一设备-无锡市张华医药设备有限公司 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 |