Android Layout - расширение ImageView, чтобы заполнить ширину, но не больше? - PullRequest
4 голосов
/ 22 февраля 2011

Здравствуйте, полезные члены stackoverflow,

Я пытаюсь выполнить то, что кажется простым макетом в деятельности Android, но я не могу заставить его работать, используя только wrap_content и fill_parent / match_parent.

Изображение, чтобы дать общее представление о проблеме: http://i89.photobucket.com/albums/k207/cephron/Layout_quandary.png

В вертикальном LinearLayout у меня есть ImageView верхней части дочернего макета, содержащего кнопки и прочее. Я хотел бы, чтобы ImageView был расширен, чтобы сделать изображение максимально большим (т.е. заполнить ширину экрана), не занимая больше вертикального пространства, чем необходимо для достижения этого (т.е. я хочу, чтобы ImageView касался верхней части экрана, с кнопками и прочим, касаясь нижней части изображения). Я не могу этого добиться, используя wrap_content и fill_parent, и все мои проблемы с гравитацией, похоже, ничего не изменили. Я должен был включить веса только для того, чтобы изображение не вытеснило все остальное полностью за пределы экрана.

Я хотел бы опубликовать правильный код, но - нуб, что я - я потратил около 20 минут, пытаясь заставить его работать с формататором кода Stackoverflow, и его части не будут отображаться.

Итак, вот мой код, достаточно искаженный, чтобы он не распознавался при выборочном удалении его частей:

[LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal"]

    [ImageView android:id="@+id/door_detail_video_frame"
    android:src="@drawable/door_closed_256"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"/]

    [LinearLayout android:id="@+id/door_detail_control_area"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_weight="0"]

        [ImageView android:id="@+id/door_detail_status_frame"
        android:src="@drawable/door_closed_locked_67"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"/]

        [LinearLayout android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_width="fill_parent"]

            [Button android:id="@+id/door_detail_override_button"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/door_detail_override_button_text"/]

            [Button android:id="@+id/door_detail_camera_button"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="@string/door_detail_camera_button_text"/]

        [/LinearLayout]

    [/LinearLayout]

[/LinearLayout]

Я полагаю, единственными релевантными частями являются первые LinearLayout и ImageView, но содержимое во вложенных макетах (соответствующее «кнопкам и прочим») включено для полноты.

Есть ли способ добиться желаемого форматирования макета?

Заранее спасибо за любую помощь!

1 Ответ

8 голосов
/ 22 февраля 2011

Не проверено, это может помочь.Я уже пробовал подобные вещи раньше, кажется сложнее, чем должно быть:

ImageView iv = (ImageView)findViewById(R.id.door_detail_video_frame);
ViewTreeObserver vto = iv.getViewTreeObserver();

//gets screen dimensions
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

//this happens before the layout is visible
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        int newWidth, newHeight, oldHeight, oldWidth;

        //the new width will fit the screen
        newWidth = metrics.widthPixels;

        //so we can scale proportionally
        oldHeight = iv.getDrawable().getIntrinsicHeight();
        oldWidth = iv.getDrawable().getIntrinsicWidth();
        newHeight = Math.floor((oldHeight * newWidth) / oldWidth);
        iv.setLayoutParams(new LinearLayout.LayoutParams(newWidth, newHeight));
        iv.setScaleType(ImageView.ScaleType.CENTER_CROP);

        //so this only happens once
        iv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    }
});

Подсказка по средству форматирования кода SO: просто скопируйте и вставьте свой код в окно, выделите все и нажмите Ctrl+ К.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...