Riempimento indesiderato attorno a ImageView


142

Devo includere un grafico dell'intestazione in tutte le mie attività / viste. Il file con l'intestazione si chiama 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>

Nota il android:background="#00FF00"(verde), è solo scopi di visualizzazione.

Li includo nei miei punti di vista in questo modo:

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

Quindi, quando lo provo davvero, il risultato appare come l'immagine a sinistra, invece di come dovrebbe essere (a destra):

notare il bordo verde

(1) Questa - la parte arancione - è l'immagine / ImageView in questione
(2) Il bordo verde non amato. nota: normalmente, l'area verde sarebbe trasparente - È solo verde perché ho impostato il background.

Nota il bordo verde attorno all'immagine in alto; Fa parte di ImageView e non riesco proprio a capire perché sia ​​lì o come posso liberarmene. Imposta tutti i padding e i margini su 0 (ma il risultato è lo stesso quando li ometto). L'immagine è un jpeg * 480x64px e l'ho messo in res / drawable (non in uno dei due drawable-Xdpi).

(* jpeg, perché sembra che mi sia imbattuto nel vecchio problema gamma png - all'inizio ho aggirato il problema rendendo il bordo verde lo stesso arancio dell'immagine e i colori non corrispondevano.)

L'ho provato sul mio desiderio HTC / 2.2 / Build 2.33.163.1 e sull'emulatore. Inoltre ho descritto il problema a qualcuno in # android-dev; Poteva riprodurre il problema, ma non aveva nemmeno una spiegazione. il target di costruzione è 1.6.

update @tehgoose: questo codice produce esattamente lo stesso risultato con riempimento superiore + inferiore.

<?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>

Margine negativo e / o valori di riempimento possono anche funzionare - android:layout_margin="-10dp",android:padding="-10dp"
samis

Risposte:


442

finalmente!

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

l' attributo adjustViewbounds ha funzionato:

Impostalo su true se vuoi che ImageView regoli i suoi limiti per preservare le proporzioni del suo disegno.

ci siamo imbattuti qui . Grazie per l'aiuto!


7
Ho lo stesso problema, ma questa soluzione non ha avuto effetto.
Marty Miller,

4
Wow ... senza quell'attributo c'erano aggiunte imbottiture indesiderate a seconda della densità dello schermo, quindi stava accadendo solo su alcuni dispositivi. Mi ha fatto impazzire perché l'immagine sembrava a posto su tutti i dispositivi che possiedo, quindi quando l'avrei provato sul dispositivo di un amico, sembrava una schifezza. GRAZIE.
DiscDev

Grazie agli dei, cambio il mio primo tentativo di cercare di risolvere un bug per trovare qualcosa di Android. Credo che questo problema sia iniziato in alcuni produttori che cambiano roba da Android e quindi devono mettere una proprietà per risolverlo nelle prossime versioni.
Ratata Tata,

Purtroppo questo non funziona con le API inferiori, almeno api 16 e 17.
luoser,

1
Wow, questo è esattamente quello che stavo cercando, mi sono grattato la testa per alcune ore, ho persino cercato di invalidare il layout e impostarne l'altezza / larghezza su quella dell'immagine. Una soluzione così semplice che funziona perfettamente senza la necessità di scaleType.
CodyEngel,

39
android:scaleType="fitXY"

Per me funziona.


3
scaleType="fitXY"fa qualcosa di diverso però: cambia le proporzioni dell'immagine, portando alla distorsione. questo potrebbe essere accettabile a volte, ad es. per un'immagine di sfondo astratta.
stefs

1
Ho controllato le proporzioni usando android: width e android: height e scaleType = "fitXY" mi ha riempito l'immagineView con le proporzioni desiderate, che era almeno la mia esperienza. Grazie per il tuo contributo.
Badr,

Funziona ma l'immagine è semplice, sbilanciata, ritagliata
최봉재

1
Non esattamente ma Android: scaleType = "fitEnd" ha funzionato come per magia.
TheLibrarian

Ho trovato una combinazione di android:adjustViewBounds="true"ed android:scaleType="fitXY"era ciò di cui avevo bisogno per allineare ImageViews nel mio layout. Le immagini sono state disattivate di un pixel o due (molto piccole su un display ad alta risoluzione) con solo adjustViewBounds. L'aggiunta di scaleTypesembra forzare un ridimensionamento finale dell'immagine dopo che i limiti della vista sono stati regolati, il che forza l'immagine a ridimensionarsi alla massima dimensione dei nuovi limiti.
Jeff Lockhart,

3

Ha a che fare con le proporzioni dell'immagine. Per impostazione predefinita, il sistema mantiene le proporzioni originali della fonte dell'immagine. Che nella maggior parte dei casi non corrisponde esattamente al layout o alle dimensioni specificate nel layout. Perciò,

  1. Modificare le dimensioni dell'immagine per adattarle al layout specificato oppure
  2. Utilizzare android:scaleTypeper adattare l'immagine. Ad esempio, è possibile specificareandroid:scaleType="fitXY"

3

quei padding extra sono generati automaticamente poiché l'androide avrebbe cercato di ottenere le proporzioni originali. per favore prova di seguito

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

0

Può essere che tu possa dare specific height to imageView say 50dp or 40dpe adjust image to make green bordersparire.

Per esempio: android:layout_height="40dp"


impostando layout_width = "480px" e layout_height = "64px" si ottiene il risultato che desidero, ma i pixel non sono molto pratici. onestamente non capisco come questo si traduca in dp.
stefs

Dovresti usare dp come faresti con i pixel. Questo è tutto ciò che sono; visualizzare pixel indipendenti. ma funziona.
Udaykiran,

dp / dip significa pixel indipendenti dalla densità; per quanto ho capito, copre diverse densità, ma (ovviamente) non diverse dimensioni dello schermo. tutto quello che voglio è ridimensionare l'immagine al 100% della larghezza dello schermo e lasciare l'altezza in modo da mantenere le proporzioni.
stefs

0
android:layout_height="wrap_content"

Devi cambiarlo in "fill_parent"

Potrebbe anche essere necessario ridimensionare l'immagine in modo che sia il rapporto corretto per riempire il framelayout in cui si trova.

Non capisco perché hai bisogno del layout della cornice lì. Senza di essa, l'immagine riempirebbe comunque lo schermo.

EDIT: sì, scusa, l'xml è l'altezza per la visualizzazione dell'immagine.


1
L'unica cosa da aggiungere è che deve impostare l'altezza del layout ImageView, non è così evidente nella tua risposta :)
ernazm,

l'ho provato anche senza un layout circostante, non cambia nulla. inoltre, l'immagine corrente è solo un segnaposto: presto ci saranno ulteriori elementi (che giustificano il layout circostante). non voglio che l'immagine corrisponda allo schermo, la voglio proprio lì, in alto.
stefs

Ricontrolla per vedere se l'immagine ha uno spazio vuoto in alto e in basso. In caso contrario, prova a ridimensionare l'oggetto imageview usando android: scaleType = "". Dovrebbe essercene uno adatto a quello che stai cercando.
NotACleverMan,


-1

È necessario fornire forma attorno a imageview per dare un aspetto migliore.

Ecco cosa ho usato:

<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
Whoa! ho già lavorato con le forme (per gli sfondi delle schede), ma onestamente non capisco come dovrei applicarlo qui.
stefs

@Schnalle: crea due file shapes.xml e un selector.xml. applica lo sfondo dell'immagine come file selector.xml. Nel file di selezione fornire due stati per stato focalizzato / selezionato e normale.
Zoombie
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.