目录
前言
之前介绍Android的动态换肤(BiuSkin1PNA )和静态换肤(BiuSkin1DN)都是同一套方式,采集View属性,然后进行切换。比较完美,但缺点也是有的,采集的View属性越多,越占内存!
因此参考网上Android高级课程中的换肤方式,在其基础上,演变出第二种换肤方式:BiuSkin2。
BiuSkin2也分动态换肤和静态换肤,今天介绍的是第二种静态换肤库:BiuSkin2DN。
正文
BiuSkin2DN跟《》换肤机制不一样,但使用方法我这里都统一了,都差不多,唯一就是自定义View换肤需要自己按照要求修改。
如果对日夜模式不熟悉,可以看《》,这篇算是我比较全的记录。
下载
已经失效。。
优点和缺点
优点
-
不需要采集View属性
-
SkinManager接口简单
缺点
-
部分View不支持,已知的ProgressBar和Spinner
-
自定义View需要重写换肤View
接口
SkinManager
皮肤管理中心,核心类。
SkinManager.initContext(this, false); SkinManager.getInstance().setISkinRefreshListener(this); SkinManager.getInstance().changeSkin();
ISkinRefreshListener
public interface ISkinRefreshListener { View onSkinRefresh(Context context, String name, AttributeSet attrs); }
IBiuSkin
自定义View需要实现的接口,换肤是回调onSwitchView()
public interface IBiuSkin { void onSwitchView(); }
SkinResource
自定义View需要
public void addResourceIdArray(int[] styleAble, TypedArray typedArray); public int getResourceId(int styleAble); public void clear();
自定义View换肤
参考TextView的换肤替代View:BiuTextView
res/valuse/attrs.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="BiuTextView"> <attr name="android:background" /> <attr name="android:textColor" /> <attr name="android:textSize" /> </declare-styleable> </resources>
BiuTextView.java
public class BiuTextView extends AppCompatTextView implements IBiuSkin { private final SkinResource mSkinResource; public BiuTextView(Context context) { this(context, null); } public BiuTextView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public BiuTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mSkinResource = new SkinResource(); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BiuTextView, defStyleAttr, 0); mSkinResource.addResourceIdArray(R.styleable.BiuTextView, typedArray); typedArray.recycle(); } @Override public void onSwitchView() { int backgroundResourceId = mSkinResource.getResourceId(R.styleable.BiuTextView[ R.styleable.BiuTextView_android_background]); if (backgroundResourceId > 0) { Drawable drawable = ContextCompat.getDrawable(getContext(), backgroundResourceId); setBackgroundDrawable(drawable); } int textColorResourceId = mSkinResource.getResourceId(R.styleable.BiuTextView[ R.styleable.BiuTextView_android_textColor]); if (textColorResourceId > 0) { setTextColor(ContextCompat.getColorStateList(getContext(), textColorResourceId)); } int textSizeId = mSkinResource.getResourceId(R.styleable.BiuTextView[ R.styleable.BiuTextView_android_textSize]); if (textSizeId > 0) { setTextSize(getResources().getDimensionPixelSize(textSizeId)); } } @Override public void onDetachedFromWindow() { super.onDetachedFromWindow(); if (null != mSkinResource) { mSkinResource.clear(); } } }
参考文章
-
参考网易云课堂的Android课程(课程下架了)
暂无评论...
随机推荐
startService分析(1)
Service的源码路劲:base\core\java\android\app\Service.java,我们从Service.java开始入手。Service的启动方式有两种,一种是stopService(Intent name),另一种是bindService(Intent serv...
冰心:一日的春光
去年冬末,我给一位远方的朋友写信,曾说:“我要尽量的吞咽今年北平的春天。”今年北平的春天来的特别的晚,而且在还不知春在哪里的时候,抬头忽见黄尘中绿叶成荫,柳絮乱飞,才晓得在厚厚的尘沙黄幕之后,春还未曾露面,已悄悄的远引了。天下事都是如此——去年冬天是特别的冷,也显得特别的长。每天夜里,灯下孤坐...
解决java.io.File android.content.Context.getDatabasePath(java.lang.String)
前言首先,这个问题有点神奇。比如,出现问题的原因:new.SQLiteOpenHelper()时,Context不能是Application的Context如果传入Application,会java.io.File android.content.Context.getDatabasePat...
[摘]Android启动时间优化
前言简单摘抄一下优化Android启动时间一些建议。启动时间是系统性能的重要组成部分,因为用户必须等待启动完成后才能使用设备。对于较常进行冷启动的汽车等设备而言,较短的启动时间至关重要(没有人喜欢在等待几十秒后才能输入导航目的地)。本文摘抄的,记录一下方便自己查看。正文优化引导加载程序...
西贝:路人
不知为何,明明想和你说话。却骗你说,风雨正好,该去写点诗句。 不必嘲讽我,你笑出声来,我也当是天籁。 不必怀有敌意,你所有心计,我都当是你对我的心意。 我的宿命分两段,未遇见你时,和遇见你以后。你治好我的忧郁,而后赐我悲伤。 忧郁和悲...
梁实秋:想我的母亲
我的母亲姓沈,杭州人。世居城内上羊市街。我在幼时曾侍母归宁,时外祖母尚在,年近八十。外祖父入学后,没有更进一步的功名,但是课子女读书甚严。我的母亲教导我们读书启蒙,尝说起她小时苦读的情形。她同我的两位舅父一起冬夜读书,冷得腿脚僵冻,取大竹篓一,实以败絮,三个人伸足其中以取暖。我当时听得惕然心惊,遂不...