Padding yang tidak diinginkan di sekitar ImageView

142

Saya perlu memasukkan grafik header di semua kegiatan / tampilan saya. File dengan header disebut 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>

Perhatikan android:background="#00FF00"(hijau), itu hanya tujuan visualisasi.

Saya memasukkan mereka ke dalam pandangan saya seperti ini:

<?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" />
  (...)

Jadi, ketika saya benar-benar mencobanya, hasilnya terlihat seperti gambar kiri, bukan seperti apa seharusnya (kanan):

perhatikan perbatasan hijau

(1) Ini - bagian oranye adalah gambar / ImageView dalam pertanyaan
(2) Perbatasan hijau yang tidak dicintai. Catatan: biasanya, area hijau akan transparan - Ini hanya hijau karena saya mengatur background.

Perhatikan batas hijau di sekitar gambar di atas; Itu adalah bagian dari ImageView dan saya tidak tahu mengapa itu ada di sana atau bagaimana saya bisa menghilangkannya. Ini mengatur semua paddings dan margin ke 0 (tapi hasilnya sama ketika saya menghilangkannya). Gambar adalah jpeg 480x64px * dan saya menaruhnya di res / drawable (bukan di salah satu dari itu drawable-Xdpi)

(* jpeg, karena sepertinya saya menemukan masalah gamma png lama - pada awalnya saya mengatasi masalah dengan membuat perbatasan hijau oranye sama seperti gambar, dan warnanya tidak cocok.)

Saya mencobanya pada keinginan htc saya / 2.2 / Build 2.33.163.1 dan pada emulator. Saya juga menjelaskan masalahnya kepada seseorang di # android-dev; Dia bisa mereproduksi masalah tetapi juga tidak punya penjelasan. membangun target adalah 1.6.

update @tehgoose: kode ini menghasilkan hasil padded atas + bawah yang sama persis.

<?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>
STFs
sumber
Marjin negatif dan / atau nilai padding mungkin juga kerja - android:layout_margin="-10dp",android:padding="-10dp"
samis

Jawaban:

442

akhirnya!

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

yang atribut adjustViewbounds melakukan trik:

Setel ini menjadi true jika Anda ingin ImageView menyesuaikan batasnya untuk mempertahankan rasio aspek yang dapat digambar.

saya tersandung di sini . terima kasih atas bantuan Anda!

STFs
sumber
7
Saya memiliki masalah yang sama, tetapi solusi ini tidak berpengaruh.
Marty Miller
4
Wow ... tanpa atribut itu ada padding yang tidak diinginkan ditambahkan tergantung pada kepadatan layar, jadi itu hanya terjadi pada beberapa perangkat. Itu membuat saya gila karena gambar terlihat baik pada semua perangkat yang saya miliki, maka ketika saya mencobanya pada perangkat teman, itu tampak seperti omong kosong. TERIMA KASIH.
DiscDev
Terima kasih para dewa, saya mengalihkan upaya pertama saya dari mencoba menyelesaikan bug untuk menemukan sesuatu yang usang dari android. Saya percaya masalah ini dimulai pada beberapa produsen mengubah barang-barang dari android dan kemudian mereka harus meletakkan properti untuk menyelesaikannya di versi berikutnya.
Ratata Tata
Sayangnya ini tidak bekerja untuk apis rendah, setidaknya api 16 & 17.
Luoser
1
Wow ini persis apa yang saya cari, saya menggaruk-garuk kepala selama beberapa jam, bahkan pergi sejauh mencoba membatalkan tata letak saya dan mengatur tinggi / lebar ke gambar. Solusi sederhana yang berfungsi sempurna tanpa perlu scaleType.
CodyEngel
39
android:scaleType="fitXY"

Ini bekerja untuk saya.

Badr
sumber
3
scaleType="fitXY"melakukan sesuatu yang berbeda: mengubah rasio aspek gambar, menyebabkan distorsi. ini kadang-kadang dapat diterima, misalnya untuk gambar latar belakang abstrak.
stefs
1
Saya mengontrol rasio aspek menggunakan android: width dan android: height, dan scaleType = "fitXY" memang mengisi imageView untuk saya dengan rasio aspek yang diinginkan, itu setidaknya pengalaman saya. Terima kasih atas masukan Anda.
Badr
Ini
berfungsi
1
Tidak persis seperti android: scaleType = "fitEnd" bekerja seperti sulap.
TheLibrarian
Saya menemukan kombinasi android:adjustViewBounds="true"dan android:scaleType="fitXY"apa yang saya butuhkan untuk menyelaraskan ImageViews di tata letak saya. Gambar dimatikan oleh satu atau dua piksel (sangat kecil pada tampilan hi-res) hanya dengan adjustViewBounds. Menambahkan scaleTypetampaknya memaksa penskalaan akhir gambar setelah batas tampilan disesuaikan yang memaksa gambar untuk skala ke ukuran penuh dari batas baru.
Jeff Lockhart
3

