gpt4 book ai didi

android - 具有工作选择、光标位置等的自定义旋转 EditText View

转载 作者:IT老高 更新时间:2023-10-28 23:16:08 25 4
gpt4 key购买 nike

我想做什么

我想制作一个旋转和翻转的 EditText View ,它具有普通 EditText View 的所有属性。

我的问题

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

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

我读到的

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 的自定义 View 。其中覆盖了 onDraw 方法来旋转和翻转 Canvas 。我覆盖了 onMeasure 以使 View 具有适合布局的尺寸。

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 View ,这就是原因。传统的蒙古文是从左到右垂直书写的。结合垂直镜像的蒙古字体,将文本顺时针旋转 90 度并翻转它会产生具有正确换行的可读输出。

这不是一个模糊或孤立的问题。传统蒙古语用户数以百万计,但安卓应用却很少。其中,我还没有找到任何开源的。如果我能让这个工作,我想让其他开发人员可以使用代码。

我现在在哪里

(更新)

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

但是,在阅读@Chitrang 的回答后,我想我可以通过扩展 TextView 来做类似的事情。这样我就可以避免自己做换行的麻烦了。

图片更新

enter image description here

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

最佳答案

试图通过微小的更改获得部分解决方案,检查是否是您想要的。

1) 在 xml 中的 edittext 声明中设置 android:gravity="top|left"。

2)注意到在onDraw方法中没有super方法调用,不能显示光标。于是我打了电话,

super.onDraw(canvas);

相反,

getLayout().draw(canvas);

3) 对于触摸事件,我尝试交换 x 和 y 坐标。这样您就可以根据触摸事件获得光标。(刚刚尝试过,它正在工作,很幸运:))

@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
event.setLocation(event.getY(), event.getX());
return super.onTouchEvent(event);
}

在 onDraw 方法中注释此行,以获得精确的触摸事件(通过反复试验找到)。

canvas.translate(getCompoundPaddingLeft(), getExtendedPaddingTop());

4) 我无法对突出显示或选择文本做任何事情。

?) 另一个解决方案: 如果您这么认为,那么您将如何获得 RTL 语言支持处理edittext然后你只需要旋转它。但不幸的是,它无法在 android 上正常工作。引用:How to handle RTL languages on pre 4.2 versions of Android?Android setting with TextView for Hebrew text?

关于android - 具有工作选择、光标位置等的自定义旋转 EditText View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25036816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com