Не нужно ли переопределить invalidateDrawable() в дополнение к onDraw()?
Я пишу обычай EditText
Посмотреть. Я преодолел onDraw()
метод внесения изменений в canvas
такие как translate
, rotate
, а также scale
, Это прекрасно работает, однако, EditText
Подсветка и курсор исчезли. Каким-то образом я должен обновить все измерения для остальной части класса, а не только onDraw()
метод.
Я шел через исходный код TextView
(который EditText
расширяется), и в пределах onDraw()
Метод это говорит несколько раз:
// IMPORTANT: The coordinates computed are also used in invalidateDrawable()
// Make sure to update invalidateDrawable() when changing this code.
Нужно ли переопределять invalidateDrawable() тоже? Если так, то как? Я даже попытался переопределить это просто следующим образом, но это не дало никакого эффекта:
@Override
public void invalidateDrawable(Drawable drawable) {
invalidate();
}
Примечание. Этот вопрос является попыткой приблизиться на один шаг к ответу на другой вопрос: ( Пользовательское вращаемое представление EditText с рабочим выделением, расположением курсора и т. Д.).
Обновление 1 (благодаря помощи @MikeM):
@Override
protected void onDraw(Canvas canvas) {
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();
super.onDraw(canvas); // I had forgotten this!
}
Курсор и подсветка теперь видны, но они находятся на оригинале, а не на перерисованном холсте. Оба полотна видны.
Обновление 2: (закомментировано несколько строк согласно совету @MikeM)
@Override
protected void onDraw(Canvas canvas) {
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();
super.onDraw(canvas);
}
Больше нет двойного наложения, и курсор и подсветка кажутся правильными. Но только часть текста отображается и прыгает странным образом при прикосновении.
Обновление 3
Вот мой оригинальный переопределенный onMeasure
метод:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(heightMeasureSpec, widthMeasureSpec);
setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
}