2016-10-22 13 views
0

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

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

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

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

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

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

ответ

0

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

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

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

+0

Спасибо за ваш комментарий, но он не работает. – Keith

+0

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

+0

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