我正在使用 SurfaceView 绘制到屏幕的一部分,从而使用后台线程更新绘图。surfaceview 实现了一个 SurfaceView.callback。
在 onDraw 方法中,我使用 canvas.drawpont(x,y,paint) 并逐个像素地绘制到几乎整个画布,因此在大屏幕上可能会非常密集。无论如何,如果我在横向和反向横向之间快速旋转手机,我会得到一个非法参数异常。如下:
06-18 15:03:05.853: E/AndroidRuntime(29969): FATAL EXCEPTION: Thread-45
06-18 15:03:05.853: E/AndroidRuntime(29969): java.lang.IllegalArgumentException
06-18 15:03:05.853: E/AndroidRuntime(29969): at Android.view.Surface.unlockCanvasAndPost(Native Method)
06-18 15:03:05.853: E/AndroidRuntime(29969): at android.view.SurfaceView$3.unlockCanvasAndPost(SurfaceView.java:793)
06-18 15:03:05.853: E/AndroidRuntime(29969): at com.enhancement.SpecGuageUpdate.run(SpecGuageUpdate.java:313)
在 313 的 SpecGugaeupdate 上,我有:
mHolder.unlockCanvasAndPost(canvas);
mHolder 是我的 SurfaceHolder。当然,在调用 onDraw 之前我也锁定了画布。
如果我在各个方向缓慢旋转,此方法将完美无缺,但是,当我在两个景观状态之间快速旋转 180 度时,它会触发此非法ArgumentException。在监控surfaceChanged中的宽度和高度时,我注意到当我快速旋转时,横向的宽度与纵向的高度配对。例如,在我的手机 (Motorola atrix) 上,SurfaceView 的纵向尺寸为 540x307 (WidthxHeight),横向尺寸为 960x172。当我在横向和反向横向之间快速旋转时会发生这种情况:
慢慢旋转到横向:
960x172
快速旋转以反转景观,表面变化被调用两次。
960x307 - 1st
960x172 - 2nd
我尝试过覆盖 onMeasure,宽度和高度与 SurfaceChanged 的相同。因此,我似乎正在尝试在尚未准备好但已准备好将其锁定到我的 Holder 的画布上进行绘制。任何想法都会很棒,谢谢你的时间。
此外,在我的 surfacedestroyed 中,我正在处理我的线程,如下所示:
boolean retry = true;
thread.setRunning(false);
while (retry) {
try {
specupdate.join();
retry = false;
} catch (InterruptedException e) {
}
}
这会阻止线程执行 onDraw。