invalidate() не вызывает метод OnDraw

invalidate() не помнит мой OnDraw() метод. я использую invalidate() в метод сеттера в том же классе, что OnDraw() в.

public class PuzzleDraw extends View {

    // defining some variables //

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // codes for painting puzzle //
    }

    public PuzzleDraw(Context context) {
        super(context);
    }

    // Method for giving cursor X/Y from MainActivity OnTouch() method and using it in OnDraw() method in some part of painting code //

    public void setCursor(int i, int j) {
        this.xx = i;
        this.yy = j;
        invalidate();
    } 

Когда я отлаживаю свой код, все хорошо, кроме вызова OnDraw() когда invalidate() выполняет... на самом деле, invalidate() ничего не делает для меня! Что случилось? я использовал postInvalidate(), this.invalidate(), this.postInvalidate() тоже, но ничего не изменилось.

3 ответа

Призыв к invalidate() не будет выполнять onDraw непосредственно, он только устанавливает соответствующий флаг в View учебный класс. Ваш onDraw метод будет вызван структурой в следующий раз, когда будет просмотрена иерархия представлений.

Вы можете вызывать метод setCursor(float, float) только один раз, вызывая его из действия, но недействительный метод необходимо вызывать снова и снова, если вы хотите вызвать метод onDraw внутренне самой платформой.

Надеюсь, это сработает

Я столкнулся с той же проблемой. И то, и другое не вызывало функцию, так как я хотел обновлять представление в режиме реального времени, когда какой-либо текст набирался в файле . Посмотрите на мое решение, надеюсь, оно сработает для всех вас.

  1. Вы будете использовать это пользовательское представление где-нибудь в Activity или Fragment, верно?

  2. В этом действии или фрагменте введите код ниже.

    private PuzzleDraw puzzle; // Define variable of your custom view

  3. Поскольку вы будете использовать этот customView (PazzleDraw) в файле макета, который будет иметь уникальный идентификатор, как мы делаем для прослушивания кнопок и т. д.

    puzzle = findViewById(R.id.pazzle); // Access the custom view you defined in layout file with id = pazzle

  4. Теперь самое главное. Если вы хотите изменить пользовательский вид на основе какого-либо события, поместите приведенный ниже код в этот список событий.

    pazzle.setVisibility(View.GONE); pazzle.setVisibility(View.VISIBLE);

  5. Теперь это будет работать для вас в режиме реального времени без звонка.invalidate()илиpostInvalidate()функции.

Почему это сработает? На самом деле андроид вызывает метод при запуске пользовательского представления. Например, в приведенном выше случае мы скрываем пользовательское представление, а затем делаем его видимым, поэтому в этом случае андроид будет вызывать метод. Также есть некоторыеEditTextна вашем макете, и вы фокусируете ввод. Затем откроется клавиатура, позвонит андроид.onDraw()при открытии клавиатуры, а также закрытии кнопок клавиатуры. Я надеюсь, что это сработает для всех вас, ребята, так как я реализовывал то же самое, и это сработало для меня.

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