Как я могу определить время фактического обновления пользовательского интерфейса после вызова setTranslationY?

#android #user-interface #refresh #translation #screenshot

#Android #пользовательский интерфейс #обновить #перевод #скриншот

Вопрос:

Я знаю, что представление не будет обновлено сразу после того, как я только что вызвал view.setTranslationY (-10.0f), пока основной поток не вернется в цикл ожидания.

Я хотел бы сделать снимок экрана сразу после обновления представления, но я не нахожу обратного вызова, такого как «onTranslationFinished ()» или «setOnTranslationEnd ()», который дал бы мне возможность это сделать.

Сначала мне понравился следующий код, и он действительно работал:

 view.setTranslationY(-10.0f);
view.post(new Runnerable() {
@Override
void run() {
  takeScreenshot();
});
  

Но когда мой мобильный достигает предела памяти и работает медленно,
метод не работает так, как я ожидал. takeScreenshot () запускается до фактического перевода представления -10.0f.
Я знаю, что такое postDelayed (100 мс) может временно устранить проблему, но это не лучшее решение.

Есть ли какой-нибудь способ удовлетворить мои требования?

Ответ №1:

Вы можете попробовать добавить onDrawListener наблюдателя дерева просмотра. Как следующий код:

 view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
            @Override
            public void onDraw() {
                //action
            }
        });`
  

Этот обратный вызов будет вызван, когда дерево представления будет готово к рисованию.

Комментарии:

1. Я попытался установить точку останова в onDraw и распечатать журнал об этом. К сожалению, onDraw вообще не вызывается. Перевод может не привести к перерисовке.

2. На самом деле это будет вызвано. Проверьте свой файл app.gradle, он minSdkVersion должен быть как минимум 16 , иначе он не будет вызван обратно. @Keith

3. Спасибо за вашу информацию, но я все еще не могу получить эту информацию, хотя я установил прослушиватель. Я проверил сборку системы Android вместо сборки Gradle, поэтому проблем с версией SDK не будет.