Nehmen wir an, wir haben die benutzerdefinierte ListView
, die die Methode onDraw()
erweitert, indem Sie ein Rechteck darin zeichnen.
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.
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:
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. 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
. 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. 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:)
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%