[Java] Come sovrapporre il colore del testo dell'elemento di elenco in una regione specifica?



Answers

Per prima cosa, mantieni una bitmap e una tela di riserva:

class Listpicker extends ListView {
    Bitmap bitmapForOnDraw = null;
    Canvas canvasForOnDraw = null;

Assicurati che sia della misura giusta:

    @override
    protected void onSizeChanged (int w, int h, int oldw, int oldh) {
        if (bitmapForOnDraw != null) bitmapForOnDraw.recycle();
        bitmapForOnDraw = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        canvasForOnDraw = new Canvas(bitmapForOnDraw);
    }

E quando arriviamo a disegnare la lista:

    @override
    protected void onDraw(android.graphics.Canvas realCanvas) {
        // Put the list in place
        super.onDraw(realCanvas);

        // Now get the same again
        canvasForOnDraw.drawColor(0x00000000, PorterDuff.Mode.CLEAR);
        super.onDraw(canvasForOnDraw);
        // But now change the colour of the white text
        canvasForOnDraw.drawColor(0xffff00ff, PorterDuff.Mode.MULTIPLY);

        // Copy the different colour text into the right place
        canvas.drawBitmap(bitmapForOnDraw, glassRect, glassRect overwritePaint);

        // finally, put the box on.
        canvas.drawBitmap(glassPickerBitmap, null, glassRect, semiTransparrentPaint);
    }
Question

Supponiamo di avere il ListView personalizzato che estende il metodo onDraw() disegnando un rettangolo al suo interno.

class Listpicker extends ListView {
//..Some other methods here..//
    @Override
    protected void onDraw(android.graphics.Canvas canvas) {
    super.onDraw(canvas);
    canvas.drawBitmap(glassPickerBitmap, null, glassRect, semiTransparrentPaint);
    }
}

La bitmap disegnata rappresenta una sorta di vetro che è un rettangolo con larghezza uguale alla larghezza di listview e ad un'altezza. Quello che voglio è quando l'elemento della lista scorre in questo rettangolo, il colore usato per disegnare il testo (non tutti gli elementi con lo sfondo e così via) sarebbe cambiato in un altro colore. Quindi, ad esempio, quando la voce di elenco si adatta in modo che solo metà altezza del testo si adatti a glassPickerBitmap , la parte esterna dell'elemento di elenco deve rimanere nei suoi colori ordinali e la parte che si trova all'interno di glassPickerBitmap dovrebbe cambiare il colore del testo. Gli elementi dell'elenco sono semplici TextView senza sfondo.

Come può essere realizzato? Forse qualche ColorFilter è assegnato al Paint ? Ma dove? onDraw() metodo onDraw() di Listview non viene nemmeno chiamato quando si ListView ... Può essere fatto all'interno di viste personalizzate, ad esempio, che saranno gli oggetti di ListView ? O potrebbe essere un po 'di Color / Shader / non so in quale altro modo può essere usato overlay qui, ma dove ?

EDIT (esempi di immagini aggiunti):

Ecco un esempio di alcune colture di app reali. Ci sono 2 ListView : uno a sinistra, l'altro a destra. Il vetro è il rettangolo grigio. Ora, nella lista di sinistra è stata selezionata la valuta "Dollaro statunitense" . E sto scorrendo destra ListView in quel modo, quella selezione è da qualche parte tra USD e Afghani Afghani . Ora, quello che voglio, è che la valuta USD nella sinistra del ListView sarebbe disegnata in rosso (il colore esatto non importa ora, lo cambierò in seguito a qualcosa di significativo) E, allo stesso tempo, la parte inferiore di "Stati Uniti Il dollaro " e la parte superiore di " Afghani afghano " nel giusto ListView verrebbero disegnati anche nello stesso colore rosso.

Questo cambio di colore dovrebbe essere fatto in modo dinamico - il colore dovrebbe essere cambiato solo per la parte di testo che si trova sotto il rettangolo di vetro durante lo scorrimento della lista.

* OK, EUR e USD qui sono valute speciali disegnate con colori ciano non standard. La domanda riguarda almeno il testo con il colore bianco . Ma se sarà possibile cambiare anche il colore ciano sarebbe fantastico.




Links