2010-08-25 29 views
30

Ho fatto qualche ricerca approfondita di esempi di codice su questo ma non riesco a trovare nulla.Ombre sulla vista di Android

In particolare, sto cercando di aggiungere un'ombra a un png drawable che sto usando in un ImageView. Questo png drawable è un retto arrotondato con angoli trasparenti.

Qualcuno può fornire un esempio di codice su come aggiungere un'ombreggiatura decente a una vista in codice o XML?

+0

si può facilmente generare un'ombra ninepatch utilizzando questo strumento http://inloop.github.io/shadow4android/ – Yuraj

risposta

29

È possibile utilizzare una combinazione di Bitmap.extractAlpha e un BlurMaskFilter per creare manualmente un'ombra esterna per qualsiasi immagine che è necessario visualizzare, ma ciò funzionerebbe solo se l'immagine viene caricata/visualizzata solo una volta ogni tanto, poiché la il processo è costoso.

pseudo-codice (potrebbe anche compilare!):

BlurMaskFilter blurFilter = new BlurMaskFilter(5, BlurMaskFilter.Blur.OUTER); 
Paint shadowPaint = new Paint(); 
shadowPaint.setMaskFilter(blurFilter); 

int[] offsetXY = new int[2]; 
Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY); 

/* Might need to convert shadowImage from 8-bit to ARGB here, can't remember. */ 

Canvas c = new Canvas(shadowImage); 
c.drawBitmap(originalBitmap, offsetXY[0], offsetXY[1], null); 

Poi mettere ShadowImage nella vostra ImageView. Se questa immagine non cambia mai ma viene visualizzata molto, è possibile crearla e memorizzarla nella cache su onCreate per bypassare la costosa elaborazione delle immagini.

Anche se non funziona così, dovrebbe essere sufficiente per farti andare nella giusta direzione.

+3

E 'sorta di funzionato ... Una volta ho cambiato l'offset X [[0] e [1] in drawBitmap per essere negativo di quei valori allineati correttamente. Tuttavia, la bitmap originale viene disegnata come un'immagine nera piena. http://cl.ly/77e6b7839c1ffc94c1e0 Come risolvere? – coneybeare

+0

Non sicuro senza vedere il codice. Prova a controllare i bitdeps dei bitmap di origine e di destinazione. Il problema potrebbe essere che stai disegnando un'immagine a 32 bit (l'originale) su un'immagine a 8 bit (l'immagine shadow estratta). In questo caso, fai qualcosa come Bitmap shadowImage32 = shadowImage.copy (ARGB_8888, true) su dove ho il commento convert, e attingi quel tipo invece di shadowImage a 8 bit. – Josh

+0

Ciao @Josh Sto usando il tuo codice. Funziona, ma come possiamo cambiare il colore dell'ombra? –

25

Per uso ombra scendere al di sotto del codice

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <gradient 
    android:startColor="#ffffff" 
    android:centerColor="#d3d7cf" 
    android:endColor="#2e3436" 
    android:angle="90" /> 
</shape> 

Usa sopra drawable per uno sfondo di una vista

<View 
    android:id="@+id/divider" 
    android:background="@drawable/black_white_gradient" 
    android:layout_width="match_parent" 
    android:layout_height="10sp" 
    android:layout_below="@+id/buildingsList"/> 
+8

Questo non è spiegato come potrebbe essere, ma non è un approccio completamente negativo. Il punto chiave è che la vista con il gradiente come sfondo è una vista separata che deve essere posizionata immediatamente sotto la vista in cui si desidera che appaia l'ombra. Funziona meglio quando la vista da ombreggiare occupa tutta la larghezza dello schermo, altrimenti gli angoli sembreranno sbagliati. –

+0

Questo è un approccio per situazioni dichiarative, ma nel mio caso creo un numero dinamico di pulsanti nel codice a seconda dei dati letti, quindi non è molto utile per il mio caso. – jrichview

8

Questo mi ha aiutato a ottenere l'ombra di lavoro così ho voluto condividere il codice di lavoro:

private Bitmap createShadowBitmap(Bitmap originalBitmap) { 
    BlurMaskFilter blurFilter = new BlurMaskFilter(5, BlurMaskFilter.Blur.OUTER); 
    Paint shadowPaint = new Paint(); 
    shadowPaint.setMaskFilter(blurFilter); 

    int[] offsetXY = new int[2]; 
    Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY); 

    /* Need to convert shadowImage from 8-bit to ARGB here. */ 
    Bitmap shadowImage32 = shadowImage.copy(Bitmap.Config.ARGB_8888, true); 
    Canvas c = new Canvas(shadowImage32); 
    c.drawBitmap(originalBitmap, -offsetXY[0], -offsetXY[1], null); 

    return shadowImage32; 
} 
3

Per API 21 (5,0) + aggiungere android:elevation="4dp" o android:translationZ="4dp" per visualizzare la descrizione. Documentation

Elevation Attribute

1

Usa sempre ombra trasparente tale da poter aderire a qualsiasi colore.

shadow.xml

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 
    <gradient 
    android:startColor="#002e3436" 
    android:endColor="#992e3436" 
    android:angle="90" /> 
</shape> 

e in vista

<View 
    android:id="@+id/divider" 
    android:background="@drawable/shadow" 
    android:layout_width="match_parent" 
    android:layout_height="5dp"/> 
Problemi correlati