错误?返回应用程序后使用onSizeChanged

时间:2014-11-05 15:43:28

标签: java android android-layout

我正在写一个小游戏,我希望游戏画布保持其比例并始终处于横向方向。 所以我有这样的代码:

activity_game.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:background="#Ff0000" <!-- red -->
    tools:context=".EngineActivity">

    <com.example.arsen.pw3.game.GameLayout
        android:id="@+id/mainWrapper"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="#00Ff00" <!-- green -->
        android:gravity="center">

        <!-- canvas and all additional stuff comes here -->

    </com.example.arsen.pw3.game.GameLayout>

</RelativeLayout>

GameLayout.java:

public class GameLayout extends RelativeLayout {
    public GameLayout(Context context) {
        super(context);
    }

    public GameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public GameLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    // overriding onSizeChanged to take care that the proportions will be kept.
    @Override
    public void onSizeChanged(int width, int height, int oldWidth, int oldHeight) {
        super.onSizeChanged(width, height, oldWidth, oldHeight);
        double ratio;
        double canvasRatio = width / (double) height;
        GameSettings.DisplaySize displaySize = GameSettings.getInstance().displaySize;
        double gameDisplayRatio = displaySize.height / displaySize.width;

        if(canvasRatio > gameDisplayRatio) {
            ratio = width / displaySize.width;
        } else {
            ratio = height / displaySize.height;
        }
        getLayoutParams().height = (int) (ratio * displaySize.height);
        getLayoutParams().width = (int) (ratio * displaySize.width);
    }
}

它正常工作,直到我切换到其他人后返回应用程序。

This是我运行应用时的外观,但是一旦我打开系统切换器然后返回它,就会看起来像this

因此看起来我在onSizeChanged()方法中获得的宽度和高度是在设置横向方向之前的宽度和高度,并且由于某种原因,一旦方向改变,该方法就不会再次使用正确的宽度调用。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

根据以下链接:Views inside a custom ViewGroup not rendering after a size change

您需要在onSizeChanged末尾使用以下代码强制拨打requestLayout()

Handler handler = new Handler();
handler.post(new Runnable() {

@Override
public void run() {
    requestLayout();
}
});      

答案 1 :(得分:0)

正如我在评论中提到的那样,我找到了一个解决方法。我在OnSizeChanged的开头添加了这段代码(在调用super.onSizeChanged之后):

if(width < oldWidth) {
    width = oldWidth;
    height = oldHeight;
}

这里的要点是布局永远不会变小,所以当它以正确的大小初始化时,它将永远保持这种状态。对我来说这不是一个问题,这会导致它在纵向方向看起来很糟糕,因为应用程序应该只在横向模式下工作。但是现在当我强制纵向定位时,尽管有所期望,它可以正确缩放(然后在切换回横向后正确缩放)。

老实说,我不知道发生了什么,但是这段代码解决了我的问题......

我稍后会回到这个问题并试图找到一个更好的解决方案,或者至少是对这个问题的合理解释,但现在不是......