我想做的事
我想制作一个旋转和翻转的 EditText 视图,它具有普通 EditText 视图的所有属性。
我的问题
我已经成功地制作了(在 SO 用户的帮助下)一个自定义的 EditText 视图,它既可以旋转又可以翻转。这是通过覆盖 onDraw 方法完成的。但是,光标和突出显示消失了,longtouch 事件仍然指示原始文本位置。基本上,视图被重绘,但触摸事件没有。
如何让触摸事件、突出显示和光标也被旋转和翻转?
我读过的
EditText 随选择缩放(一个类似的问题,但不完全相同。)
如何制作自定义 Edittext,使其看起来像在 android 中旋转 45 度(@CommonsWare 指出一种解决方案,即需要通过触摸事件完成附加工作。那是什么工作?)
http://developer.android.com/training/graphics/opengl/touch.html(有帮助,但我不明白如何在这种情况下应用它。)
我试过的
我制作了一个扩展 EditText 的自定义视图。其中覆盖了 onDraw 方法来旋转和翻转画布。我覆盖了 onMeasure 以使视图具有适合布局的尺寸。
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Typeface;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.widget.EditText;
public class MongolEditText extends EditText {
// Constructors
public MongolEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public MongolEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MongolEditText(Context context) {
super(context);
init();
}
// This class requires the mirrored Mongolian font to be in the assets/fonts folder
private void init() {
Typeface tf = Typeface.createFromAsset(getContext().getAssets(),
"fonts/MongolChagaanMirrored.ttf");
setTypeface(tf);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(heightMeasureSpec, widthMeasureSpec);
setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
}
@Override
protected void onDraw(Canvas canvas) {
TextPaint textPaint = getPaint();
textPaint.setColor(getCurrentTextColor());
textPaint.drawableState = getDrawableState();
canvas.save();
canvas.translate(getWidth(), 0);
canvas.rotate(90);
canvas.translate(0, getWidth());
canvas.scale(1, -1);
canvas.translate(getCompoundPaddingLeft(), getExtendedPaddingTop());
getLayout().draw(canvas);
canvas.restore();
}
}
布局 xml 没有什么特别之处。
(更新)这个问题是另一个尝试,但最后我无法让它工作:除了onDraw()之外,invalidateDrawable()是否需要被覆盖?
进一步说明
如果您想知道为什么我要旋转和翻转 EditText 视图,这就是原因。传统的蒙古文是从左到右垂直书写的。结合垂直镜像的蒙古字体,将文本顺时针旋转 90 度并翻转它会产生具有正确换行的可读输出。
这不是一个模糊或孤立的问题。传统蒙古语用户数以百万计,但安卓应用却很少。其中,我还没有找到任何开源的。如果我能让这个工作,我想让其他开发人员可以使用代码。
我现在在看哪里
(更新)我正在考虑View
从头开始创建一个自定义视图(扩展)以创建类似TextView
. 这TextView
可以从应用程序中更新以充当EditText
视图。在这种情况下,我只需要使用普通字体将文本旋转 90 度,但不需要翻转它。但是,我必须自己进行换行。
但是,在阅读@Chitrang 的回答后,我想我可以通过扩展 TextView 来做类似的事情。然后我可以避免自己做换行的麻烦。
图片更新
蒙古文是从上到下,从左到右书写的。现在我正在使用这个键盘在文本周围移动光标,但我希望能够触摸屏幕将光标移动到某个位置。