Небажані набивання навколо ImageView


142

Мені потрібно включити графіку заголовка у всі мої дії / перегляди. Файл із заголовком називається header.xml:

<?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="wrap_content"
  android:background="#0000FF" 
  android:padding="0dip">

  <ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/header"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="0dip"
    android:layout_marginTop="0dip"
    android:layout_marginBottom="0dip"
    android:padding="0dip"
    android:paddingTop="0dip"
    android:paddingBottom="0dip"
    android:layout_gravity="fill"
    android:background="#00FF00"
    />
</FrameLayout>

Зверніть увагу android:background="#00FF00"(зелений), це просто цілі візуалізації.

Я включаю їх у свої погляди так:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
  style="@style/white_background">

  <include layout="@layout/header" />
  (...)

Отже, коли я його фактично випробую, результат виглядає як ліве зображення, а не як воно має виглядати (праворуч):

зверніть увагу на зелену облямівку

(1) Ця - помаранчева частина - це зображення / питання ImageView
(2) Нелюбима зелена рамка. Примітка: зазвичай зелена зона буде прозорою - Це лише зелена, тому що я встановив background.

Зверніть увагу на зелену рамку навколо зображення вгорі; Це частина ImageView, і я просто не можу зрозуміти, чому він є, або як я можу його позбутися. Він встановлює всі прокладки та поля на 0 (але результат той самий, коли я їх опускаю). Зображення є форматом jpeg * 480x64px *, і я розміщую його в Res / Dravable (не в одному з них drawable-Xdpi).

(* jpeg, тому що, здається, я натрапив на стару проблему з PNG-гамою - спочатку я вирішив проблему, зробивши зелену облямівку такою ж помаранчевою, що і зображення, і кольори не збіглися.)

Я спробував це на своєму htc бажання / 2.2 / Build 2.33.163.1 та на емуляторі. Також я описав проблему комусь у # android-dev; Вона могла відтворити проблему, але також не мала пояснень. ціль складання - 1,6.

update @tehgoose: цей код дає такий самий результат у верхній і нижній частині.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
  style="@style/white_background">

  <!-- <include layout="@layout/header" />  -->

  <ImageView
    android:src="@drawable/header"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#00FF00"
    android:layout_weight="0"
    />

  <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="8dip"
    android:layout_weight="1">

    (... rest of the elements)

  </LinearLayout>
</LinearLayout>

Також можуть працювати негативні значення запасу та / або прокладки -android:layout_margin="-10dp" ,android:padding="-10dp"
samis

Відповіді:


442

нарешті!

<ImageView
  (...)
  android:adjustViewBounds="true" />

атрибут adjustViewbounds зробив трюк:

Встановіть це значення true, якщо ви хочете, щоб ImageView коригував його межі, щоб зберегти співвідношення сторін для малювання.

я спіткнувся на це тут . спасибі за вашу допомогу!


7
У мене така ж проблема, але це рішення не мало ефекту.
Марті Міллер

4
Нічого ... без цього атрибуту додаються небажані накладки залежно від щільності екрана, тому це відбувається лише на деяких пристроях. Це зводило мене з горіха, тому що зображення виглядало чудово на всіх пристроях, якими я володію, тоді, коли я спробував би його на пристрої друга, це виглядало як лайно. СПАСИБІ.
DiscDev

Дякую богам, я перемикаю свою першу спробу намагатися вирішити помилку, щоб знайти щось, що ввійшло в андроїд. Я вважаю, що ця проблема почалася у деяких виробників, які змінюють речі з андроїда, і тоді їм доводиться розміщувати властивості, щоб вирішити це в наступних версіях.
Ратата Тата

На жаль, це не працює для нижньої апіси, принаймні 16 та 17 квітня.
люзер

1
Ого, це саме те, що я шукав, я чухав голову протягом декількох годин, навіть зайшов, щоб спробувати визнати недійсним макет і встановити висоту / ширину зображення. Таке просте рішення, яке ідеально працює без необхідності масштабу типу.
CodyEngel

39
android:scaleType="fitXY"

Це працює для мене.


3
scaleType="fitXY"хоч щось інакше: це змінює співвідношення сторін зображення, що призводить до спотворення. це може бути прийнятним іноді, наприклад, для абстрактного фонового зображення.
stefs

