2012-01-31 11 views

risposta

15

EDIT - esempio di seguito si riferisce per Android pre-SDK11, ma ho appena scoperto una delle più suggestive grande libreria chiamata Nine Old Androids, La cosa sorprendente che fa sta permettendo tutti capacità di animazione di Android 3.0 per tutte le versioni API !!!

risposta precedente

realtà ho incontrato questo tipo di problema, quando ha voluto impostare alpha dinamicamente su un layout complesso. Ho creato un override di onSetAlpha() e aggiunto un'altra funzione ricorsiva che controlla ogni tipo di vista per immagini di sfondo, drawable e colori del testo.

@Override 
public boolean onSetAlpha(int alpha) 
{ 
    return onSetAlpha(alpha, theLayoutYouWantToSetAlphaTo); 
} 

public boolean onSetAlpha(int alpha, View view) 
{ 
    if (view instanceof ViewGroup) 
    { 
     for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) 
     { 
      onSetAlpha(alpha, ((ViewGroup) view).getChildAt(i)); 
      if (((ViewGroup) view).getBackground() != null) ((ViewGroup) view).getBackground().setAlpha(alpha); 
     } 
    } 
    else if (view instanceof ImageView) 
    { 
     if (((ImageView) view).getDrawable() != null) ((ImageView) view).getDrawable().setAlpha(alpha); 
     if (((ImageView) view).getBackground() != null) ((ImageView) view).getBackground().setAlpha(alpha); 
    } 
    else if (view instanceof TextView) 
    { 
     ((TextView) view).setTextColor(((TextView) view).getTextColors().withAlpha(alpha)); 
     if (((TextView) view).getBackground() != null) ((TextView) view).getBackground().setAlpha(alpha); 
    } 
    else if (view instanceof EditText) 
    { 
     ((EditText) view).setTextColor(((EditText) view).getTextColors().withAlpha(alpha)); 
     if (((EditText) view).getBackground() != null) ((EditText) view).getBackground().setAlpha(alpha); 
    } 
    return true; 
} 

È possibile aggiungere altri tipi di viste di cui si ha bisogno.

+3

Purtroppo non puoi usare il metodo nineoldandroids. Se fai qualcosa come "ObjectAnimator.ofFloat (myview," alpha ", 0.1f, 0.0f) .setDuration (10) .start();" solo dice "non è stato possibile trovare la proprietà setter alfa per myview con il tipo di valore float . ". – Timmmm

+1

Hai provato a guardare questo? http://jakewharton.com/advanced-pre-honeycomb-animation/ –

+0

il parametro di 'int alpha' è chiuso a [0, 255], ma non [0.0f, 1.0f], giusto? – SilentKnight

47

Prova ad utilizzare un AlphaAnimation: http://developer.android.com/reference/android/view/animation/AlphaAnimation.html


/* deve usare l'animazione al fine di ottenere carta sbiadito. */

AlphaAnimation alpha = new AlphaAnimation(0.7F, 0.7F); 
alpha.setDuration(0); // Make animation instant 
alpha.setFillAfter(true); // Tell it to persist after the animation ends 
view.startAnimation(alpha); 
+0

+1 per la soluzione .. ma questa non è una soluzione ottimale –

+0

@SherifelKhatib Perché questa non è una soluzione "ottimale" e inoltre, come si definisce "ottimale" in questo caso, rispetto all'OP ? –

+0

Wow, questo è vecchio. Credo che stavo pensando di più a qualcosa che implicava il disegno direttamente con l'alfa. Qualcosa nelle vicinanze della risposta di @ Navin che credo meriti un +1. –

0

È possibile impostare Alfa su tutti i colori della vista (ad esempio il testo di un pulsante o le viste secondarie di un gruppo di viste). Trasformali in colori xml e usali in tutta la vista.

È possibile leggere i colori dalla vista in modo ricorsivo e aggiungere alfa e ripristinarli.

È possibile creare la vista come vista principale di una nuova attività. Poi fate come in How do I create a transparent Activity on Android?

9

È possibile estendere i punti di vista metodo draw() e utilizzare il canvas.saveAlphaLayer()

public void draw(Canvas canvas) { 
    canvas.saveLayerAlpha(null, alphaValue, ALL_SAVE_FLAG); 
    super.draw(canvas); 
    canvas.restore(); 
} 
+1

Questa soluzione è effettivamente migliore della mia, l'ho usata al posto di quello che ho suggerito sopra. – Rotemmiz

+0

Per me funziona solo se rimuovo l'ultima riga: 'canvas.restore();'. Forse è perché sto facendo alcune trasformazioni figlio dalla vista genitore. –

+0

Idem sulla necessità di rimuovere l'ultima riga: canvas.restore(); Funziona perfettamente diversamente. –

26

La ViewHelper di NineOldAndroids è quello che uso, è una classe di supporto statica e un vero gioiello! Molti qui raccomandano NineOldAndroids ma non ho visto alcuna menzione di ViewHelper. È veramente facile da usare

import com.nineoldandroids.view.ViewHelper; 
... 

ViewHelper.setAlpha(myView, .2f); 

Si può anche usare per impostare altre proprietà come x, y, ecc, molto utile quando si imposta per le animazioni o costruire l'interfaccia utente. Mille grazie a Jake Wharton per aver condiviso il suo lavoro con la comunità!

+0

grazie per aver menzionato nineoldandroids e aver dato il codice per farlo funzionare. –

+0

Questo non funziona per me su ImageView su un dispositivo 2.3.7. Eventuali suggerimenti? –

+1

Confermo, funziona su dispositivo 2.3. – jskierbi

Problemi correlati