下面我要讲的便是如何实现换肤功能。众所周知,现在的手机应用大部分都支持这个功能,可是如何换肤呢?介绍这方面的博客倒还真不太多,所以我希望看完我的这篇博客会对大家有所启发,有所帮助,我就特别开心了。
首先是效果图:
首先是皮肤设置的主要java代码:
package com.genius.demo;
import com.genius.adapter.ImageAdapter;
import com.genius.widget.Settings;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.Toast;
/**
* @author Google_acmer
*
*/
public class SkinSettingActivity extends SettingActivity{
private GridView gv_skin; //网格视图
private ImageAdapter adapter; //图片适配器
private Settings mSetting; //设置引用
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.skinsetting_layout);
resultCode = 2;
mSetting = new Settings(this, true);
SkinSettingActivity.this.getWindow().setBackgroundDrawableResource(Settings.SKIN_RESOURCES[6]);
adapter = new ImageAdapter(this, mSetting.getCurrentSkinId());
gv_skin = (GridView) findViewById(R.id.gv_skin);
gv_skin.setAdapter(adapter);
gv_skin.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//更新GridView
adapter.setCurrentId(position);
//更新背景图片
SkinSettingActivity.this.getWindow().setBackgroundDrawableResource(Settings.SKIN_RESOURCES[position]);
//保存数据
mSetting.setCurrentSkinResId(position);
SharedPreferences preferences;
preferences = getSharedPreferences("data", 0);
preferences.edit().putInt("background_id", position).commit();
//Toast.makeText(SkinSettingActivity.this, "位置"+preferences.getInt("id", 0), Toast.LENGTH_SHORT);
}
});
}
}
package com.genius.demo;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;
public class SettingActivity extends Activity {
public int resultCode = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
if(resultCode != -1) {
setResult(resultCode);
}
finish();
}
return super.onKeyDown(keyCode, event);
}
}
接下来需要在MusicPlayActivity里调用
Intent intent = new Intent(MusicPlayActivity.this,SkinSettingActivity.class);
startActivityForResult(intent, 1);
注意要复写回调函数,这里如果不太懂可以参考文章http://blog.csdn.net/google_acmer/article/details/19409899,写得非常详细,我也是从那里受到启发的。
//得到改变后皮肤的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && requestCode == 1) {
Settings setting = new Settings(this, false);
this.getWindow().setBackgroundDrawableResource(setting.getCurrentSkinResId());
}
}
下面是皮肤的资源模块:
package com.genius.widget;
import com.genius.demo.R;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
public class Settings {
/**
* SD卡下载歌曲目录
*/
public static final String DOWNLOAD_MUSIC_DIRECTORY = "/Music/download_music/";
/**
* SD卡下载歌词目录
*/
public static final String DOWNLOAD_LYRIC_DIRECTORY = "/Music/download_lyric/";
/**
* SD卡下载专辑图片目录
* */
public static final String DOWNLOAD_ALBUM_DIRECTORY="/Music/download_album/";
/**
* SD卡下载歌手图片目录
* */
public static final String DOWNLOAD_ARTIST_DIRECTORY="/Music/download_artist/";
/**
* 系统设置的保存的文件名
*/
public static final String PREFERENCE_NAME = "com.wwj.music.settings";
public static final String KEY_SKINID = "skin_id";
private SharedPreferences settingPreferences;
/**
* 皮肤资源ID数组
*/
public static final int[] SKIN_RESOURCES = {
R.drawable.main_bg01, R.drawable.main_bg02,
R.drawable.main_bg03, R.drawable.main_bg04,
R.drawable.main_bg05, R.drawable.main_bg06,
R.drawable.bg_playback
};
public Settings(Context context, boolean isWrite) {
settingPreferences = context.getSharedPreferences(PREFERENCE_NAME,
isWrite ? Context.MODE_WORLD_READABLE
: Context.MODE_WORLD_WRITEABLE);
}
/**
* 获取设置数据
* @param key
* @return
*/
public String getValue(String key) {
return settingPreferences.getString(key, null);
}
/**
* 获取皮肤资源ID
* @return
*/
public int getCurrentSkinResId() {
int skinIndex = settingPreferences.getInt(KEY_SKINID, 0);
if(skinIndex >= SKIN_RESOURCES.length) {
skinIndex = 0;
}
return SKIN_RESOURCES[skinIndex];
}
/**
* 获取皮肤Id
* @return
*/
public int getCurrentSkinId() {
int skinIndex = settingPreferences.getInt(KEY_SKINID, 0);
if(skinIndex >= SKIN_RESOURCES.hashCode()) {
skinIndex = 0;
}
return skinIndex;
}
/**
* 设置皮肤资源ID
* @param skinIndex
*/
public void setCurrentSkinResId(int skinIndex) {
Editor it = settingPreferences.edit();
it.putInt(KEY_SKINID, skinIndex);
it.commit();
}
/**
* 设置键值
* @param key
* @param value
*/
public void setValue(String key, String value) {
Editor it = settingPreferences.edit();
it.putString(key, value);
it.commit();
}
}
最后需要注意几点:
1、用SharedPreferences别忘了声明,如果还不知道什么是SharedPreferences,请看看http://blog.csdn.net/google_acmer/article/details/19408413,我想你就会秒懂了。
2、由于设置背景是用setBackgroundDrawableResource方法,所以你在布局文件里的background里不能设置任何值,否则就没办法改变了。如果你想有个初始的皮肤,那就在开始的时候先用setBackgroundDrawableResource方法设置一下就行了,下面是我的代码
int position=preferences.getInt("background_id", 0);//改变后的皮肤ID
Settings mSetting = new Settings(this, true);
this.getWindow().setBackgroundDrawableResource(Settings.SKIN_RESOURCES[position]);//初始化壁纸
如果这些你都按我的步骤做了,我想这个功能你就实现了。