Mam nadzieję, że szybkie pytanie, ale nie mogę znaleźć żadnych przykładów ... Chciałbym napisać tekst wielowierszowy do niestandardowego View
za pomocą Canvas
, aw onDraw()
mam:
...
String text = "This is\nmulti-line\ntext";
canvas.drawText(text, 100, 100, mTextPaint);
...
Miałem nadzieję, że spowoduje to łamanie linii, ale zamiast tego widzę tajemnicze znaki w miejscach, w których \n
byłyby.
Wszelkie wskazówki są mile widziane.
Paweł
android
android-canvas
Paul Mennega
źródło
źródło
Layout
zamiastCanvas.drawText
bezpośredniego dzwonienia . To pytanie i odpowiedź pokazuje, jak używać aStaticLayout
do rysowania tekstu wielowierszowego.Odpowiedzi:
Niestety Android nie wie, co
\n
to jest. To, co musisz zrobić, to usunąć,\n
a następnie przesunąć Y, aby uzyskać tekst w następnej linii. Więc coś takiego:źródło
drawText()
?Znalazłem inny sposób, używając układów statycznych. Kod jest tutaj, aby każdy mógł się do niego odnieść:
źródło
canvas.getWidth()
powinno byćgetWidth() - getPaddingLeft() - getPaddingRight()
, aby uwzględnić wypełnienie widoku. Zwróć też uwagę, że możesz obliczyć StaticLayout tylko wtedy, gdy zmieni się twój tekst lub rozmiar widoku i narysuj go bez tworzenia nowego, co prawdopodobnie jest lepsze!Po prostu przeprowadź iterację przez każdą linię:
źródło
Napisałem kompletny przykład
colors.xml
klasa java
źródło
int noOfLines = gText.split("\n").length
To jest moje rozwiązanie oparte na odpowiedzi @ Dave (dzięki btw ;-))
Próbowałem odziedziczyć Canvas, ale tak naprawdę nie pozwala. Więc to jest klasa pośrednia!
źródło
Muszę dodać tutaj moją wersję, która uwzględnia również SZEROKOŚĆ SKOKU.
źródło
to będzie działać. testowałem
Źródło: http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/
źródło
Tak. Użyj
canvas.getFontSpacing()
jako przyrostu. Sam go wypróbowałem z ciekawości i działa dla każdego rozmiaru czcionki.źródło
Spróbuj tego
źródło
Ponownie wykorzystałem rozwiązanie zaproponowane przez GreenBee i utworzyłem funkcję rysowania tekstu wielowierszowego w określonych granicach z "..." na końcu, jeśli nastąpiło obcięcie:
źródło
Rozwiązanie bez StaticLayout
źródło
Pracowałem z tym, co miałem, co już przekształciło pojedyncze linie w płótna i przepracowałem odpowiedź Lumisa i skończyło się na tym. 1.3 i 1.3f są rozumiane jako wypełnienie między wierszami w stosunku do rozmiaru czcionki.
źródło
Miałem podobny problem. ale powinienem zwrócić ścieżkę tekstu. możesz narysować tę ścieżkę na płótnie. to jest mój kod. Używam Break Text. i path.op
a do znalezienia powiązanego tekstu użyłem tej funkcji
źródło
Dla użytkowników Kotlin. Tekst wielowierszowy można utworzyć za pomocą StaticLayout . Znalazłem świetne wyjaśnienie i jak używać go jako funkcji rozszerzenia tutaj. https://medium.com/over-engineering/drawing-multiline-text-to-canvas-on-android-9b98f0bfa16a
źródło
Oprócz rysowania tekstu wielowierszowego można mieć problemy z uzyskaniem granic tekstu wielowierszowego (na przykład w celu wyrównania go na płótnie).
Domyślnie
paint.getTextBounds()
nie zadziała w tym przypadku, ponieważ będzie mierzyć jedyną linię.Dla wygody utworzyłem te dwie funkcje rozszerzające: jedną do rysowania tekstu wielowierszowego, a drugą do pobierania granic tekstu.
Teraz korzystanie z tego jest tak proste: Do rysowania tekstu wielowierszowego:
Do pomiaru tekstu:
val bounds = yourPaint.getTextBoundsMultiLine (tekst)
W tym przypadku zmierzy cały tekst od początku do końca iz użyciem domyślnego po przydzieleniu (mutowalnym) Rect.
Możesz bawić się przekazywaniem dodatkowych parametrów, aby uzyskać dodatkową elastyczność.
źródło
Mój przykład z dynamicznym rozmiarem tekstu i odstępami, działa świetnie dla mnie ...
źródło