Espero que seja uma pergunta rápida, mas não consigo encontrar nenhum exemplo ... Gostaria de escrever um texto de várias linhas em um personalizado View
por meio de a Canvas
, e onDraw()
tenho:
...
String text = "This is\nmulti-line\ntext";
canvas.drawText(text, 100, 100, mTextPaint);
...
Eu esperava que isso resultasse em quebras de linha, mas, em vez disso, estou vendo caracteres enigmáticos onde \n
estaria.
Qualquer ponteiro apreciado.
Paulo
android
android-canvas
Paul Mennega
fonte
fonte
Layout
vez de chamarCanvas.drawText
diretamente. Esta sessão de perguntas e respostas mostra como usar aStaticLayout
para desenhar texto de várias linhas.Respostas:
Infelizmente, o Android não sabe o que
\n
é. O que você precisa fazer é retirar o\n
e, em seguida, deslocar o Y para obter seu texto na próxima linha. Então, algo como isto:fonte
drawText()
?Eu encontrei outra maneira usando layouts estáticos. O código está aqui para qualquer pessoa consultar:
fonte
canvas.getWidth()
deve ser realmentegetWidth() - getPaddingLeft() - getPaddingRight()
, para explicar o preenchimento da vista. Além disso, observe que você pode calcular o StaticLayout somente quando o tamanho do texto ou da visualização mudar e desenhá-lo sem criar um novo, o que provavelmente é melhor!Basta percorrer cada linha:
fonte
Eu escrevi exemplo completo
colors.xml
classe java
fonte
int noOfLines = gText.split("\n").length
Esta é a minha solução que se baseia na resposta do @ Dave (obrigado;)
Tentei herdar o Canvas, mas isso realmente não permite. Portanto, esta é uma aula intermediária!
fonte
Eu tenho que adicionar aqui minha versão que considera a LARGURA DO CURSO também.
fonte
vai funcionar. eu testei
Fonte: http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/
fonte
Sim. Use
canvas.getFontSpacing()
como incremento. Eu tentei por curiosidade e funciona para qualquer tamanho de fonte.fonte
tente isso
fonte
Eu reutilizei a solução proposta pelo GreenBee e fiz uma função para desenhar algum texto de várias linhas nos limites especificados com o "..." no final, se um truncado acontecer:
fonte
Solução sem StaticLayout
fonte
Eu trabalhei com o que tinha, que já convertia linhas simples em telas, e trabalhei com a resposta de Lumis e acabei com isso. O 1.3 e 1.3f devem ser preenchidos entre linhas, em relação ao tamanho da fonte.
fonte
Eu enfrentei um problema semelhante. mas eu deveria retornar o caminho do texto. você pode desenhar esse caminho no Canvas. esse é o meu código Eu uso o texto de quebra. e path.op
e para encontrar texto ligado eu usei essa função
fonte
Para usuários do Kotlin. O texto de várias linhas pode ser criado usando StaticLayout . Encontrei uma ótima explicação e como usá-lo como uma função de extensão aqui. https://medium.com/over-engineering/drawing-multiline-text-to-canvas-on-android-9b98f0bfa16a
fonte
Além de desenhar texto de múltiplas linhas, pode-se ter dificuldade em obter os limites do texto de várias linhas (por exemplo, para alinhá-lo na tela).
O padrão
paint.getTextBounds()
não funcionará neste caso, pois medirá a única linha.Por conveniência, criei essas duas funções de extensão: uma para desenhar texto com várias linhas e a outra para obter limites de texto.
Agora, é fácil usá-lo: Para desenhar texto com várias linhas:
Para medir texto:
limites de val = yourPaint.getTextBoundsMultiLine (texto)
Nesse caso, ele medirá todo o texto do início ao fim e com o uso do padrão, uma vez alocado (mutável) Rect.
Você pode brincar com a passagem de parâmetros extras para maior flexibilidade.
fonte
Meu exemplo com dimensionamento dinâmico de texto e espaçamento, funciona muito bem para mim ...
fonte