27 votes

Échelle EditText avec sélection

J'ai un EditText je veux l'agrandir et faire défiler avec setScaleX/setScaleY et il fonctionne très bien - le texte est en cours d'édition dans la bonne position.

Mais quand j'essaie de sélectionner du texte - il attire les poignées de sélection pour des postes comme lorsque le texte n'est pas à l'échelle. Il est connu de bug.

On s'attend à ce résultat, parce que les poignées sont établis sur la fenêtre pop-up liées à la taille d'affichage.

Toutes les actions sur android.widget.Editor sont destinés à son champ private TextView mTextView;. Et si nous allons définir propres de l'éditeur par la réflexion, je ne sais pas quoi faire avec les méthodes privées, qui ne sont pas substituables.

Également des poignées de sélection sont établis sur la fenêtre Popup android.widget.Editor.HandleView#HandleView coordonnées calculées dans la Mise en page et j'ai besoin seulement d' DynamicLayout , mais il ont pas de différence pour nos fins.

Méthode android.text.Layout#getPrimaryHorizontal(int, boolean) est public et sa valeur peut être multipliée à l'échelle, mais pour cela nous avons besoin de les étendre et de les remplacer méthode privée android.widget.TextView#makeSingleLayout, mais c'est un problème.

Nous avons également pu mettre en œuvre notre propre Mise en page avec tout le nécessaire remplacé méthodes, mais toutes les méthodes que l'on peut remplacer sont marqués avec @hide d'annotation et il n'y a pas de champs qui peuvent être accessibles avec un de réflexion.

Capture d'écran suivante s'affiche pour les mises à l'échelle sur 2x

enter image description here

PS: le contexte de la tâche est un Éditeur de zoom par pincement modifier le texte. Nouvelle disposition de texte avec calcul de la taille n'est pas une solution. Parce que j'ai besoin de Document Portable sur chaque taille d'écran.

13voto

Avanz Points 6154

Vous pouvez le faire en utilisant MetricAffectingSpan. Voici une classe illustrant cela:

package android.text.style;

import android.os.Parcel;
import android.text.ParcelableSpan;
import android.text.TextPaint;
import android.text.TextUtils;

public class AbsoluteSizeSpan extends MetricAffectingSpan implements ParcelableSpan {

    private final int mSize;
    private boolean mDip;

    /**
     * Set the text size to <code>size physical pixels.
     */
    public AbsoluteSizeSpan(int size) {
        mSize = size;
    }

    /**
     * Set the text size to <code>size physical pixels,
     * or to <code>size device-independent pixels if
     * <code>dip is true.
     */
    public AbsoluteSizeSpan(int size, boolean dip) {
        mSize = size;
        mDip = dip;
    }

    public AbsoluteSizeSpan(Parcel src) {
        mSize = src.readInt();
        mDip = src.readInt() != 0;
    }

    public int getSpanTypeId() {
        return TextUtils.ABSOLUTE_SIZE_SPAN;
    }

    public int describeContents() {
        return 0;
    }

    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mSize);
        dest.writeInt(mDip ? 1 : 0);
    }

    public int getSize() {
        return mSize;
    }

    public boolean getDip() {
        return mDip;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        if (mDip) {
            ds.setTextSize(mSize * ds.density);
        } else {
            ds.setTextSize(mSize);
        }
    }

    @Override
    public void updateMeasureState(TextPaint ds) {
        if (mDip) {
            ds.setTextSize(mSize * ds.density);
        } else {
            ds.setTextSize(mSize);
        }
    }
}

Référence: le Code Source de Java projet d'Entrepôt

Vous devrez jouer avec MetricAffectingSpan et enveloppement(CharacterStyle cs) - ce qui permet CharacterStyle à être appliqué à un seule région de Fractionné.

Dans votre sous-classe, remplacer onTouch et de transmettre ses valeurs à un ScaleGestureDetector. Magasin de la gamme détectée comme une variable membre.

Remplacer onDraw, et d'appeler une toile.scale() avec votre échelle de valeur avant l'appel par le biais de super.onDraw. Comme vous pouvez le constater dans le AbsoluteSizeSpan, à l'aide de AbsoluteSizeSpan(Colis src) permettra d'obtenir le texte que vous souhaitez redimensionner, puis vous appliquez updateDrawState.

2voto

Messer Points 121

Avez-vous essayé d'appliquer différents styles à ces éléments? Je pense que cela devrait fonctionner avec un certain conditionnement.

 <item name="android:textSelectHandle">@drawable/text_select_handle_middle</item>
<item name="android:textSelectHandleLeft">@drawable/text_select_handle_left</item>
<item name="android:textSelectHandleRight">@drawable/text_select_handle_right</item>
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X