动态壁纸屏幕旋转

5

我目前正在开发一款非常占用资源的动态壁纸,但是它不能很好地处理屏幕旋转。

事实上,在没有调用onSurfaceChanged方法的情况下,该壁纸会被销毁并显示一个空白屏幕!

以下是我在onSurfaceChanged方法中的代码:

@Override
    public void onSurfaceChanged(SurfaceHolder holder, int format,
            int width, int height) {
        // TODO Auto-generated method stub
        super.onSurfaceChanged(holder, format, width, height);

        mRatio = (float) width / height;
        if (mRatio > 1) {
            orientation = 0;
        }
        if (mRatio < 1) {
            orientation = 1;
        }
        setRunning(true);
        Log.i(TAG, "Screen Rotation...");
        mHandle.post(r);
    }

我确定这个方法没有被调用,因为没有日志信息。

为什么会出现这种情况,有什么处理屏幕旋转的技巧吗? 难道是我的动态壁纸太过繁重,void无法被调用?

此外,onVisibilityChanged也没有被调用,当我在模拟器上打开应用时,也没有日志信息:

@Override
    public void onVisibilityChanged(boolean visible) {
        // TODO Auto-generated method stub
        super.onVisibilityChanged(visible);
        if (visible) {
            setRunning(true);
            Log.i(TAG, "Visible...");
            mHandle.postDelayed(r, 2000);
        } else {
            setRunning(false);
            Log.i(TAG, "Invisible...");
            mHandle.removeCallbacks(r);
        }
    }

你能发更多的代码吗?需要知道所有繁重的工作都在哪里完成。在我的动态壁纸中,屏幕旋转时会调用onSurfaceChanged和onVisibilityChanged。此外,在方向改变期间,请检查LogCat是否出现“等待壁纸偏移超时”的信息。 - Ole
1个回答

1
在你的清单文件中声明:
    <activity android:name=".YourActivityName"
              android:configChanges="keyboardHidden|orientation"
    </activity>

关于您的第一个问题:只有在清单文件中声明configChanges属性,您的onSurfaceChanged方法才会被调用!

关于您的第二个问题:onVisibilityChanged不是您所期望的名称:

当包含窗口的可见性发生更改(在GONE、INVISIBLE和VISIBLE之间)时调用。请注意,这告诉您您的窗口是否正在向窗口管理器显示;即使它本身可见,这也不会告诉您您的窗口是否被屏幕上的其他窗口遮挡。

您需要通过onPause()onResume()检查您的应用程序是否对用户“可见”。


我的问题是我不断地初始化20个矩形,并有大约40个if语句用于动画处理。即使在完成动画后,这些if语句仍然不断被检查,从而降低了性能。 - Denizen
1
以上答案不适用于动态壁纸,而是适用于使用SurfaceView的应用程序。因此,设置configChanges属性将无效。请发布更多代码。 - Ole
公共的无返回值方法 drawSurface() { mRectArray = new Rect[] { 初始化20个矩形 };,如果(条件){ 如果(条件){ 动画矩形 } }.. 重复40次if语句,c.drawRect(mRectArray[x])... 绘制40个矩形 } - void 正在被循环。 - Denizen
mRectArray = new Rect[] { new Rect(0, 0, right1, (c.getHeight() + statusBarHeight) / 20), new Rect(0, (c.getHeight() + statusBarHeight) / 20, right2, (c.getHeight() + statusBarHeight) / 20 * 2),... }; - 你看到我为每个矩形的右侧设置了一个变量吗?if语句只是增加或减少每个矩形的边缘。现在,为了使矩形动画化,它们必须被重新初始化,否则每个矩形的右侧将不会得到更新。 - Denizen
您不必初始化新的矩形才能对其进行动画处理。可以使用Rect.left、Rect.right等更改尺寸。如果您有20个矩形,并且每次想要对它们进行动画处理时都要初始化新的矩形,那么性能会非常差。您已经发布了onSurfaceChanged和onVisibilityChanged方法,但我认为您面临的问题源于主绘图方法。完整的源代码将非常有帮助,或者至少提供一下负责绘制的代码部分... - Ole
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接