我正在创建动态壁纸,并使用本教程作为起点:
http://code.tutsplus.com/tutorials/create-a-live-wallpaper-on-android-using-an-animated-gif--cms-23088 http://code.tutsplus.com/tutorials/create-a-live-wallpaper-on-android-using-an-animated-gif--cms-23088
我正在尝试添加一个设置菜单,让用户选择四种背景之一。我一切都在使用SharedPreferences
。唯一的问题是在设置菜单中更改设置后壁纸不会更新。如果您重新启动应用程序,背景将更新为最后选择的背景,但只有在壁纸重新启动后才有效(即选择不同的壁纸,然后重新选择此壁纸)。
我已将问题范围缩小到以下事实:SharedPreference
仅更新于onCreateEngine()
方法。壁纸服务运行后,onCreateEngine()
方法不会被调用,所以即使SharedPreference
已更改,它不会在壁纸服务中更新。
我的问题是如何重新启动壁纸以便onCreateEngine()
设置更改后调用方法?再次,SharedPreferences
正在工作,因为重新启动后一切正常。我知道我需要使用onsharedPreferenceChanged
方法,但我不确定应该在哪里发生,或者该方法中应包含哪些代码来重新启动壁纸引擎。
这是示例代码。除了评论指出之外,我的也是一样的:
import android.graphics.Canvas;
import android.graphics.Movie;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.util.Log;
import android.view.SurfaceHolder;
import java.io.IOException;
public class GIFWallpaperService extends WallpaperService implements onsharedpreferencechangelistener {
// Variable I added to change background
String mBackgroundImage = null;
// Method I added to update background image
public void updatedBackgroundImage(){
// code that sets mBackgroundImage based upon value of shared preference file.
}
@Override
public WallpaperService.Engine onCreateEngine() {
// I call this method to change the value of mBackgroundImage
updateBackgroundImage();
try {
Movie movie = Movie.decodeStream(
getResources().getAssets().open("mBackgroundImage"));
return new GIFWallpaperEngine(movie);
}catch(IOException e){
Log.d("GIF", "Could not load asset");
return null;
}
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sp, String key) {
// What do I do? How do I make the wallpaper engine restart when settings are changed?
}
private class GIFWallpaperEngine extends WallpaperService.Engine {
private final int frameDuration = 20;
private SurfaceHolder holder;
private Movie movie;
private boolean visible;
private Handler handler;
public GIFWallpaperEngine(Movie movie) {
this.movie = movie;
handler = new Handler();
}
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder);
this.holder = surfaceHolder;
}
private Runnable drawGIF = new Runnable() {
public void run() {
draw();
}
};
private void draw() {
if (visible) {
Canvas canvas = holder.lockCanvas();
canvas.save();
// Adjust size and position so that
// the image looks good on your screen
canvas.scale(3f, 3f);
movie.draw(canvas, -100, 0);
canvas.restore();
holder.unlockCanvasAndPost(canvas);
movie.setTime((int) (System.currentTimeMillis() % movie.duration()));
handler.removeCallbacks(drawGIF);
handler.postDelayed(drawGIF, frameDuration);
}
}
@Override
public void onVisibilityChanged(boolean visible) {
this.visible = visible;
if (visible) {
handler.post(drawGIF);
} else {
handler.removeCallbacks(drawGIF);
}
}
@Override
public void onDestroy() {
super.onDestroy();
handler.removeCallbacks(drawGIF);
}
}
}
我可能迟到了,但希望有人会发现这很有用。
您需要首先指定并注册您的 SharedPrefs。将其添加到您的 onCreate() 方法中。
SharedPreferences preferences = getSharedPreferences("PREFERENCES NAME", Context.MODE_PRIVATE);
preferences.registerOnSharedPreferenceChangeListener(this);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)