今天看到有同事在群里聊到仿QQQ 皮肤切换主题,然后我就试着写一个简单的Demo希望大家能够支持下!

像以前扣扣换肤

废话不多说上效果

思路如下

通过应用程序内置资源实现换肤,典型的应用为QQ空间中换肤的实现. 应用场景为: 应用一般不大,且页面较少,风格相对简单,一般只用实现部分资源或者只用实现背景的更换.
此种换肤方式实现的思路:
1. 把几套皮肤放在res/drawable目录里,然后用SharedPreferences来记录当前皮肤的资源id.然后在程序启动时加载Activity背景。
2. 主要的实现在皮肤管理器SkinSettingManager类中. 将皮肤资源的ID加入集合中. 由该类同一调度皮肤更换,如初始化皮肤,获取当前皮肤符号以及具体的对应资源的更换皮肤.

SkinSettingManager

package com.zm.util;

import com.zm.recordtest.R;

import android.app.Activity;
import android.content.SharedPreferences;

public class SkinSettingManager {
public final static String SKIN_PREF="skinSetting";
private SharedPreferences sp;
private int[] skinResources={
R.drawable.gril,R.drawable.grl2,R.drawable.grl3,R.drawable.grl4,
R.drawable.grl5
};
private Activity mActivity;
public SkinSettingManager(Activity activity){
this.mActivity=activity;
sp=mActivity.getSharedPreferences(SKIN_PREF, 3);

}
public int SkinType(){
String key="skin_type";
return sp.getInt(key, 0);
}
   public void setSkinType(int j){
  SharedPreferences.Editor editor=sp.edit();
  String key="skin_type";
  editor.putInt(key, j);
  editor.commit();
   }
   /**
    * 获取当前皮肤背景图片资源
    * 
    */
   public int getCurrentSkinRes(){
  int skinLen=skinResources.length;
  int getSkinlen=SkinType();
  //如果刚好等于从第一张开始
  if(getSkinlen>=skinLen){
  getSkinlen=0;
  }
  return skinResources[getSkinlen];
   }
   public void toggleSkins(){
  int skinType=SkinType();
  if(skinType==skinResources.length-1){
  skinType=0;
  }else{
  skinType++;
  }
  setSkinType(skinType);
  mActivity.getWindow().setBackgroundDrawable(null);
  try {
mActivity.getWindow().setBackgroundDrawableResource(getCurrentSkinRes());
} catch (Exception 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 (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
  
   }
   
}

然后主SkinActivty

package com.zm.recordtest;

import com.zm.util.LogUtil;
import com.zm.util.SkinSettingManager;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;

public class SkinActivity extends Activity {

private RadioGroup rg;
private RadioButton rd1,rd2,rd3,rd4,rd5;
private SkinSettingManager manager;

@Override
protected void onCreate(Bundle savedInstanceState) {
//隐藏标题
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
//全屏显示
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.activity_skin);
manager=new SkinSettingManager(this);
//初始化主题
manager.initSkins();
initView();
}

private void initView() {

//初始化
rg=(RadioGroup) findViewById(R.id.skin_options);
rd1=(RadioButton) findViewById(R.id.rd1);
rd2=(RadioButton) findViewById(R.id.rd2);
rd3=(RadioButton) findViewById(R.id.rd3);
rd4=(RadioButton) findViewById(R.id.rd4);
rd5=(RadioButton) findViewById(R.id.rd5);
rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
//设置点击事件
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// 点击raidobutton切换不同主题皮肤
switch (checkedId) {
case R.id.rd1:
manager.changeSkin(1);
//LogUtil.i("换皮肤", "切换第"+checkedId+"皮肤");

break;
                case R.id.rd2:
                manager.changeSkin(2);
                //LogUtil.i("换皮肤", "切换第"+checkedId+"皮肤");

break;
                case R.id.rd3:
                manager.changeSkin(3);
                //LogUtil.i("换皮肤", "切换第"+checkedId+"皮肤");
               break;
                case R.id.rd4:
                manager.changeSkin(4);
                //LogUtil.i("换皮肤", "切换第"+checkedId+"皮肤");
               break;
                case R.id.rd5:
                manager.changeSkin(5);
                //LogUtil.i("换皮肤", "切换第"+checkedId+"皮肤");
               break;

default:
break;
}
}
});
}
// 实现换肤 
public boolean onTouchEvent(MotionEvent event) { 
manager.toggleSkins(); 
 return super.onTouchEvent(event); 

 
 
}

