通过应用程序内置资源实现换肤,典型的应用为QQ空间中换肤的实现. 应用场景为: 应用一般不大,且页面较少,风格相对简单,一般只用实现部分资源或者只用实现背景的更换.
此种换肤方式实现的思路:
1. 把几套皮肤放在res/drawable目录里,然后用SharedPreferences来记录当前皮肤的资源id.然后在程序启动时加载Activity背景。
2. 主要的实现在皮肤管理器SkinManager类中. 将皮肤资源的ID加入集合中. 由该类同一调度皮肤更换,如初始化皮肤,获取当前皮肤符号以及具体的对应资源的更换皮肤.
接下来看一下效果图:
内置皮肤的实现相对比较简单,下面直接上代码:
AndroidMainfest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tony.skindemo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name="com.tony.skindemo.SkinDemoActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
布局文件:
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:textColor="#ff00ff"
android:text="程序皮肤更换"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<RadioGroup
android:id="@+id/skin_options"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<RadioButton
android:layout_weight="1"
android:id="@+id/radioButton1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="风格1" />
<RadioButton
android:layout_weight="1"
android:id="@+id/radioButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="风格2" />
<RadioButton
android:layout_weight="1"
android:id="@+id/radioButton3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="风格3" />
<RadioButton
android:layout_weight="1"
android:id="@+id/radioButton4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="风格4" />
<RadioButton
android:layout_weight="1"
android:id="@+id/radioButton5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="风格5" />
</RadioGroup>
</LinearLayout>
程序主Activity
package com.tony.skindemo;
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 SkinDemoActivity extends Activity {
private SkinSettingManager mSettingManager;
private RadioButton radioButton1;
private RadioButton radioButton2;
private RadioButton radioButton3;
private RadioButton radioButton4;
private RadioButton radioButton5;
@Override
public 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.main);
// 初始化皮肤
mSettingManager = new SkinSettingManager(this);
mSettingManager.initSkins();
//通过单选按钮设置皮肤(可自定义更换的方式,如导航栏,也可以加上预览功能,此处不再实现)
radioButton1 = (RadioButton) findViewById(R.id.radioButton1);
radioButton2 = (RadioButton) findViewById(R.id.radioButton2);
radioButton3 = (RadioButton) findViewById(R.id.radioButton3);
radioButton4 = (RadioButton) findViewById(R.id.radioButton4);
radioButton5 = (RadioButton) findViewById(R.id.radioButton5);
RadioGroup radioGroup = (RadioGroup) findViewById(R.id.skin_options);
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.radioButton1:
mSettingManager.changeSkin(1);
break;
case R.id.radioButton2:
mSettingManager.changeSkin(2);
break;
case R.id.radioButton3:
mSettingManager.changeSkin(3);
break;
case R.id.radioButton4:
mSettingManager.changeSkin(4);
break;
case R.id.radioButton5:
mSettingManager.changeSkin(5);
break;
default:
break;
}
}
});
}
// 这里为了简单实现,实现换肤
public boolean onTouchEvent(MotionEvent event) {
mSettingManager.toggleSkins();
return super.onTouchEvent(event);
}
}
皮肤管理器:
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等资源,实现更加复杂的皮肤更换. 具体实现同更换背景.
分享到:
相关推荐
该资源是 Android 应用实现换肤功能的demo程序,同时也是博客文章:http://blog.csdn.net/janice0529/article/details/39999727 中demo程序, 博客中有详细的demo程序设计介绍。
程序:用VC实现给应用程序动态换肤 运行环境:win2000 vc6
android应用程序内部换肤 博客地址:http://blog.csdn.net/hailushijie/article/details/9427651
运用android动态加载技术实现的换肤功能实现,详情可关注http://blog.csdn.net/jan_s/article/details/48393003 最近因博主缺分下载,下载求分啊哈哈
易语言:微换肤模块 易语言:微换肤模块 易语言:微换肤模块 易语言:微换肤模块 易语言:微换肤模块 易语言:微换肤模块 易语言:微换肤模块
irisskin4用以实现winform界面换肤美化,包含多种皮肤,随意替换使用
Android-skin-support: 一款用心去做的Android 换肤框架, 极低的学习成本, 极好的用户体验.
也就是更改系统主题风格,可在“应用透明背景的主题”、“应用布景主题1”、“应用布景主题2”三种皮肤风格之间切换,Android换肤对Android手机来说是再简单不过的功能了,个性化功能强也是Android智能机的一大卖点
apk方式实现android应用程序换肤。 文章:http://blog.csdn.net/hailushijie/article/details/9454679
Android-skin-support ...只需要两行代码, 就可以实现换肤, 你值得拥有!!! 第一行: 在Application的onCreate中初始化 SkinCompatManager.init(this).loadSkin(); 第二行: 继承自SkinCompatActivity public
js+css实现换肤功能 js+css实现换肤功能 js+css实现换肤功能 js+css实现换肤功能
Android 主题换肤 插件化换肤 无缝切换
vc实现换肤程序vc实现换肤程序vc实现换肤程序vc实现换肤程序vc实现换肤程序vc实现换肤程序vc实现换肤程序vc实现换肤程序vc实现换肤程序vc实现换肤程序vc实现换肤程序vc实现换肤程序
换肤功能——WPF实现的CS结构桌面程序的换肤功能,大家都用过Web上的换肤功能,这个例子就是用WPF实现的为桌面程序实现换肤的功能。
简单实现android换肤原理,修改string drawable style等
1、ListCtrl和HeaderCtrl支持共用位图底图,可以整个应用程序使用同一张完整底图图片,完美实现换肤等需要; 2、ListCtrl和HeaderCtrl支持独立位图底图,绘制背景时各自使用自己的独立底图; 3、ListCtrl和...
Android 主题换肤-给要换肤的view打标签 给页面中需要的view设置标签来适配换肤 更新日志 效果图 支持 支持 textColor,textColorHint,background,src,drawableTop、drawableLeft、drawableRight、drawableBottom ...
android 换肤项目是dialog和imagebutton的结合体,还可以实现随机换肤
android下换肤实现,类似go桌面的方式
JSF2.0实战 - 8、实现换肤功能源代码