Я создал пользовательский вид для отображения игрового поля для игры, которую я разрабатываю. Игровая площадка должна быть квадратной во все времена. Таким образом, и высота, и высота должны быть одинаковыми. Я добился этого this tutorial.Почему мой андроид не является квадратным?
Я добавил следующий код в мой настраиваемое представление:
@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() возвращают правильные значения. Как может быть, что вид еще больше, чем это?
Как вы определяете пользовательский вид в макете? – bplayer
С какой площадью это ширина больше в ландшафте? Наверное, не так, но вы используете разные макеты для портрета и пейзажа? – Luksprog