我创建了一个自定义视图来显示我正在开发的游戏的游戏板。游戏板必须始终是正方形。所以 with 和 height 应该是一样的。我按照本教程来实现这一点。
我将以下代码添加到我的自定义视图中:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getMeasuredWidth();
int height = getMeasuredHeight();
int widthWithoutPadding = width - getPaddingLeft() - getPaddingRight();
int heigthWithoutPadding = height - getPaddingTop() - getPaddingBottom();
int maxWidth = (int) (heigthWithoutPadding * RATIO);
int maxHeight = (int) (widthWithoutPadding / RATIO);
if (widthWithoutPadding > maxWidth) {
width = maxWidth + getPaddingLeft() + getPaddingRight();
} else {
height = maxHeight + getPaddingTop() + getPaddingBottom();
}
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint p = new Paint();
p.setStyle(Paint.Style.STROKE);
p.setStrokeWidth(3);
canvas.drawRect(0, 0, getMeasuredWidth() - 1, getMeasuredHeight() - 1, p);
}
我的自定义视图的布局如下所示:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context=".MainActivity">
<view
android:layout_width="wrap_content"
android:layout_height="wrap_content"
class="com.peerkesoftware.nanograms.controls.GameBoard"
android:id="@+id/view"
android:background="@android:color/holo_purple"/>
</RelativeLayout>
在 onDraw 方法中绘制的正方形始终是正方形。这很好用。
在布局中,我添加了自定义视图并为视图提供了背景颜色。当我以纵向模式在设备上显示它时,一切正常,背景颜色填满了我在 onDraw 方法中绘制的正方形。
当我将设备切换到横向模式时,正方形仍然是正方形,但背景颜色的面积比那个大。它具有相同的高度,但具有更大的宽度。但我不知道为什么。getMeasuredWidth() 和 getMeasuredHeight() 方法返回正确的值。怎么可能视野还那么大?