EditText scale with selection

前端 未结 2 614
难免孤独
难免孤独 2021-02-03 21:14

I have an EditText I want to zoom it, and scroll with setScaleX/setScaleY and it works fine - text is being edited in the right position.

相关标签:
2条回答
  • 2021-02-03 21:32

    You can do that using MetricAffectingSpan. Here is a class exemplifying it:

    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);
            }
        }
    }
    

    Reference: Java Source Code Warehouse project

    You need to play with MetricAffectingSpan and wrap(CharacterStyle cs) - which allows CharacterStyle to be applied to a single region of a given Spanned.

    In your subclass, override onTouch and pass its values to a ScaleGestureDetector. Store the detected scale as a member variable.

    Override onDraw, and call canvas.scale() with your scale value prior to calling through to super.onDraw. As you can notice in the AbsoluteSizeSpan, using AbsoluteSizeSpan(Parcel src) will get the text you wish to resize, then you apply updateDrawState.

    0 讨论(0)
  • 2021-02-03 21:32

    Did you try to apply different styles to these elements? I think it should work with some conditioning.

    <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>
    
    0 讨论(0)
提交回复
热议问题