使用插件化换肤
大家可以先去网易云客户端体验一下个性换肤。
可能大家会疑惑,为什么换个皮肤,还用上了插件化,给大家解释一下。
网易云的个性换肤是可以下载皮肤然后再切换的,那么下载皮肤其实就是在一个皮肤插件,当然只是用到这个插件中的res里面的资源,比如图片资源,color资源。
这也就是今天为什么要讲使用插件换肤,这是一个原因,第二个原因就是通过这个,大家会对插件化有一定的了解。
下面是我今天的demo演示,第一个图是切换背景颜色和textColor的颜色。
第二个图是切换背景图片和textColor的颜色。
我会给大家讲述原理,以及简单的实例,更多的应用,大家可以自行研究。
一下是换肤的大概步骤。
1,在baseActivity里面的super.onCreate(savedInstanceState);
方法之前添加监听。LayoutInflaterCompat.setFactory(getLayoutInflater(),factory);
2,创建一个factory类,实现接口LayoutInflaterFactory
3,在这个里面通过类加载器,使用接口返回的名字获取对应名字的控件。
4,把符合的控件和控件属性存储起来。
5,创建一个皮肤管理类,通过传入插件的路径,获取插件的包名,并且获取插件的resource对象。
6,通过宿主的resId去获取控件的资源名,通过资源名去插件中找到对应的控件resId,在通过这个resId在插件中得到对应资源的值,然后返回给宿主,用来替换,完成换肤。
7,这里用textColor和background两个属性进行试验。
为了模拟插件化,进行换肤,我们会用到两个apk,一个是宿主apk,就是安装在手机上的,顶部两个图片的示例;另外一个是皮肤的apk,这个apk我们直接复制到sd卡上就可以了,里面就只要用到color或者drawable里面的资源。
工程目录如下:
app:
皮肤的:
其中skin2皮肤工程,里面不需要写java代码,只要用到res里面的,如果是用到图片资源,那么图片的名字要和app里面的需要替换的名字相同,如果是用到color,那么color里面的对应的名字也要相同。
下面是代码:
MainActivity:
package andfix.shenbin.com.skindemo; import android.os.Bundle; import android.os.Environment; import android.view.View; import java.io.File; import andfix.shenbin.com.skindemo.struct.SkinManager; public class MainActivity extends SkinActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void change(View view) { File file = new File(Environment.getExternalStorageDirectory(),"skin.apk"); SkinManager.getInstance().loadSkin(file.getAbsolutePath()); updateSkin(); } }
SkinActivity:
package andfix.shenbin.com.skindemo; import android.app.Activity; import android.os.Bundle; import android.support.v4.view.LayoutInflaterCompat; import andfix.shenbin.com.skindemo.struct.SkinFactory; import andfix.shenbin.com.skindemo.struct.SkinManager; public class SkinActivity extends Activity { private SkinFactory factory = null; @Override protected void onCreate(Bundle savedInstanceState) { factory = new SkinFactory(); LayoutInflaterCompat.setFactory(getLayoutInflater(),factory); SkinManager.get