Android 现场壁纸&x2B;位图+;帆布
大家好!我有一张现场壁纸,我试图通过画布显示位图(可绘制资源是400k 1900x1200 jpg)。它强制关闭,我不明白为什么(这是我的第一个Android项目)。以下是“重要”部分: 谢谢!:) ======================= 新闻:Android 现场壁纸&x2B;位图+;帆布,android,android-canvas,Android,Android Canvas,大家好!我有一张现场壁纸,我试图通过画布显示位图(可绘制资源是400k 1900x1200 jpg)。它强制关闭,我不明白为什么(这是我的第一个Android项目)。以下是“重要”部分: 谢谢!:) ======================= 新闻: 位图似乎为空。现在我正在使用480x800以确保没有内存问题。应用程序不再因if语句(空黑屏)而崩溃。您是否尝试缩放位图以适应画布?在onSurfaceChanged中执行此操作,以便了解要使用的宽度和高度。 您应该检查位图是否被正确解码。资源
位图似乎为空。现在我正在使用480x800以确保没有内存问题。应用程序不再因if语句(空黑屏)而崩溃。您是否尝试缩放位图以适应画布?在onSurfaceChanged中执行此操作,以便了解要使用的宽度和高度。
您应该检查位图是否被正确解码。资源是否为400K并不重要——这是一个非常大的位图,需要尝试加载到内存中。您只有16兆的堆…该位图约为9兆(4字节/像素ARGB_8888)。George您是否确保backgroundImage成员在onCreate期间实例化后不为空?如果是这样的话,似乎图像正在被回收,因此图像引用无效,因此出现了NullPointerException。你说得对!它是空的,谢谢。有没有更好的方法将其加载到位图中?我实际上已经在onSurfaceCheanged中进行了重新缩放,如下所示:backgroundImage=bitmap.createScaledBitmap(backgroundImage,width,height,true)。如何测试位图加载?谢谢:)位图似乎为空,没有加载!我失踪了something@Misca我将从缩放资源本身开始:制作一个更小的jpeg。有一种方法可以在加载资源时对其进行缩放,但我完全忘记了它是如何完成的;如果我能找到它,我会留下另一条评论。我永远不会尝试将这么大的位图加载到内存中。现在我使用的是800x480 jpg,但位图仍然无法加载。我也尝试过选项。inDensity=120@Misca,嗯,感觉像是发生了什么事。建议把事情一步一步地分解,确保每一块拼图都合适。这里有一些适合我的代码:mContext=getApplicationContext();mRes=mContext.getResources();mBitmap=BitmapFactory.decodeResource(mRes、R.drawable.myimage、mOpts);(这样你可以确保你的资源是好的;除了将文件转换成png之外,你不确定还有什么建议)同样——你的位图应该是480x800而不是800x480。
wallEngine() { // CONSTRUCTOR <<<<<<<<<<<<<<<<<<<
mStartTime = SystemClock.elapsedRealtime();
Log.v(Logcat, "Contructor ok");
}
//====================================== INIT
private final Runnable mDrawWall = new Runnable() { //=========== RUN
public void run() {
drawFrame();
}
};
void drawFrame() {
final SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try {
c = holder.lockCanvas();
if (c != null) {
// draw something
updatePhysics();
doDraw(c);
}
} finally {
if (c != null) holder.unlockCanvasAndPost(c);
}
// Reschedule the next redraw
mHandler.removeCallbacks(mDrawWall);
if (mVisible) {
mHandler.postDelayed(mDrawWall, 5000);
}
}
private void doDraw(Canvas canvas) {
//backgroundImage.prepareToDraw();
canvas.drawBitmap(this.backgroundImage, 0, 0, null);
}
public void onCreate(SurfaceHolder surfaceHolder) {
super.onCreate(surfaceHolder); surfaceHolder.setFormat(android.graphics.PixelFormat.RGBA_8888);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPurgeable = true;
this.backgroundImage = BitmapFactory.decodeResource(getResources(),
com.misca.livewallpapers.parang.R.drawable.a, options);
//backgroundImage.prepareToDraw();
//setTouchEventsEnabled(true);
Log.v(Logcat, "onCreate ok");
}
ERROR/AndroidRuntime(7722): FATAL EXCEPTION: main
ERROR/AndroidRuntime(7722): java.lang.NullPointerException
ERROR/AndroidRuntime(7722): at android.graphics.Canvas.throwIfRecycled(Canvas.java:957)
ERROR/AndroidRuntime(7722): at android.graphics.Canvas.drawBitmap(Canvas.java:983)
ERROR/AndroidRuntime(7722): at com.misca.livewallpapers.parang.liveWallpaper$wallEngine.doDraw(liveWallpaper.java:115)
ERROR/AndroidRuntime(7722): at com.misca.livewallpapers.parang.liveWallpaper$wallEngine.drawFrame(liveWallpaper.java:75)
ERROR/AndroidRuntime(7722): at com.misca.livewallpapers.parang.liveWallpaper$wallEngine.onSurfaceChanged(liveWallpaper.java:157)
ERROR/AndroidRuntime(7722): at android.service.wallpaper.WallpaperService$Engine.updateSurface(WallpaperService.java:590)
ERROR/AndroidRuntime(7722): at android.service.wallpaper.WallpaperService$Engine.attach(WallpaperService.java:654)
ERROR/AndroidRuntime(7722): at android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper.executeMessage(WallpaperService.java:878)
ERROR/AndroidRuntime(7722): at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:61)
ERROR/AndroidRuntime(7722): at android.os.Handler.dispatchMessage(Handler.java:99)
ERROR/AndroidRuntime(7722): at android.os.Looper.loop(Looper.java:123)
ERROR/AndroidRuntime(7722): at android.app.ActivityThread.main(ActivityThread.java:3848)
ERROR/AndroidRuntime(7722): at java.lang.reflect.Method.invokeNative(Native Method)
ERROR/AndroidRuntime(7722): at java.lang.reflect.Method.invoke(Method.java:507)
ERROR/AndroidRuntime(7722): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
ERROR/AndroidRuntime(7722): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
03-23 00:26:42.309: ERROR/AndroidRuntime(7722): at dalvik.system.NativeStart.main(Native Method)
private void doDraw(Canvas canvas) {
//backgroundImage.prepareToDraw();
if(this.backgroundImage!=null)
canvas.drawBitmap(this.backgroundImage, 0, 0, null);
else
Log.v(Logcat, "null");
}