ImageView не заполнит родителя

У меня есть ScrollView на одном из моих экранов. Я хочу, чтобы правый край имел тень. Я решил, что самый простой способ сделать это — сделать дочерний элемент ScrollView RelativeLayout и иметь двух дочерних элементов RelativeLayout — один LinearLayout, в котором будет размещаться макет экрана, а второй View — тень.

Вот так...

<ScrollView
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:scrollbars="none" >

            <RelativeLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content" >

                <LinearLayout
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical" >
                <!-- stuff -->
                </LinearLayout>

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:src="@drawable/shadow"
                    android:layout_alignParentRight="true"
                    />
            </RelativeLayout>
        </ScrollView>

К сожалению, это не совсем работает. ImageView заставляет свои размеры соответствовать размеру файла изображения. Он не будет растягиваться по вертикали до высоты RelativeLayout. Я также пробовал "match_parent" безрезультатно. Образ представляет собой 9-патч.

Идеи?


person Andrew    schedule 16.07.2012    source источник


Ответы (4)


Применение рисуемого содержимого в качестве источника ImageView в некоторой степени несет с собой неотъемлемое требование, чтобы вы хотели, чтобы представление делало все возможное, чтобы разместить содержимое, не сильно изменяя само содержимое. Как правило, это то поведение, которое вы хотели бы получить от ImageView.

Что вам действительно нужно, так это поведение, которое вы получаете, устанавливая отображаемый контент в качестве background представления, для которого вам вообще не нужно ImageView. Фон предназначен для простого растягивания, заполнения и т. д. до любого размера изображения. Кроме того, поскольку вы используете RelativeLayout, вы можете указать, что представление соответствует границе представления, которое вы затеняете, добавив id и некоторые дополнительные параметры layout_align.

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" >

            <LinearLayout
                android:id="@+id/content_layout"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" >
            <!-- stuff -->
            </LinearLayout>

            <View
                android:layout_width="11dp"
                android:layout_height="fill_parent"
                android:layout_alignParentRight="true"
                android:layout_alignTop="@id/content_layout"
                android:layout_alignBottom="@id/content_layout"
                android:background="@drawable/shadow"
                />
        </RelativeLayout>
person devunwired    schedule 16.07.2012
comment
Я уже пробовал это (хотя мне пришлось указать ширину 11dip, иначе она вообще не показывалась) безрезультатно - person Andrew; 16.07.2012
comment
Изменить, была идея получше. Вы правы в отношении фиксированного размера, без какого-либо содержимого внутри (из которого фон не считается), представление не может правильно измерить wrap_content. - person devunwired; 16.07.2012
comment
Единственное, что я могу придумать, это захватить View в коде, получить высоту экрана и установить высоту View одинаковой. - person Andrew; 16.07.2012
comment
Приведенный выше пример тоже не работает? Свойства alignTop и alignBottom должны обрабатывать все это за вас. - person devunwired; 16.07.2012
comment
Да, alignTop в сочетании с alignBottom заставили его работать. Решение, которое я предложил в своем предыдущем комментарии, тоже; а у вас проще. - person Andrew; 17.07.2012

попробуй это

<ImageView
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:background="@drawable/ic_launcher"
                android:scaleType="fitXY"
                android:layout_alignParentRight="true"
                />

вот что я получаю

введите здесь описание изображения

и идентификатор кода

<?xml version="1.0" encoding="utf-8"?>

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true"
    android:scrollbars="none" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <!-- stuff -->
        </LinearLayout>

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_alignParentRight="true"
            android:background="@drawable/ic_launcher"
            android:scaleType="fitXY" />
    </RelativeLayout>
</ScrollView>

person Mohsin Naeem    schedule 16.07.2012
comment
ScaleType не решил проблему. Чтобы убедиться, что ImageView имеет неправильный размер, я изменил цвет фона на красный. ImageView — это только высота изображения, заданная как src. Похоже, он не заинтересован в том, чтобы быть match_parent или fill_parent. - person Andrew; 16.07.2012
comment
Вы заметили, что у меня есть смена src на background? :) Используя src, вы никогда не сможете добиться того, чего хотите. - person Mohsin Naeem; 16.07.2012
comment
Переключение src в фоновый режим тоже не сработало. На самом деле, я уже пробовал то же самое с обычным View и LinearLayout вместо ImageView. - person Andrew; 16.07.2012
comment
с этим также поместите android:fillViewport="true" вашего вида прокрутки. - person Mohsin Naeem; 16.07.2012
comment
Кто-то уже предлагал fillViewport, но это не решило проблему. - person Andrew; 16.07.2012
comment
Да, fillViewport применяется только к прямым дочерним элементам. - person Andrew; 17.07.2012
comment
Нет, но другой ответ решил это. Судя по вашему изображению, ваше решение решает проблему. Почему-то я вижу разные результаты. Я сделал все то же самое (насколько я вижу) и мое изображение не растягивалось по вертикали. - person Andrew; 17.07.2012

Ваша проблема не связана с самим ImageView или 9-патчем, а скорее с тем фактом, что вы заворачиваете все в ScrollView. ScrollView автоматически заставит свой прямой дочерний элемент children обернуть свое содержимое, независимо от того, скажете ли вы об этом FILL_PARENT или MATCH_PARENT - кстати, оба делают одно и то же; единственное отличие состоит в названии, которое лучше отражает фактическое поведение флага.

К счастью, ScrollView предоставляет способ принудительно заполнить область просмотра флагом, что сделает поведение очень похожим на установку FILL_PARENT в обычное представление. Либо добавьте атрибут android:fillViewport, либо используйте setFillViewport() из кода.

Изменить: просто для ясности, вам нужно установить этот флаг на ScrollView. Кроме того, если это ScrollView, у которого должна быть тень, вы не можете отправить свой 9-патч в качестве фона для него? Я полагаю, это зависит от того, как выглядит ваше фактическое изображение. Что касается вашего комментария: да, RelativeLayout является гибким с точки зрения позиционирования и размера дочерних элементов, но любой дочерний элемент все равно будет привязан к размеру своего родителя.

У меня есть ощущение, что некоторые из нас могут работать над чем-то отличным от того, что вы имеете в виду. Это определенно помогло бы прояснить ситуацию с помощью простого рисунка.

person MH.    schedule 16.07.2012
comment
К сожалению, fillViewport не решил мою проблему. Кроме того, ImageView не является прямым потомком ScrollView. RelativeLayout есть. Затем я смогу сделать любого дочернего элемента RelativeLayout fill_parent/match_parent. - person Andrew; 16.07.2012
comment
@МХ. То, что вы говорите, правильно, но только в отношении ребенка ScrollView, которым здесь является RelativeLayout. Это ограничение не выходит за пределы цепочки иерархии. - person devunwired; 16.07.2012
comment
@Devunwired: Извините за формулировку ранее, я должен был быть немного осторожнее и сказать, что это прямой ребенок вместо детей. Исправлено в моем ответе. Я все еще думаю, что fillViewport будет решением вашей проблемы, но, чтобы избежать путаницы, было бы здорово, если бы ТС мог смоделировать небольшой рисунок. - person MH.; 17.07.2012

Вам нужна тень справа от изображения. Затем используйте один макет с Horizontal Orientation. Хорошо, что вы решили использовать относительный макет. Использовать

android:orientation="vertical"

внутри этого макета добавьте эти два изображения. Если у вас все еще есть сомнения, дайте мне эти два изображения или образцы изображений, я дам вам код

person VenomVendor    schedule 16.07.2012