Android美女一键换肤相关推荐

  1. opengl源码 实现无缝切换图片过场_手把手讲解 Android hook技术实现一键换肤

    前言 产品大佬又提需求啦,要求app里面的图表要实现白天黑夜模式的切换,以满足不同光线下都能保证足够的图表清晰度. 怎么办?可能解决的办法很多,你可以给图表view增加一个toggle方法,参数Str ...

  2. Android一键换肤原理简述

    简介 Android对应用进行换肤操作,首先要生成一个对应的皮肤包,在要换肤的应用中收集需要换肤的控件,获取皮肤包里的资源,一键换肤时遍历View树,对要换肤的控件进行换肤.下面总结为4个步骤 步骤 ...

  3. android换肤的实现方案,Android应用开发之Android一键换肤功能实现

    本文将带你了解Android应用开发之Android一键换肤功能实现,希望本文对大家学Android有所帮助. < 市面上对数的App都提供换肤功能,这里暂且不讲白天和夜间模式 下图是网易云音乐 ...

  4. Android hook技术实现一键换肤,移动应用开发项目案例

    3. 利用HOOK技术实现优雅的"一键换肤" 什么是hook **如题,我是用hook实现一键换肤.那么什么是hook? hook,钩子. 安卓中的hook技术,其实是一个抽象概念 ...

  5. 三步实现Android应用内一键换肤,无需重启应用,无需编写多余代码

    古人学问无遗力,少壮工夫老始成. 纸上得来终觉浅,绝知此事要躬行. --<冬夜读书示子聿> · 陆游 换肤效果演示 四种皮肤切换:默认白色.蓝色.绿色和玫瑰红: 前言 先给大家介绍一下现在 ...

  6. android换肤的实现方案,一种基于Android平台的一键换肤方法与流程

    本发明属于互联网技术领域,尤其涉及一种基于Android平台的一键换肤方法. 背景技术: 换肤性能的添加在很大的程度上面提高了用户的体验感,用户可以根据自己喜好选择自己喜欢的皮肤颜色,并且我们针对不同 ...

  7. Android通过Hook技术实现一键换肤

    目录 1.什么是一键换肤 2.界面上那些东西可以换肤 3.利用Hook实现一键换肤 4.Android创建视图源码分析 4.1.自定义Activity设置要显示的布局文件xml 4.2.调用兼容App ...

  8. wegame一键蹲替换文件_手把手讲解 Android hook技术实现一键换肤

    前言 产品大佬又提需求啦,要求app里面的图表要实现白天黑夜模式的切换,以满足不同光线下都能保证足够的图表清晰度. 怎么办?可能解决的办法很多,你可以给图表view增加一个toggle方法,参数Str ...

  9. Android插件化的思考——仿QQ一键换肤,思考比实现更重要!

    Android插件化的思考--仿QQ一键换肤,思考比实现更重要! 今天群友希望写一个关于插件的Blog,思来想去,插件也不是很懂,只是用大致的思路看看能不能模拟一个,思路还是比较重要的,如果你有兴趣的 ...

最新文章

  1. extjs4.0视频教程下载
  2. 开学很忙,故障很强(1)!!
  3. Wince6.0应用开发:一、平台搭建
  4. 面试中被问到HashMap的结构,1.7和1.8有哪些区别?这篇做深入分析!
  5. 保持代码工整的 7 个小技巧
  6. Unity3d动画脚本 Animation Scripting(深入了解游戏引擎中的动画处理原理)
  7. Cisdem DVD Burner for Mac(DVD光盘刻录软件)
  8. js中获取中文相应gbk编码
  9. ADAS/AD控制器模块开发03 - 系统架构设计及通用需求定义
  10. web - 前端特效和博客
  11. 多版本谷歌chrome浏览器并存(谷歌浏览器从C盘移植)
  12. RK3288 资源汇总
  13. windows10安装keras教程
  14. 2022年Web 前端怎样入门?最新Web前端入门的学习路线
  15. 乐鑫ESP32 NVS读错误BUG:nvs_get_blob
  16. 桥 Gym100712H Bridges
  17. weinre调试环境搭建
  18. gem5下用se模式运行自己的测试程序
  19. 解决WIN10隔几分钟就自动黑屏睡眠的方法!
  20. 关于参加大数据培训机构有没有用的一些想法

热门文章

  1. 01_MIPS架构初探
  2. 国密SM9算法C++实现之五:签名验签算法
  3. 戴尔计算机的硬件配置情况,戴尔g3怎么查电脑配置
  4. maven 使用tomcat插件启动报错 A child container failed during start
  5. VC++武汉科技大学机械自动化学院
  6. 制作PPT模板图片排版的创意设计技巧有哪些?
  7. 云南大学软件学院java实验九_云南大学软件学院Java实验二
  8. 视频教程-C#Winform窗体与界面设计-C#
  9. 最近自己做的企业应用(思维导图、战略地图、表单设计器、商业智能、平衡计分卡)
  10. 正版office2007标准版