1
Я контролював співвідношення сторін за допомогою андроїд: ширина та андроїд: висота, і scaleType = "fitXY" заповнив imageView для мене потрібним співвідношенням сторін, це було принаймні моїм досвідом. Дякуємо за ваш внесок
Бадр

Це працює, але зображення непримітне, неврівноважене, обрізане
최봉재

1
Не точно, а андроїд: scaleType = "fitEnd" працював як магія.
Бібліотекар

Я знайшов комбінацію android:adjustViewBounds="true"і android:scaleType="fitXY"мені було потрібно, щоб вирівняти ImageViews у моєму макеті. Зображення було вимкнено пікселем або двома (дуже маленькими на дисплеї високої роздільної здатності) просто adjustViewBounds. Додавання, scaleTypeздається, примушує остаточне масштабування зображення після того, як кордони перегляду будуть відрегульовані, що змушує зображення масштабуватися до повного розміру нових меж.
Джефф Локхарт

3

Це пов'язано із співвідношенням сторін зображення. За замовчуванням система зберігає вихідне співвідношення сторін джерела зображення. Що в більшості випадків точно не відповідає макеті або розмірам, зазначеним у макеті. Тому

  1. Або змініть розмір зображення, щоб він відповідав заданому макеті, або
  2. Використовуйте android:scaleTypeдля розміщення зображення. Наприклад, ви можете вказатиandroid:scaleType="fitXY"

3

ці додаткові накладки автогенеруються, оскільки андроїд намагатиметься отримати оригінальне співвідношення сторін. будь ласка, спробуйте нижче

scaletype = "fitCenter"
android:adjustViewBounds="true"
android:layout_height="wrap_content"

0

Можливо, ви можете дати specific height to imageView say 50dp or 40dpі adjust image to make green borderвідійти.

Наприклад: android:layout_height="40dp"


встановлення layout_width = "480px" та layout_height = "64px" дає результат, який я хочу, але пікселі не дуже практичні. я, чесно кажучи, не розумію, як це перекладається на dp.
stefs

Ви повинні використовувати dp так само, як і пікселі. Це все, що вони є; відображення незалежних пікселів. але це працює.
Удайкіран

dp / dip означає пікселі незалежності щільності; наскільки я розумію, він охоплює різну щільність, але (звичайно) не різний розмір екрана. Все, що я хочу, - це масштаб зображення до 100% ширини екрану і залишити висоту, щоб пропорції зберігалися.
stefs

0
android:layout_height="wrap_content"

Потрібно змінити його на "fill_parent"

Також вам може знадобитися масштабувати зображення, щоб воно було правильним співвідношенням, щоб заповнити кадр, який він знаходиться.

Я не розумію, навіщо вам взагалі потрібен макет кадру. Без цього ваше зображення все одно просто заповнить екран.

EDIT: так, вибачте, xml - це висота для перегляду зображення.


1
Єдине, що потрібно додати, це те, що йому потрібно встановити висоту макета ImageView, це не так очевидно у вашій відповіді :)
ernazm

Я спробував це без навколишнього макета теж нічого не змінює. також, поточне зображення є лише заповнювачем - незабаром з’являться додаткові елементи (виправдовуючи навколишній макет). я не хочу, щоб зображення відповідало екрану, я хочу його просто там, вгорі.
stefs

Двічі перевірте, чи немає у вашому зображенні порожнього місця вгорі та внизу. Якщо ні, то спробуйте змінити масштаб об'єкта перегляду зображень за допомогою android: scaleType = "". Повинно бути, щоб він відповідав тому, що ти шукаєш.
NotACleverMan


-1

Для кращого вигляду потрібно надати форму навколо перегляду зображень.

Ось що я використав:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--<gradient android:startColor="#FFFFFF" android:endColor="#969696"

    android:angle="270">
-->
<gradient android:startColor="#FFFFFF" android:endColor="#FFFFFF"

    android:angle="270">
</gradient>
    <stroke android:width="2dp" android:color="@color/graycolor" />
<corners android:radius="2dp" />
<padding android:left="5dp" android:top="5dp" android:right="5dp"
    android:bottom="5dp" />


2
о! Я вже працював з формами (для фонів вкладок), але, чесно кажучи, я не розумію, як я повинен це застосувати тут.
stefs

@Schnalle: зробіть два файли shape.xml та один selector.xml. застосувати фон зображення як файл selector.xml. У файлі селектора надаються два стану для зосередженого / вибраного та нормального стану.
Zoombie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.