Wie überlagert man die Farbe von Listenelementen in bestimmten Regionen?

8

Nehmen wir an, wir haben die benutzerdefinierte ListView , die die Methode onDraw() erweitert, indem Sie ein Rechteck darin zeichnen.

%Vor%

Die dargestellte Bitmap repräsentiert eine Art von Glas, das ein Rechteck mit einer Breite ist, die der Breite der Listenansicht und einiger Höhe entspricht. Was ich will ist, wenn Listenelement in dieses Rechteck scrollt, wird die Farbe, die zum Zeichnen von Text verwendet wird (nicht alle Elemente mit Hintergrund usw.) in eine andere Farbe geändert. Wenn zum Beispiel ein Listenelement so passt, dass nur eine halbe Höhe des Textes in glassPickerBitmap passt, sollte der äußere Teil des Listenelements in seinen Ordinalfarben bleiben und der Teil innerhalb von glassPickerBitmap sollte seine Textfarbe ändern. Listenelemente sind einfache TextViews ohne Hintergrund.

Wie kann das erreicht werden? Vielleicht ist ColorFilter s dem Paint zugewiesen? Aber wo? onDraw() Methode von Listview wird nicht einmal aufgerufen, wenn ListView gescrollt wird ... Kann dies beispielsweise in angepassten Ansichten geschehen, die ListView s Elemente sind? Oder vielleicht ein paar Farbe / Shader / weiß nicht, was sonst Overlay hier verwendet werden kann, aber wo ?

BEARBEITEN (hinzugefügte Bildbeispiele):

Hier ist ein Beispiel für eine Ernte aus der realen App. Es gibt 2 ListView s: Eins auf der linken Seite, das andere auf der rechten Seite. Glas ist das ausgegraute Rechteck. In der linken Liste ist die Währung "United States Dollar" ausgewählt. Und ich scrolle auf diese Weise richtig ListView , diese Auswahl liegt irgendwo zwischen USD und Afghan Afghani . Nun, was ich will, ist, dass USD Währung in der linken ListView in rot gezeichnet wird (genaue Farbe ist jetzt egal, ich werde es später zu etwas sinnvolles ändern) UND, in der Gleichzeitig würde der untere Teil von "United States Dollar" und der obere Teil von "Afghan Afghani" im rechten ListView ebenfalls in der gleichen roten Farbe gezeichnet werden.

>

Diese Farbänderung sollte auf dynamische Weise erfolgen - die Farbe sollte nur für den Teil des Textes geändert werden, der sich während des Scrollens der Liste unter dem Glasrechteck befindet.

* OK, EUR und USD sind Sonderwährungen, die mit nicht standardmäßiger Cyanfarbe gezeichnet werden. Die Frage betrifft mindestens Text mit weißer Farbe. Aber wenn es möglich ist, auch Cyan Farbe zu ändern, wäre es großartig.

    
Prizoff 05.07.2013, 16:52
quelle

2 Antworten

3

Wie Sie in ihrer Implementierung sehen können, verwenden und aktualisieren sie eine feste Position in ihrer ListAdapter , dann aktualisieren sie die View , die entsprechend übereinstimmt, was für mich der einfachste und einfachere Weg ist, dies zu tun, aber Sie don Erhalte nicht die Hälfte des farbigen Textes, den du noch willst:)

Also hier ist wahrscheinlich eine der schlechtesten Antworten, die ich Ihnen gegeben habe, tut mir leid, ich werde das wahrscheinlich noch einmal Revue passieren lassen oder hoffen, dass jemand Sie auf eine bessere Lösung hinweisen kann

Sie können eine verschwommene Demo sehen unter:

Ссылка

Der schmutzige Weg:

  • Erstelle ein Paint mit einem richtigen ColorMatrixColorFilter , um dies zu beantworten, bin ich einfach desaturierend. Du musst deine 5x4-Matrix für ColorMatrix herausfinden, um das Cyan zu erhalten, nach dem du suchst. Außerdem benötigen Sie Rect s, um Quelle und Ziel beim Zeichnen zu definieren.
  • Erstelle einen Off-Screen Bitmap und Canvas , mit dem du deine Liste zeichnest, das ist in onSizeChanged gemacht, damit wir die richtigen Werte für das Layout haben, hier kannst du anfangen, die Schmutzigkeit zu erkennen Ordnen Sie Bitmap so groß wie Ihre ListView zu, damit Sie OutOfMemoryException .
  • erhalten
  • Überschreibe draw , um deinen Offscreen Canvas zu verwenden, und lasst ListView daran ziehen, dann kannst du Bitmap auf die angegebene Canvas zeichnen, die deine Liste wie üblich zeichnet, und dann nur die Teil dieses Bitmap , das mit der Paint , die wir zuvor definiert haben, anders gezeichnet wird, wird für diese Pixel überzeichnet.
  • Schließlich zeichne dein vorgefertigtes Glas Bitmap , ich würde ein n-Patch (9-Patch) empfehlen, so dass es über Bildschirme und Dichten skaliert und scharf aussieht, dann bekommst du mehr Overdraw für diese Pixel.

Der ganze Kuchen sieht so aus:

%Vor%

Also das sagte, ich hoffe, dass Sie mit einer saubereren Lösung enden, selbst wenn Sie diese halb-halbe Sexiness nicht bekommen:)

    
eveliotc 12.07.2013, 08:33
quelle
1

Behalten Sie zuerst eine Ersatz-Bitmap und einen Canvas:

%Vor%

Stellen Sie sicher, dass es die richtige Größe hat:

%Vor%

Und wenn wir die Liste zeichnen:

%Vor%     
Neil Townsend 14.07.2013 17:02
quelle