31

EditTextズームしたいのですが、 setScaleX/でスクロールするsetScaleYとうまくいきます - テキストは正しい位置で編集されています。

しかし、テキストを選択しようとすると、テキストが拡大縮小されていないときのように、選択ハンドルが位置に描画されます。既知のバグです。

ビュー サイズに関連するポップアップ ウィンドウにハンドルが描画されるため、これは予期された結果です。

上のすべてのアクションandroid.widget.Editorは、そのフィールドを対象としていますprivate TextView mTextView;。また、リフレクションによって独自のエディターを設定する場合、オーバーライドできないプライベート メソッドをどうすればよいかわかりません。

また、レイアウトで計算されたポップアップ ウィンドウのandroid.widget.Editor.HandleView#HandleView座標に選択ハンドルが描画されDynamicLayoutます。

メソッドandroid.text.Layout#getPrimaryHorizontal(int, boolean)は公開されており、その値は大規模に乗算できますが、そのためにはプライベート メソッドを拡張してオーバーライドする必要がありますandroid.widget.TextView#makeSingleLayoutが、これは問題です。

また、必要なすべてのオーバーライドされたメソッドを使用して独自のレイアウトを実装することもできますが、オーバーライドできるすべてのメソッドは@hide注釈でマークされており、リフレクションでアクセスできるフィールドはありません。

次のスクリーンショットは、2 倍にスケーリングされた場合に表示されます

ここに画像の説明を入力

PS: タスクのコンテキストは、ピンチ ツー ズーム編集テキストを含むエディターです。サイズの計算によるテキストの再レイアウトは解決策ではありません。それぞれの画面サイズで Portable Document が必要だからです。

4

2 に答える 2

13

MetricAffectingSpanを使用してそれを行うことができます。これを示すクラスを次に示します。

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

参考:Java Source Code Warehouse プロジェクト

MetricAffectingSpanwrap(CharacterStyle cs)で遊ぶ必要があります。これにより、CharacterStyleを特定の Spanned の単一領域に適用できます。

サブクラスで onTouch をオーバーライドし、その値を ScaleGestureDetector に渡します。検出されたスケールをメンバー変数として格納します。

onDrawをオーバーライドし、 super.onDrawを呼び出す前に、スケール値でcanvas.scale()を呼び出します。AbsoluteSizeSpan でわかるように、AbsoluteSizeSpan (Parcel src)を使用すると、サイズを変更したいテキストが取得され、updateDrawStateが適用されます。

于 2014-05-07T10:01:36.983 に答える
2

これらの要素に異なるスタイルを適用しようとしましたか? ある程度のコンディショニングでうまくいくと思います。

<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>
于 2014-05-10T21:49:22.053 に答える