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 внутренне самой платформой.
Надеюсь, это сработает
Я столкнулся с той же проблемой. И то, и другое не вызывало функцию, так как я хотел обновлять представление в режиме реального времени, когда какой-либо текст набирался в файле . Посмотрите на мое решение, надеюсь, оно сработает для всех вас.
Вы будете использовать это пользовательское представление где-нибудь в Activity или Fragment, верно?
В этом действии или фрагменте введите код ниже.
private PuzzleDraw puzzle; // Define variable of your custom view
Поскольку вы будете использовать этот customView (PazzleDraw) в файле макета, который будет иметь уникальный идентификатор, как мы делаем для прослушивания кнопок и т. д.
puzzle = findViewById(R.id.pazzle); // Access the custom view you defined in layout file with id = pazzle
Теперь самое главное. Если вы хотите изменить пользовательский вид на основе какого-либо события, поместите приведенный ниже код в этот список событий.
pazzle.setVisibility(View.GONE); pazzle.setVisibility(View.VISIBLE);
Теперь это будет работать для вас в режиме реального времени без звонка.
invalidate()
илиpostInvalidate()
функции.
Почему это сработает? На самом деле андроид вызывает метод при запуске пользовательского представления. Например, в приведенном выше случае мы скрываем пользовательское представление, а затем делаем его видимым, поэтому в этом случае андроид будет вызывать метод. Также есть некоторыеEditText
на вашем макете, и вы фокусируете ввод. Затем откроется клавиатура, позвонит андроид.onDraw()
при открытии клавиатуры, а также закрытии кнопок клавиатуры. Я надеюсь, что это сработает для всех вас, ребята, так как я реализовывал то же самое, и это сработало для меня.