我最近在我的动态壁纸中发布了一个关于屏幕旋转的问题。为了测试我为什么有这些问题,我创建了下面的简单程序:RE:动态壁纸屏幕旋转
package com.live.waller;
import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Handler;
import android.service.wallpaper.WallpaperService;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
public class LiveWallpaperService extends WallpaperService {
/** Called when the activity is first created. */
@Override
public Engine onCreateEngine() {
// TODO Auto-generated method stub
return new LiveWallerEngine();
}
class LiveWallerEngine extends Engine {
SurfaceHolder holder;
private Handler mHandle;
LiveWallerEngine() {
mHandle = new Handler();
holder = getSurfaceHolder();
}
private Runnable runner = new Runnable() {
public void run() {
// TODO Auto-generated method stub
drawFrame();
}
};
public void drawFrame() {
while(isVisible()) {
if(!holder.getSurface().isValid())
continue;
Canvas c = null;
try{
c = holder.lockCanvas();
drawSurface(c);
} finally {
if(c != null) holder.unlockCanvasAndPost(c);
}
}
}
public void drawSurface(Canvas c) {
c.save();
c.drawColor(Color.argb(255, 100, 200, 124));
c.restore();
}
@Override
public void onCreate(SurfaceHolder surfaceHolder) {
// TODO Auto-generated method stub
super.onCreate(surfaceHolder);
setTouchEventsEnabled(true);
mHandle.post(runner);
}
@Override
public void onOffsetsChanged(float xOffset, float yOffset,
float xOffsetStep, float yOffsetStep, int xPixelOffset,
int yPixelOffset) {
// TODO Auto-generated method stub
super.onOffsetsChanged(xOffset, yOffset, xOffsetStep, yOffsetStep,
xPixelOffset, yPixelOffset);
}
@Override
public void onSurfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
// TODO Auto-generated method stub
super.onSurfaceChanged(holder, format, width, height);
mHandle.post(runner);
}
@Override
public void onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
super.onTouchEvent(event);
}
@Override
public void onVisibilityChanged(boolean visible) {
// TODO Auto-generated method stub
super.onVisibilityChanged(visible);
}
@Override
public void setTouchEventsEnabled(boolean enabled) {
// TODO Auto-generated method stub
super.setTouchEventsEnabled(enabled);
}
}
}
当我旋转我的墙纸,我正与一个空白屏幕映入眼帘。有人知道我的代码有什么问题吗?
当我运行了墙纸,我在logcat中得到这些错误:
ActivityManager: force stopping package com.live.waller uid=10046
PackageManager: Not granting permission android.permission.BIND_WALLPAPER to package com.live.waller (protectionLevel=3 flags=0xbe46)
dalvikvm: GC_CONCURRENT freed 609K, 43% free 4604K/8071K, external 904K/1222K, paused 6ms+7ms
dalvikvm: GC_EXPLICIT freed 320K, 44% free 4561K/8071K, external 904K/1222K, paused 138ms
dalvikvm: GC_EXTERNAL_ALLOC freed 197K, 51% free 2955K/6023K, external 1736K/1742K, paused 78ms
什么奇怪的是,我在logcat中得到了强行停止的消息,但不是当我把我的壁纸模拟器。
您的while(isVisible())和holder.getSurface()。isValid())如何评估?它是否可见?并且表面有效? – Davos555
是的,当我运行壁纸屏幕是绿色的。只有当我旋转屏幕时它才会变黑。 – Denizen
当您旋转屏幕时,这两个条件是否为真? – Davos555