分析Android App中内置换肤功能的实现方式

2019-12-10 18:58:36于丽

皮肤管理器: 
 

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中取出该集合,进行遍历并更换皮肤。