小弱刚刚开始学习android开发,试着写了一个livewallpaper的简单程序,目标是随着view页面的滑动更换背景图片。可是在模拟器上调试的时候,发现背景图片无法随着页面的滑动而改变。追踪了一下是onOffsetsChanged没有被调用,我都无语了,怎么就没被调用呢?然后我试了一下模拟器自带的几个壁纸,奇怪地发现哪些壁纸也无法随着页面的滑动而移动!是不是在设置上除了问题?怎么修改啊?
关键代码如下:public class MyServiceXiaomei extends WallpaperService{ public static final String SHARED_PREFS_NAME="settings";
private Context mContext = MyServiceXiaomei.this;
@Override
public Engine onCreateEngine() {
// TODO Auto-generated method stub
return new MyEngineXiaomei();
}
public void onCreate(){
super.onCreate();
}
public void onDestroy(){
super.onDestroy();
}
class MyEngineXiaomei extends Engine implements SharedPreferences.OnSharedPreferenceChangeListener{ public void onSharedPreferenceChanged(SharedPreferences arg0,
String arg1) {
// TODO Auto-generated method stub

}
private final Handler mHandler=new Handler();
private final Paint mPaint=new Paint();
private float mOffset;
private float mCenterX;
private float mCenterY;
private int count;

private final Runnable mDrawPic = new Runnable(){
public void run() {
                drawFrame();
            }
};

private boolean mVisible;
private SharedPreferences mPrefs;

private int mPics[];
private int mBack;
private Bitmap mBitPics;
private Bitmap mBackgrd;
MyEngineXiaomei(){
mPics=new int[]{
R.drawable.heng1,R.drawable.heng2,R.drawable.heng3,
R.drawable.heng4,R.drawable.heng5,R.drawable.heng6
};
mBitPics = readBmp(mPics[count]);

mBack=R.drawable.background;
iniBack();

count=0;
mPrefs=MyServiceXiaomei.this.getSharedPreferences(SHARED_PREFS_NAME, 0);
mPrefs.registerOnSharedPreferenceChangeListener(this);
onSharedPreferenceChanged(mPrefs, null);
}
public void onCreate(SurfaceHolder surfaceHolder){
super.onCreate(surfaceHolder);
setTouchEventsEnabled(true);
}
public void onDestroy(){
super.onDestroy();
mHandler.removeCallbacks(mDrawPic);
}
public void onVisibilityChanged(boolean visible){
Log.i("info1","onVisibilityChanged!");
super.onVisibilityChanged(visible);
if(visible){
drawFrame();
}
else{
mHandler.removeCallbacks(mDrawPic);
}
}
public void onSurfaceChanged(SurfaceHolder holder,int format,int width,int height){
super.onSurfaceChanged(holder, format, width, height);
mCenterX=width/2.0f;
mCenterY=height/2.0f;
Log.i("info2","onSurfaceChanged!");
drawFrame();
}
public void onSurfaceCreated(SurfaceHolder holder){
super.onSurfaceCreated(holder);
}
public void onSurfaceDestroyed(SurfaceHolder holder){
super.onSurfaceDestroyed(holder);
mVisible=false;
mHandler.removeCallbacks(mDrawPic);
}
public void onOffsetsChanged(float xOffset, float yOffset,
                float xStep, float yStep, int xPixels, int yPixels){
super.onOffsetsChanged(xOffset, yOffset, xStep, yStep, xPixels, yPixels);
mOffset=xPixels;
if(count==5){
count=0;
}
else{
count++;
}
Log.i("info3","onOffsetsChanged!");
drawFrame();
}
public void onTouchEvent(MotionEvent event){

}
void drawFrame(){
final SurfaceHolder holder=getSurfaceHolder();
mBitPics=readBmp(mPics[count]);
Canvas c=null;
try{
c=holder.lockCanvas();
if(c!=null){
c.drawBitmap(mBackgrd, mOffset, 0,null);
c.drawBitmap(mBitPics,0,0,null);
}
}
finally{
if(c!=null){
holder.unlockCanvasAndPost(c);
}
}
mHandler.removeCallbacks(mDrawPic);
            if (mVisible) {
                mHandler.postDelayed(mDrawPic, 1000 / 25);
            }
}
void iniBack(){
if(mBackgrd != null){
if (!mBackgrd.isRecycled()){
mBackgrd.recycle();
}
}
mBackgrd=readBmp(mBack);
}
public Bitmap readBmp(int resId){
BitmapFactory.Options opt = new BitmapFactory.Options();  
opt.inPreferredConfig = Bitmap.Config.RGB_565;   
opt.inPurgeable = true; 
opt.inInputShareable = true;  
InputStream is = mContext.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is,null,opt);  
}
}}