3
votes

Android - Comment obtenir les coordonnées d'un caractère dans une vue de texte

Est-il possible d'obtenir la coordonnée x d'un caractère dans un TextView sous Android? Je ne cherche pas les coordonnées du TextView lui-même, j'ai besoin de la coordonnée du dernier caractère du TextView (multi-lignes)

Merci d'avance


3 Réponses :


0
votes

Utilisation :

layout.getPrimaryHorizontal(int offset)

C'est simple à utiliser. Vous parcourez simplement la mise en page en utilisant la longueur du texte qu'elle utilise.

Il renverra le x du caractère. Donc, les lignes que je reçois toujours de layout.getLineTop () . Au fait, si vous utilisez layout.getLineTop () , notez qu'il y a un comportement étrange, peut-être un bogue.


0 commentaires

1
votes

Solution Java

Voici comment obtenir les coordonnées x et y d'un caractère spécifique. offset est l'index du caractère souhaité dans la chaîne de textView. Ces coordonnées sont relatives au conteneur parent

fun TextView.charLocation(offset: Int): Point? {
    layout ?: return null // Layout may be null right after change to the text view

    val lineOfText = layout.getLineForOffset(offset)
    val xCoordinate = layout.getPrimaryHorizontal(offset).toInt()
    val yCoordinate = layout.getLineTop(lineOfText)
    return Point(xCoordinate, yCoordinate) 
}

Fonction d'extension Kotlin

Si vous prévoyez de l'utiliser plus d'une fois:

Layout layout = textView.getLayout();
if (layout == null) { // Layout may be null right after change to the text view
    // Do nothing
}

int lineOfText = layout.getLineForOffset(offset);
int xCoordinate = (int) layout.getPrimaryHorizontal(offset);
int yCoordinate = layout.getLineTop(lineOfText);

REMARQUE: Pour vous assurer que la mise en page est non nulle , vous pouvez appeler textview.post (() -> {/ * obtenir les coordonnées * /}) en Java ou textview.post {/ * obtenir les coordonnées * /} en Kotlin


0 commentaires

0
votes

Étant donné un intervalle qui a un ou plusieurs paragraphes, essayez d'obtenir le dernier caractère de l'étendue entière ne fonctionne pas. Existe-t-il un autre moyen d'obtenir le même résultat avec getPrimaryHorizontal ()?


0 commentaires