Fließtextansicht um das Bild herum

8

Ich habe stundenlang nach Antworten gesucht und habe wirklich keine Ahnung, wie ich das lösen soll. Kommen wir also zur Sache:

Es gibt ein Bild und ein TextView und ich muss den TextView um den ImageView wie folgt fließen lassen:

Die erste mögliche Lösung wäre Ссылка , aber es wird nicht TextView erweitert, so dass diese Bibliothek nicht für mich geeignet ist aus Gründen.

Die zweite Lösung wäre die Verwendung von LeadingMarginSpan.LeadingMarginSpan2 span, wirkt sich jedoch auf jeden Absatz für jede n Zeilen innerhalb des Textes aus (wie in dieser Antwort - & gt; Wie Layout-Text um ein Bild fließen ), so bekomme ich etw:

Aber ich wollte den Rand nur für die ersten n Zeilen setzen! Dann entschied ich, LeadingMarginSpan.Standart zu implementieren und einen Zähler zu erstellen und ihn in getLeadingMargin(first: Boolean): Int function incruf zu erhöhen. Wenn der Zähler den gewünschten Wert erreicht, gibt die Funktion 0 als Randbreite zurück. Und es gibt wieder ein Versagen! Anstatt die TextView -Zeilen zu füllen, ist der Text gerade nach links gegangen und hat sich nicht bis zum Ende der Ansicht ausgebreitet!

UPD: Ja, ich habe onGlobalLayoutListener hier verwendet

Nun, für eine andere Lösung googeln fand ich diese Antwort Ссылка Ok, ich habe alles wie beschrieben gemacht und den Code implementiert:

%Vor%

Mein OnGlobalLayoutListener sieht so aus: '

%Vor%

'

Nun, es funktioniert. Aber wie schrecklich es funktioniert! Da ich das Viewholder-Muster verwende, muss ich eine Variable zum Listener halten und entfernen, wenn sie nicht aufgerufen und erfolgreich entfernt wurde, weil onGlobalLayout function nicht rechtzeitig aufgerufen wurde! Und es heißt zu spät, also musst du etwa 300 ms warten und dann die "Rekonstruktion" des TextView anschauen und es sieht ekelhaft aus!

Also, meine Frage ist: Wie werden Ränder für erste n Zeilen in TextView erstellt, bevor sie auf der Benutzeroberfläche gezeichnet wurden?

    
koresuniku 11.08.2017, 04:27
quelle

1 Antwort

0

Endlich habe ich die beste Lösung gefunden. Es basiert auf dem Erstellen eines Modells von TextView der gewünschten Breite mit StaticLayout

  1. Zuerst berechnen wir die Breite von TextView (subtrahieren Sie nur die Seitenpolster und die Breite des Bildcontainers von der Darstellungsbreite) in Pixel.
  2. Zweitens benötigen wir die Höhe des Bildcontainers (in Pixel).
  3. Drittens, wie die Praxis zeigt, ignoriert StaticLayout Zeilenumbrüche ( "\n" oder "\r" ). Daher müssen wir unsere Zeichenfolge in einzelne, nichtbrechende Zeilen aufteilen, um das TextView erfolgreich nachzubilden. Layout: %Code%
  4. Anschließend erstellt der folgende Algorithmus val commentParts = spannable.toString().split("\r") -Instanzen für jede Zeile und überprüft, ob die Zeilen die Höhe des Bildcontainers überschreiten. Falls dies der Fall ist, können wir schließlich die Position des letzten Zeichens der letzten Zeile rechts neben dem Bildcontainer erhalten. Und dann müssen wir selbst einen Zeilenumbruch erstellen, damit StaticLayout die Margen ab LeadingMarginSpanLayout char position stoppen kann:

    %Vor%
  5. Und das letzte, setze [end + 1] auf die spannbare Zeichenkette:

    %Vor%
  6. Eventuell ist die Zeitspanne richtig eingestellt!

koresuniku 12.08.2017, 03:38
quelle