Yev*_*lik 31 java android editor spanned pinchzoom
我有一个EditText我想要缩放它,并用setScaleX/ 滚动setScaleY它工作正常 - 正在编辑正确位置的文本.
但是当我尝试选择文本时 - 它会将选择句柄绘制到位置,例如文本未缩放时.这是众所周知的bug.
这是预期的结果,因为在与视图大小相关的弹出窗口上绘制了句柄.
所有行动android.widget.Editor都针对其领域private TextView mTextView;.如果我们将通过反射设置自己的编辑器,我不知道如何处理私有方法,这是不可覆盖的.
此外,选择手柄是android.widget.Editor.HandleView#HandleView在布局中计算的弹出窗口坐标上绘制的,我只需要DynamicLayout它,但它对我们的目的没有区别.
方法android.text.Layout#getPrimaryHorizontal(int, boolean)是公共的,它的值可以按比例增加,但为此我们需要扩展和覆盖私有方法android.widget.TextView#makeSingleLayout,但这是一个问题.
我们也可以使用所有必需的override方法实现我们自己的Layout,但是我们可以覆盖的所有方法都使用@hide注释标记,并且没有可以使用反射访问的字段.
下一个屏幕截图显示为2x缩放

PS:任务的上下文是具有双指缩放编辑文本的编辑器.通过计算大小来重新布局文本不是解决方案.因为我需要在每个屏幕尺寸上使用Portable Document.
Ava*_*anz 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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
参考:Java源代码仓库项目
您需要使用MetricAffectingSpan和wrap(CharacterStyle cs) - 它允许将CharacterStyle应用于给定Spanned的单个区域.
在子类中,重写onTouch并将其值传递给ScaleGestureDetector.将检测到的比例存储为成员变量.
重写的onDraw,并调用canvas.scale()调用通过之前与您的刻度值super.onDraw.正如您在AbsoluteSizeSpan中注意到的那样,使用AbsoluteSizeSpan(Parcel src)将获得您希望调整大小的文本,然后应用updateDrawState.
| 归档时间: |
|
| 查看次数: |
1799 次 |
| 最近记录: |