mercoledì 11 novembre 2015

Applicare il metodo tint() usando la Support Library

Applicare una tinta programmaticamente è possibile soltanto se si usano API > 21 (cioè da Lollipop in poi). Però mediante l'Android Support Library v4 è possibile utilizzare il metodo setTint() su un Drawable anche a quei dispositivi che montano una versione precedente di Android.

Esempio:

Supponiamo di voler applicare la tinta ad un drawable in base ad una condizione. Se quella condizione si verifica, usiamo il drawable "tinteggiato", altrimenti usiamo il drawable originale.

Realizzazione:

Prima di tutto importiamo la libreria.

import android.support.v4.graphics.drawable.DrawableCompat;

A questo punto invochiamo il metodo in base al verificarsi o meno della condizione.

Drawable myDrawable = ContextCompat.getDrawable(getContext(), R.drawable.my_icon);
ImageView myImageView = (ImageView) findViewById(R.id.my_image_view);

if (condition)
    tintDrawable(myDrawable, myImageView, false);
else
    tintDrawable(myDrawable, myImageView, true);

Vediamo ora il metodo tintDrawable() a cui vengono passati come parametri il Drawable che si vuole tinteggiare, l'ImageView dove mostrarlo e un booleano.

private void tintDrawable(Drawable drawable, ImageView imageView, boolean original) {

    // false = disabled icon
    if (!original) {  
        drawable = DrawableCompat.wrap(drawable);
        DrawableCompat.setTint(drawable, ContextCompat.getColor(getContext(), R.color.grey800));
        DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SCREEN);
        imageView.setImageDrawable(drawable);
        
    // true = "original" icon
    } else {          
        drawable = DrawableCompat.unwrap(drawable);
        DrawableCompat.setTintList(drawable, null);
        imageView.setImageDrawable(drawable);
    }

}

Bisogna notare come venga effettuato il wrapping del drawable che si vuole tinteggiare. Però, per riottenere il drawable originale non basta soltanto effettuare l'operazione inversa, cioè l'unwrap, ma occorre anche annullare l'operazione di tinta invocando il metodo setTintList() con null come parametro.

Nessun commento:

Posta un commento