我有一个EditText
我想缩放它并滚动setScaleX
/setScaleY
它工作正常 - 文本正在正确的位置进行编辑。
但是当我尝试选择文本时 - 它会将选择手柄绘制到位置,就像文本未缩放时一样。我们都知道bug https://code.google.com/p/android/issues/detail?id=57408.
这是预期的结果,因为句柄是在与视图大小相关的弹出窗口上绘制的。
所有操作均在android.widget.Editor
都针对其领域private TextView mTextView;
。如果我们通过反射设置自己的编辑器,我不知道如何处理不可重写的私有方法。
弹出窗口上还绘制了选择手柄android.widget.Editor.HandleView#HandleView
在布局中计算的坐标,我只需要DynamicLayout
但对于我们的目的来说没有什么区别。
Method android.text.Layout#getPrimaryHorizontal(int, boolean)
是公共的,它的值可以按比例倍增,但为此我们需要扩展和重写私有方法android.widget.TextView#makeSingleLayout
,但这是一个问题。
我们也可以使用所有必需的重写方法来实现我们自己的布局,但是我们可以重写的所有方法都标记为@hide
注解,并且没有可以通过反射访问的字段。
下一个屏幕截图显示为缩放 2 倍
PS:任务的上下文是一个具有捏合缩放编辑文本的编辑器。通过计算大小来重新布局文本并不是解决方案。因为我需要每个屏幕尺寸的便携式文档。
你可以使用度量影响跨度 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/style/MetricAffectingSpan.java。这是一个示例类:
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源代码仓库项目 http://alvinalexander.com/java/jwarehouse/android/core/java/android/text/style/AbsoluteSizeSpan.java.shtml
你需要玩度量影响跨度 http://developer.android.com/reference/android/text/style/MetricAffectingSpan.html and 换行(CharacterStyle cs) http://developer.android.com/reference/android/text/style/CharacterStyle.html- 这使得字符样式应用于给定跨度的单个区域。
在你的子类中,重写onTouch并将其值传递给缩放手势检测器。将检测到的比例存储为成员变量。
覆盖onDraw,并致电画布.scale() https://stackoverflow.com/questions/21546762/how-to-pinch-zoom-an-edittext-in-android在致电之前使用您的比例值超级onDraw。正如您可以在绝对尺寸跨度, using AbsoluteSizeSpan(地块源)会得到您想要调整大小的文本,然后您应用更新绘制状态.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)