Не нужно ли переопределить 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());
}

0 ответов

Другие вопросы по тегам