Android 制造自己的个性化应用(二):应用程序内置资源实现换肤功能

Android 打造自己的个性化应用(二):应用程序内置资源实现换肤功能通过应用程序内置资源实现换肤,典型的应

Android 打造自己的个性化应用(二):应用程序内置资源实现换肤功能

    通过应用程序内置资源实现换肤,典型的应用为QQ空间中换肤的实现. 应用场景为: 应用一般不大,且页面较少,风格相对简单,一般只用实现部分资源或者只用实现背景的更换.

   此种换肤方式实现的思路:

  1. 把几套皮肤放在res/drawable目录里,然后用SharedPreferences来记录当前皮肤的资源id.然后在程序启动时加载Activity背景。

  2. 主要的实现在皮肤管理器SkinManager类中. 将皮肤资源的ID加入集合中. 由该类同一调度皮肤更换,如初始化皮肤,获取当前皮肤符号以及具体的对应资源的更换皮肤.


    接下来看一下效果图:

    Android 制造自己的个性化应用(二):应用程序内置资源实现换肤功能


Android 制造自己的个性化应用(二):应用程序内置资源实现换肤功能



内置皮肤的实现相对比较简单,下面直接上代码:


AndroidMainfest.xml

package com.tony.skindemo;import android.app.Activity;import android.content.SharedPreferences;/** * 皮肤管理器 * @author tony * */public class SkinSettingManager {public final static String SKIN_PREF = "skinSetting";public SharedPreferences skinSettingPreference;private int[] skinResources = { R.drawable.default_wallpaper,R.drawable.wallpaper_c,R.drawable.wallpaper_d,R.drawable.wallpaper_f,R.drawable.wallpaper_g};private Activity mActivity;public SkinSettingManager(Activity activity) {this.mActivity = activity;skinSettingPreference = mActivity.getSharedPreferences(SKIN_PREF, 3);}/** * 获取当前程序的皮肤序号 *  * @return */public int getSkinType() {String key = "skin_type";return skinSettingPreference.getInt(key, 0);}/** * 把皮肤序号写到全局设置里去 *  * @param j */public void setSkinType(int j) {SharedPreferences.Editor editor = skinSettingPreference.edit();String key  = "skin_type";editor.putInt(key, j);editor.commit();}/** * 获取当前皮肤的背景图资源id *  * @return */public int getCurrentSkinRes() {int skinLen = skinResources.length;int getSkinLen = getSkinType();if(getSkinLen >= skinLen){getSkinLen = 0;}return skinResources[getSkinLen];}public void toggleSkins(){int skinType = getSkinType();if(skinType == skinResources.length - 1){skinType = 0;}else{skinType ++;}setSkinType(skinType);mActivity.getWindow().setBackgroundDrawable(null);try {mActivity.getWindow().setBackgroundDrawableResource(getCurrentSkinRes());} catch (Throwable e) {e.printStackTrace();}}/** * 用于初始化皮肤 */public void initSkins(){mActivity.getWindow().setBackgroundDrawableResource(getCurrentSkinRes());}/** * 随即切换一个背景皮肤 */public void changeSkin(int id) {setSkinType(id);mActivity.getWindow().setBackgroundDrawable(null);try {mActivity.getWindow().setBackgroundDrawableResource(getCurrentSkinRes());} catch (Throwable e) {e.printStackTrace();}}}

就这样,通过程序内置皮肤的基本功能完成了.

若想在自己的应用中实现,仍需注意以下几点(实现起来并不复杂,此处不再写具体实现):

1.  实现多个activity的更换皮肤. 需要利用自定义MyApplication类,继承自Application. 并加入activity的集合属性.用于存储应用所有的activity

    修改SkinManager,在更换皮肤时,从application中取出该集合,进行遍历并更换皮肤


2. 可以优化用户体验,通过导航栏方式进入更换皮肤界面,并可以加入预览功能,当确定修改配置后,才完成更换皮肤功能.

3. 加入style.theme等资源,实现更加复杂的皮肤更换. 具体实现同更换背景.