Что я хочу делать
Я хочу сделать повернутое и перевернутое представление EditText, которое имеет все свойства обычного вида EditText.
Моя проблема
Я успешно сделал (с большой помощью от пользователей SO) настраиваемое представление EditText, которое поворачивается и переворачивается. Это было сделано путем переопределения метода onDraw. Однако курсор и подсветка исчезли, и событие longtouch все еще указывает исходную позицию текста. В принципе, представление было перерисовано, но событий касания не было.
Как я могу также активировать сенсорные события, подсветку и курсор?
Что я прочитал
Шкала EditText с выбором (Аналогичная проблема, но не совсем такая.)
Как создать пользовательский Edittext, чтобы он выглядел как 45 градусов, повернутый в android (@CommonsWare отметил для одного решения, что дополнительная работа должна быть сделано с сенсорными событиями. Что это за работа?)
http://developer.android.com/training/graphics/opengl/touch.html (полезно, но я не понимаю, как его применять в этой ситуации.)
Что я пробовал
Я сделал собственное представление, которое расширяет EditText. В нем overrode метод 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 нет ничего особенного.
(Update) Этот вопрос является еще одной попыткой, но в конце концов я не смог заставить его работать: Необходимо ли переопределить invalidateDrawable() в дополнение к onDraw()?
Дальнейшее объяснение
Если вам интересно, почему в мире я хочу повернуть и перевернуть вид EditText, вот почему. Традиционный монгольский язык написан вертикально в столбцах слева направо. В сочетании с вертикально отраженным монгольским шрифтом, поворачивая текст на 90 градусов по часовой стрелке и переворачивая его, получается читаемый вывод с правильной оберткой линии.
Это не скрытая или изолированная проблема. Есть миллионы пользователей традиционных монгольских, но очень немногих приложений для Android. Из них я не нашел ни одного открытого источника. Если я смогу заставить это работать, я хочу сделать код доступным для других разработчиков.
Где я сейчас смотрю
(обновление)Я думал о создании пользовательского представления (который расширяет View
) с нуля, чтобы создать нечто вроде TextView
. Этот TextView
может быть обновлен из приложений, чтобы действовать как вид EditText
. В этом случае мне нужно будет только поворачивать текст на 90 градусов с помощью обычного шрифта, но не переворачивать его. Тем не менее, я должен был бы сделать свою собственную линию.
Однако, прочитав ответ @Chitrang, я думаю, что могу сделать что-то подобное, просто расширив TextView. Тогда я могу избежать проблем с выполнением моей собственной линии.
Обновление изображения
Монгольский написан сверху донизу и слева направо. Прямо сейчас я использую эту клавиатуру для перемещения курсора по тексту, но я хотел бы иметь возможность коснуться экрана, чтобы переместить курсор в позицию.