Android TextView langer Schatten

8

Ich habe das seit dem Morgen versucht, aber ich kann es nicht zur Arbeit bringen.

Was ich versuche, ist ein ähnlicher langer Schatten für das TextView, der dem folgenden ähnelt:

Ссылка Ссылка

Meine Lösung war bisher, eine Menge TextViews zu erstellen und sie untereinander zu kaskadieren, aber es gibt eine Menge Leistungsprobleme, wenn ich mit dem aktuellen Weg gehe.

Eine andere Lösung ist die Verwendung einer benutzerdefinierten Schriftart, die diese Ähnlichkeit hat, aber ich kann keine finden, die mit der Schriftart übereinstimmt, die ich gerade verwende.

Ich frage mich also, ob es möglich ist: (Ich muss erwähnen, dass die Textansichten dynamisch erstellt werden)

%Vor%

Um mehrere davon in einer Linie (als kaskadierende Ebene) zu erstellen, scheint der Schatten glatt zu sein? Oder schlagen Sie irgendwelche anderen Lösungen vor?

Vielen Dank im Voraus.

    
John 12.10.2014, 14:20
quelle

3 Antworten

12

Versuchen Sie, mit Rasterbildern zu spielen:

  1. Erkenne Textgrenzen mit Paint.getTextBounds() Methode
  2. Erstellen Sie transparent Bitmap mit solchen Metriken (W + H) x H (Sie können % co_de verwenden % zur Optimierung der Speichernutzung)
  3. Zeichnen Sie Text für diese Bitmap.Config.ALPHA_8 at Bitmap position
  4. Kopieren Sie erste Zeile von 0x0 in eine neue mit Originalbreite, aber mit der Höhe von Bitmap
  5. Iteriere über die 1px von Y-axis (von oben nach unten) und zeichne eine einzeilige Bitmap mit dem entsprechenden Offset von Bitmap (du wirst einige transparente Pixel überziehen)
  6. Jetzt haben Sie den oberen Teil Ihres Schattens
  7. Zeichnen Sie den unteren Teil mit derselben Technik, aber wählen Sie letzte Zeile dieses X-axis

Dieser Algorithmus kann optimiert werden, wenn Sie feststellen, dass alle Pixel in der letzten Zeile die gleiche Farbe haben (voller Schatten).

UPDATE 1

Ich habe dieses Ergebnis mit dieser schnellen Lösung erreicht:

MainActivity.java

%Vor%

LongShadowTextView.java

%Vor%

UPDATE 2

Hier ist das Endergebnis, das ich erreicht habe. Klonen Sie diese Demo von github.

    
Oleksii K. 16.10.2014, 14:42
quelle
1

Ich fürchte, Ihr vorgeschlagener Ansatz, setShadowLayer() zu verwenden, funktioniert nicht, da dieser Ansatz effektiv ein zweites TextPaint mit Unschärfe zeichnet.

Wenn Sie mehrere TextPaints übereinander legen, bedeutet dies im Wesentlichen, dass Sie sie für jeden Schritt um 1 Pixel korrigieren müssen, was grafisch sehr sehr ist und eine sehr schlechte Leistung hat.

Dies ist eine ausgezeichnete Frage und eine echte Herausforderung!

Die einzige Lösung, die Ihnen in den Sinn kommt, besteht darin, jedes Glyph unabhängig zu behandeln, alle Pfadelemente zu untersuchen und einen Schatten zwischen dem äußersten Punkt links unten und oben rechts zu erweitern. Das scheint sehr kompliziert zu sein, und ich weiß nicht, ob es im SDK Mechanismen gibt, die einen solchen Ansatz ermöglichen.

Vorgeschlagener Messwert:

li>
  • Diese Antwort zeigt, wie Sie die Verwendung von Pfaden nutzen können , obwohl es sich um einen JavaScript-Ansatz handelt.
  • Paul Lammertsma 12.10.2014 14:38
    quelle
    0

    Kleiner Kommentar, wenn jemand versuchen würde, die setText () -Methode auszuführen. Es funktioniert jetzt nicht. Sie sollten invalidate () aufrufen; in setText (); Methode

    %Vor%     
    rurik 03.01.2015 19:37
    quelle

    Tags und Links