gpt4 book ai didi

android - Android中surfaceView回调调用surfaceChanged时尺寸不一致

转载 作者:行者123 更新时间:2023-11-30 04:09:21 28 4
gpt4 key购买 nike

我正在使用 SurfaceView 绘制到屏幕的一部分,从而使用后台线程更新绘图。 SurfaceView 实现 SurfaceView.callback。

在 onDraw 方法中,我使用 canvas.drawpont(x,y,paint) 并逐像素绘制到几乎整个 Canvas ,因此在大屏幕上它可能非常密集。无论如何,如果我在横向和反向横向之间快速旋转手机,我会得到一个 illegalArgumentException。如下:

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 之前也锁定了 Canvas 。

如果我在每个方向上缓慢旋转,此方法将完美运行,但是,当我在两个横向状态之间快速旋转 180 度时,它会触发此 illegalArgumentException。在监视 surfaceChanged 中的宽度和高度后,我注意到当我快速旋转时,横向的宽度与纵向的高度成对。例如,在我的手机(摩托罗拉 atrix)上,SurfaceView 的纵向尺寸为 540x307(宽 x 高),横向尺寸为 960x172。这是我在横向和反向横向之间快速旋转时发生的情况:

慢慢旋转到横向:

960x172

快速旋转以反转景观,表面变化被调用两次。

960x307 - 1st
960x172 - 2nd

我已尝试重写 onMeasure,宽度和高度与 SurfaceChanged 相同。所以看起来我正在尝试在尚未准备好但足以将其锁定到我的 Holder 的 Canvas 上绘画。任何想法都会很棒,感谢您的宝贵时间。

此外,在我的 surfacedestroyed 中,我正在这样处理我的线程:

boolean retry = true;

thread.setRunning(false);
while (retry) {
try {
specupdate.join();
retry = false;
} catch (InterruptedException e) {
}
}

这会阻止线程执行 onDraw。

最佳答案

我在制作动态壁纸时遇到了同样的问题。我通过强制我的 Canvas 成为屏幕大小来解决这个问题。在我的 onSurfaceChanged 上,我创建了一个全局矩形,我用它来在我的 Canvas 上画画。如果我不这样做,我会遇到与原作者相同的问题。

解决问题的代码:

在 Surface Changed 上,我初始化了我用于绘图的所有变量。请注意我创建了 _screenRectangle。这些变量是全局变量,在整个应用程序中使用。

@Override
public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
super.onSurfaceChanged(holder, format, width, height);

System.out.println("===============================================");
System.out.println("SURFACE CHANGED");
System.out.println("===============================================");

//Get Screen Sizes
_centerX = width/2.0f;
_centerY = height/2.0f;

_screenRectangle = new Rect(0, 0, width, height);
_screenOrient = getResources().getConfiguration().orientation;

System.out.println("===============================================");
System.out.println("WIDTH: " + width + " HEIGHT: " + height + " ORIEN: " + _screenOrient);
System.out.println("===============================================");

_resetSurface = true;
_redrawStatic = true;
}

然后在我的 paint 方法中,我使用以下方法为整个屏幕绘制背景色:

try
{
canvas = holder.lockCanvas(_screenRectangle);


System.out.println("===============================================");
System.out.println("PAINT BACKGROUND: " + canvas.getWidth() + " " + canvas.getHeight());
System.out.println("===============================================");

if (canvas != null)
{
canvas.drawColor(PreferencesHelper.ScreenColor);
_resetSurface = false;
}
}
finally
{
System.out.println("===============================================");
System.out.println("BACKGROUND PAINTED");
System.out.println("===============================================");
if (canvas != null) holder.unlockCanvasAndPost(canvas);
}

在使用 _screenRectangle 锁定 canvas 之前,有时会出现无法绘制整个屏幕的情况。调试窗口会显示 Canvas 大小与当前屏幕不匹配,但会出现与 OP 指出的相同的问题这似乎已经解决了这个问题。这会强制锁定的 Canvas 与 onSurfaceChanged 方法报告的大小相同。

关于android - Android中surfaceView回调调用surfaceChanged时尺寸不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11077421/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com