我正在写一个小游戏,我希望游戏画布保持其比例并始终处于横向方向。 所以我有这样的代码:
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()方法中获得的宽度和高度是在设置横向方向之前的宽度和高度,并且由于某种原因,一旦方向改变,该方法就不会再次使用正确的宽度调用。
我在这里做错了什么?
答案 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;
}
这里的要点是布局永远不会变小,所以当它以正确的大小初始化时,它将永远保持这种状态。对我来说这不是一个问题,这会导致它在纵向方向看起来很糟糕,因为应用程序应该只在横向模式下工作。但是现在当我强制纵向定位时,尽管有所期望,它可以正确缩放(然后在切换回横向后正确缩放)。
老实说,我不知道发生了什么,但是这段代码解决了我的问题......
我稍后会回到这个问题并试图找到一个更好的解决方案,或者至少是对这个问题的合理解释,但现在不是......