2013-03-13 14 views
32

Ho creato un'attività con un'immagine di intestazione. Questa immagine di intestazione è stata originariamente creata nel layout xml di Activity utilizzando un ImageView in cui scaleType è impostato su centerCrop. Questo fa ciò che voglio, centra l'immagine, la ritaglia a destra e a sinistra in modalità verticale, mostrando tutto in modalità orizzontale.Equivalente di scala ImageViewType 'centerCrop' per gravità selezionabile bitmap

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingTop="30dp" 
    android:paddingBottom="6dp" 
    android:paddingLeft="6dp" 
    android:paddingRight="6dp" 
    android:background="#919EAC" 
    android:orientation="vertical" > 

<ImageView 
    android:id="@+id/header_image" 
    android:layout_width="match_parent" 
    android:layout_height="120dp" 
    android:contentDescription="@string/header_description" 
    android:scaleType="centerCrop" 
    android:src="@drawable/header" /> 

    .... <other views> ... 

mi piacerebbe sostituire questo con un background disegnabile in modo che possa utilizzare lo spazio immagine di intestazione per visualizzare i dati, e consente di risparmiare me ripetere lo stesso layout in diverse attività.

Per questo motivo ho creato un drawable che posso fare riferimento nella android: attributo background:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" > 
     <item> 
      <shape android:shape="rectangle" > 
       <solid android:color="#919EAC" /> 
      </shape> 
     </item> 
     <item> 
      <bitmap 
       android:antialias="true" 
       android:gravity="top|center_horizontal" 
       android:src="@drawable/header" /> 
     </item> 
    </layer-list> 

Questa drawable definisce lo sfondo colorato che altrimenti il ​​layout definirebbe e definisce un'immagine di testa che altrimenti sarebbe incluso nel layout come ImageView.

Tuttavia ora la mia immagine viene ridimensionata, mentre mi piacerebbe che fosse ritagliata.

Controllo della documentazione Android ho provato altri modi gravitazionali come

android:gravity="top|clip_horizontal" 

ma sembra ancora visualizzare/scala diverso rispetto alla visualizzazione dell'immagine.

Quale sarebbe la definizione corretta dello sfondo disegnabile?

+4

Sei riuscito a trovare una soluzione al tuo problema? Sto lottando con la stessa cosa. – Marty

+0

correlati http://stackoverflow.com/questions/5119366/set-size-of-layered-drawable – mathheadinclouds

+1

Che ne dici di "fill_vertical | clip_horizontal" –

risposta

-3

Utilizzando scaleType = "centerCrop" si stava raggiungendo un risultato che si desiderava, ritagliare i bordi dell'immagine e mostrare la parte centrale che si adatta a quella dimensione.

Per ImageView:

ImageView hanno scaleType attributo che funziona solo per l'immagine che viene impostato come sorgente da visualizzare. Ad esempio, come se fosse TextView, la fonte è la Text.

Anche se si è notato che scaleType non funziona per un'immagine impostata come sfondo che funziona solo con l'immagine fornita come sorgente in XML di runtime.

Per layout

Layout può mostrare immagini di sfondo, ma non c'è alcun attributo espressa disposizione in grado di elaborare le immagini di sfondo e scalare come per valore dell'attributo.

Quindi dovresti smettere di chiedere la struttura di ImageView da Layout, perché non ce l'ha.

2 diverse soluzioni al problema

1) Mantenere sempre Immagini per il colpo di testa di sfondo nella cartella drawable diversa e utilizzarlo, in questo modo non è necessario per scalarla Runtime come già immagine sviluppata per la dimensione diversa.

2) È necessario riprogettare solo il tuo XML, come qui di seguito campione

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

    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="50dp" 
     android:background="@drawable/subway" 
     android:scaleType="centerCrop" /> 

    <Button 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:layout_alignParentLeft="true" 
     /> 

    <EditText 
     android:id="@+id/editText1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     /> 
</RelativeLayout> 
0

Io non so come si fa con lo sfondo. Puoi provare altre soluzioni:

1) La soluzione più semplice per visualizzare qualcosa sopra l'immagine è metterle entrambe in un layout in modo che si sovrappongano. Ad esempio, è possibile utilizzare un RelativeLayout con le dimensioni di ImageView, ImageView è match_parent in entrambe le dimensioni e TextView al centro.

2) È possibile salvare la vista di immagini in un layout diverso, ad esempio header.xml, e utilizzarlo per include header.xml ovunque sia necessario.

3) Se il layout da visualizzare sopra ImageView è identico ovunque, è possibile creare un layout personalizzato con ImageView e dire, con TextView al centro, e utilizzare tale layout ovunque. È quindi possibile impostare la stringa TextView su questo layout personalizzato. Puoi leggere di più sui layout personalizzati, sono facili.

2

Per centrare raccolto una bitmap nel codice fare questo:

public static Bitmap cropCenter(Bitmap bmp) { 
    int dimension = Math.min(bmp.getWidth(), bmp.getHeight()); 
    return ThumbnailUtils.extractThumbnail(bmp, dimension, dimension); 
} 

Io non conosco nessun altro modo per centerCrop un xml bitmap saggia.

Spero che aiuti chiunque.

ho trovato questa soluzione da questo post: Android Crop Center of Bitmap

1

Ho risolto questo problema con un decoratore che mantiene le proporzioni del drawable sottostante: https://gist.github.com/rudchenkos/e33dc0d6669a61dde9d6548f6c3e0e7e

Purtroppo, non v'è alcun modo per applicare da XML così faccio che proprio all'inizio del mio spruzzata attività:

public class SplashActivity extends AppCompatActivity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     final Drawable bg = getResources().getDrawable(R.drawable.screen); 
     getWindow().setBackgroundDrawable(new CenterCropDrawable(bg)); 

     ... 
    } 
} 

Questo è più o meno equivalente a specificare il drawable come android:windowBackground in il tema Attività