Ini ada hubungannya dengan rasio aspek gambar. Secara default, sistem menyimpan rasio aspek asli dari sumber gambar. Yang dalam kebanyakan kasus tidak sama persis dengan tata letak atau dimensi yang ditentukan dalam tata letak. Karena itu,

  1. Ubah ukuran gambar agar sesuai dengan tata letak yang ditentukan, atau
  2. Gunakan android:scaleTypeagar sesuai dengan gambar. Misalnya, Anda dapat menentukanandroid:scaleType="fitXY"
Nazar Merza
sumber
3

padding ekstra tersebut di-autogenerasi karena android akan mencoba untuk mendapatkan rasio aspek asli. silakan coba di bawah ini

scaletype = "fitCenter"
android:adjustViewBounds="true"
android:layout_height="wrap_content"
MJ Montes
sumber
0

Mungkin Anda bisa memberi specific height to imageView say 50dp or 40dpdan adjust image to make green bordermenghilang.

Misalnya: android:layout_height="40dp"

Udaykiran
sumber
mengatur layout_width = "480px" dan layout_height = "64px" menghasilkan hasil yang saya inginkan, tetapi piksel tidak terlalu praktis. saya jujur ​​tidak mengerti bagaimana itu diterjemahkan ke dp.
stefs
Anda harus menggunakan dp seperti halnya piksel. Itu saja mereka; menampilkan piksel independen. tapi berhasil.
Udaykiran
dp / dip berarti Density Independent Pixels; sejauh yang saya mengerti, ini mencakup kepadatan yang berbeda, tetapi (tentu saja) ukuran layar tidak berbeda. yang saya inginkan adalah gambar untuk skala ke 100% lebar layar dan meninggalkan ketinggian sehingga proporsi disimpan.
stefs
0
android:layout_height="wrap_content"

Anda perlu mengubahnya ke "fill_parent"

Anda juga mungkin perlu skala gambar Anda sehingga itu akan menjadi rasio yang tepat untuk mengisi pembingkaian itu.

Saya tidak mengerti mengapa Anda membutuhkan tata letak bingkai di sana. Tanpanya, gambar Anda hanya akan mengisi layar.

Sunting: ya, maaf, xml adalah ketinggian untuk tampilan gambar.

NotACleverMan
sumber
1
Satu-satunya hal yang ditambahkan adalah bahwa ia perlu mengatur ketinggian tata letak ImageView, itu tidak begitu jelas dalam jawaban Anda :)
ernazm
saya mencobanya tanpa tata letak di sekitarnya juga, tidak mengubah apa pun. juga, gambar saat ini hanyalah pengganti - akan ada elemen tambahan segera (membenarkan tata letak sekitarnya). saya tidak ingin gambarnya cocok dengan layar, saya ingin hanya ada di sana, di bagian atas.
stefs
Periksa ulang untuk melihat apakah gambar Anda memiliki ruang kosong di bagian atas dan bawah. Jika tidak, maka coba scaling objek imageview menggunakan android: scaleType = "". Seharusnya ada satu yang sesuai dengan yang Anda cari.
NotACleverMan
0

gunakan android ini: scaleType = "fitXY" di imageview xml

Gaurav Pandit
sumber
-1

Anda perlu memberikan bentuk di sekitar tampilan gambar untuk memberikan tampilan yang lebih baik.

Di sini apa yang saya gunakan:

<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" />

Zoombie
sumber
2
tunggu! saya sudah bekerja dengan bentuk (untuk latar belakang tab), tapi jujur, saya tidak mengerti bagaimana saya harus menerapkannya di sini.
stefs
@Schnalle: buat dua file styles.xml, dan satu selector.xml. menerapkan latar belakang gambar sebagai file selector.xml. Dalam file pemilih berikan dua status untuk kondisi fokus / terpilih dan normal.
Zoombie