Intereting Posts
RecyclerView.Adapter onBindViewHolder () получает неправильную позицию «Кнопка« Назад »с помощью панели инструментов getSupportActionbar и appcompat v7 Перемещение любого RelativeLayout пальцем (без изменения параметров макета) Как динамически создавать дочерние элементы в expandablelistview, щелкая родительский узел в android Как сжать WAV-файл на android Keyguard показывается ненадолго перед запуском Activity при использовании FLAG_SHOW_WHEN_LOCKED Как создать собственный интерфейс Listener в android? Как использовать широковещательный приемник в разных приложениях на Android? Когда следует использовать фрагменты в приложениях Android? Зачем использовать фрагменты? Насколько безопасно это иметь потребительский ключ Twitter и секретный жесткий код в приложении для Android? Инструмент Android DDMS зависает после выбора устройства SQLite добавить столбец, сохранить данные Множество DatePickers в одной активности Как получить доступ к оставшемуся времени батареи в андроиде Странное поведение параметризованного SQLite-запроса

Как разместить фон на изображении внутри релятивирования?

ПРИМЕЧАНИЕ. Я сообщил об этом как об ошибке для проекта Android: http://code.google.com/p/android/issues/detail?id=39159. Также обратите внимание на принятый ответ на раздачу, Решение, к сожалению, использовать абсолютную (т. Е. Спецификацию «dp, а не« wrap_content »и т. Д.), Чтобы устранить проблему.

Я получаю ОЧЕНЬ странное поведение при размещении фона на изображении. Я упростил это довольно сильно, чтобы продемонстрировать вам эту проблему. То, что я делаю, – это размещение изображения в режиме релятивирования, а также использование фона. Похоже, что предоставление relativelayout дополнения дополняет фоном изображения, которое будет упущено. Кажется, что Wrap_content запутался.

Во-первых, вот код, который демонстрирует проблему. Обратите внимание, что такое же поведение наблюдается без использования функции linearlayout и просто дает фону изображения, но это действительно демонстрирует проблему лучше.

<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="60dp" android:padding="5dp" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/black_bg" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" android:src="@drawable/red_rectangle" /> </LinearLayout> </RelativeLayout> </FrameLayout> 

Вот черный файл xml_bg:

 <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FF000000"/> </shape> 

Вот red_rectangle: red_rectangle

Обратите внимание, что это ссылочное изображение, чтобы продемонстрировать проблему. У моего фактического изображения есть детали, и поэтому не может быть .9.png

И вот скриншот проблемы:

Ошибка рендеринга

Вы можете видеть, что ширина изображения меньше, чем linearlayout, несмотря на то, что linearlayout имеет ширину, установленную на «wrap_content». Если я установил дополнение relativelayout на 0dp, эта проблема исчезнет.

Это, надеюсь, довольно хорошо содержащий набор ресурсов, которые я предоставляю здесь, поэтому люди могут попробовать сами, если захотят.

Для справки, я использую это, чтобы обеспечить границу вокруг изображения, поэтому я мог бы установить для параметра linearlayout (или самого изображения) наличие отступов, в этом случае проблема все еще сохраняется.

EDIT: Кажется, мне, вероятно, понадобится немного больше контекста, так как ответы сосредоточены вокруг того, как обеспечить эту границу. Вот скриншот более контекстного макета. Я не хотел включать это в первую очередь, поскольку это добавляет больше путаницы в проблему:

Скриншот

FIRST 5dp padding вы видите для содержимого всего этого элемента (relativelayout). Затем, как я сказал изначально, идея заключается в том, что «я мог бы установить, что linearlayout (или само изображение) имеет дополнение» в дополнение к первому дополнению, которое вы видите в relativelayout. В настоящее время в этом макете не должно быть ни одной границы.

Я считаю, что это хороший кандидат на ошибку!

Во всяком случае, я понимаю, чего вы намерены достичь с помощью этого макета. Проблема заключается в установке высоты вашего RelativeLayout. Я не буду просить вас обернуть контент! Просто, поскольку высота установлена ​​на 60dp и отложена до 5dp, сделайте еще один шаг и установите высоту LinearLayout на 50dp, что составляет 60-2*5 🙂

Наконец, чтобы получить границу, добавьте дополнение к вашему LinearLayout, скажем, 5dp, и установите высоту изображения в 50dp - 2*5 = 40dp .

Это будет отлично работать


 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="60dp" android:padding="5dp" > <LinearLayout android:layout_width="wrap_content" android:layout_height="50dp" android:padding="5dp" android:background="@drawable/black_bg" > <ImageView android:layout_width="wrap_content" android:layout_height="40dp" android:adjustViewBounds="true" android:src="@drawable/red_rectangle" /> </LinearLayout> </RelativeLayout> </FrameLayout> 

Проблема, похоже, связана с различными растягивающими свойствами изображения (в представлении изображения) и тем, который задан как фон (в линейном макете). Изображение, заданное как backgroung, не обязательно поддерживает соотношение сторон, в то время как изображение в изображении имеет тенденцию поддерживать его. Когда вы даете высоту макета до 60 дп, изображение сжимается, сохраняя соотношение сторон, оставляя черные полосы по бокам. Это работает для меня:

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:layout_width="wrap_content" android:layout_height="60dp" android:padding="5dp" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/black_bg" > <ImageView android:layout_width="wrap_content" android:layout_height="60dp" android:src="@drawable/asd" android:scaleType="fitXY" /> </LinearLayout> </RelativeLayout> </FrameLayout> 

Я не знаю, почему он показывает дополнительный черный патч. Вы пытались запустить приложение? Редактор пользовательского интерфейса имеет некоторые недостатки, особенно в том, что касается ImageView .

Теперь для рамки вокруг изображения установите фон и дополнение к самому ImageView . Не требуется LinearLayout. Добавьте атрибут типа шкалы со значением "centerInside" .

  <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="5dp" android:layout_centerInParent="true" android:adjustViewBounds="true" android:src="@drawable/red_rectangle" android:background="#000" android:scaleType="centerInside"/> 

«Для справки, я использую это, чтобы обеспечить границу вокруг изображения»

Добавьте растягиваемый "border.xml"

 <shape xmlns:android:"http://schemas.android.com/apk/res/android" android:shape:"rectangle"> <stroke android:width="5dp" android:color="#FF000000" /> <padding android:left="5dp" android:top="5dp" android:right="5dp" android:bottom="5dp" /> </shape> 

Установите для этого образа ImageView.

И упростите расположение и центр ImageView:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:adjustViewBounds="true" android:src="@drawable/red_rectangle" android:background="@drawable/border" /> </RelativeLayout> 

Попробуй это ………..

 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="60dp" android:padding="5dp" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/black_bg" **android:padding="5dp"** > <ImageView **android:layout_width="fill_parent" android:layout_height="fill_parent"** android:adjustViewBounds="true" android:src="@drawable/red_rectangle" /> </LinearLayout> </RelativeLayout> </FrameLayout> 

Сделайте свое изображение таким, как это.

 <ImageView android:id="@+id/imageViewMyicon" android:layout_width="30dp" android:background="@drawable/myiconbackground" android:layout_height="30dp" android:src="@drawable/myicon" android:contentDescription="@string/my_icon" /> 

Внутри вашего drawable myiconbackground.xml

 <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" android:padding="10dp"> <solid android:color="#0D95BD"/> <corners android:radius="5dp"/> <padding android:left="2dp" android:right="2dp" android:top="2dp" android:bottom="2dp"/> </shape> 

Я проверил, что он работает для меня, должен сделать для вас также