小弱刚刚开始学习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);
}
}}
关键代码如下: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);
}
}}
解决方案 »
- Android的绘图效率问题 (兼谈绘图机制)
- android解析Wap?有没有第三方包?
- android可以访问.net写的服务器端吗?
- 按back键的时候怎么跳过一层activity返回上一个activity
- 求解决一个利用HttpClient4用post连接服务器的问题,已经可以读服务器,服务器却不能收到post参数
- FTPClient SockerTimeoutException
- Android中获取在AlertDialog 中的EditText 的内容是崩溃
- 安卓HTML5,多文件上传不支持么?
- 我下载代码的时候,只出现一个写着下载成功的网页,并没弹出“打开 保存 帮助""
- Android studio
- Gallery 装到 ViewPager上后,就无法拖动了。怎么回事?
- 那位前辈有Mac系统下的Android SDK完整安装包或下载地址啊!
onOffsetsChanged不响应的话就用onTouchEvent来实现。