首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有工作选择、光标位置等的自定义旋转EditText视图

具有工作选择、光标位置等的自定义旋转EditText视图
EN

Stack Overflow用户
提问于 2014-07-30 20:26:22
回答 4查看 3.3K关注 0票数 18

我想做的是

我想创建一个旋转和翻转的EditText视图,它具有普通EditText视图的所有属性。

我的问题

我已经成功地(在许多用户的帮助下)制作了一个既可以旋转又可以翻转的自定义EditText视图。这是通过覆盖onDraw方法来完成的。但是,光标和高亮显示消失了,并且长触摸事件仍然指示原始文本位置。基本上,视图被重新绘制,但触摸事件没有。

如何让触摸事件、高亮显示和光标也被旋转和翻转?

我所读到的

EditText scale with selection (一个类似的问题,但不完全相同。)

How to make a custom Edittext,so that it will look like as 45 degree rotated in android (@CommonsWare指出了一个解决方案,即需要使用触摸事件完成额外的工作。这是什么工作?)

http://developer.android.com/training/graphics/opengl/touch.html (很有帮助,但我不知道如何在这种情况下应用它。)

我尝试过的东西

我制作了一个扩展EditText的自定义视图。其中重写了onDraw方法来旋转和翻转画布。我重写了onMeasure,使视图具有正确的布局尺寸。

代码语言:javascript
复制
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没有什么特殊之处。

(更新)这个问题是对它的又一次尝试,但最终我无法让它工作:Does invalidateDrawable() need to be overridden in addition to onDraw()?

进一步解释

如果你想知道为什么我要旋转和翻转EditText视图,这里是原因。传统的蒙古语是从左到右竖排书写的。与垂直镜像的蒙古文字体相结合,将文本顺时针旋转90度并翻转可产生具有正确换行的可读性输出。

这不是一个晦涩难懂或孤立的问题。传统蒙古语有数百万用户,但Android应用程序很少。在这些工具中,我还没有找到任何开源的。如果我能让它工作,我想让代码对其他开发人员可用。

我现在看的地方

(更新)

我在考虑从头开始创建一个自定义视图(它扩展了View)来创建类似TextView的东西。可以从应用程序更新此TextView,使其行为类似于EditText视图。在这种情况下,我只需要用普通字体将文本旋转90度,而不需要翻转它。但是,我必须自己进行换行。

然而,在阅读了@Chitrang的答案后,我想我可以通过扩展一个TextView来做一些类似的事情。这样我就可以省去自己换行的麻烦了。

图片更新

蒙古语是从上到下,从左到右书写的。现在,我正在使用此键盘在文本周围移动光标,但我希望能够触摸屏幕以将光标移动到某个位置。

EN

Stack Overflow用户

发布于 2014-11-10 21:04:50

试试这个:

代码语言:javascript
复制
<EditText
        android:id="@+id/ed1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="47dp"
        android:digits="1234567890"
        android:ems="10"
        android:singleLine="true"
        android:cursorVisible="true"
        android:hint="Refreshing time in ms" />
票数 -1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25036816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档