静态换肤:BiuSkin2DN

2023年9月4日 pm5:51发布1年前 (2023)更新 城堡大人
252 0 0

前言

之前介绍Android的动态换肤(BiuSkin1PNA )和静态换肤(BiuSkin1DN)都是同一套方式,采集View属性,然后进行切换。比较完美,但缺点也是有的,采集的View属性越多,越占内存!

因此参考网上Android高级课程中的换肤方式,在其基础上,演变出第二种换肤方式:BiuSkin2。

BiuSkin2也分动态换肤和静态换肤,今天介绍的是第二种静态换肤库:BiuSkin2DN。

正文

BiuSkin2DN跟《静态换肤库:BiuSkin1DN》换肤机制不一样,但使用方法我这里都统一了,都差不多,唯一就是自定义View换肤需要自己按照要求修改。

如果对日夜模式不熟悉,可以看《再谈Android日夜模式》,这篇算是我比较全的记录。

下载

已经失效。。

隐藏内容!
评论可看后才能查看!

优点和缺点

优点
  1. 不需要采集View属性

  2. SkinManager接口简单

缺点
  1. 部分View不支持,已知的ProgressBar和Spinner

  2. 自定义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();
        }
    }
}

参考文章

  1. 参考网易云课堂的Android课程(课程下架了)

版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

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启动时间一些建议。启动时间是系统性能的重要组成部分,因为用户必须等待启动完成后才能使用设备。对于较常进行冷启动的汽车等设备而言,较短的启动时间至关重要(没有人喜欢在等待几十秒后才能输入导航目的地)。本文摘抄的,记录一下方便自己查看。正文优化引导加载程序...

西贝:路人

不知为何,明明想和你说话。却骗你说,风雨正好,该去写点诗句。 不必嘲讽我,你笑出声来,我也当是天籁。 不必怀有敌意,你所有心计,我都当是你对我的心意。 我的宿命分两段,未遇见你时,和遇见你以后。你治好我的忧郁,而后赐我悲伤。 忧郁和悲...

梁实秋:想我的母亲

我的母亲姓沈,杭州人。世居城内上羊市街。我在幼时曾侍母归宁,时外祖母尚在,年近八十。外祖父入学后,没有更进一步的功名,但是课子女读书甚严。我的母亲教导我们读书启蒙,尝说起她小时苦读的情形。她同我的两位舅父一起冬夜读书,冷得腿脚僵冻,取大竹篓一,实以败絮,三个人伸足其中以取暖。我当时听得惕然心惊,遂不...