2013-07-29 3 views
0

Я пытаюсь реализовать что-то вроде SwipeListView самостоятельно. Поэтому я должен анимировать элементы ListView при взаимодействии с ними. Я делаю это с помощью API ViewPropertyAnimator при перетаскивании элементов ListView так:Android animate() не обновляет UI

ListView parent_list_view = ...; 
View list_view_item = ...; 
int destination = ...; 
long animation_time = ...; 

list_view_item.animate().translationX(destination).setDuration(animation_time) 
    .setListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      System.out.println("animation ended"); 
      //... 
      parent_list_view.invalidate(); //TODO: this can't be the solution 
     } 
    }); 

К сожалению, это не работает, как ожидалось.

Без строки, недействительной для родительского ListView, я не вижу изменений в пользовательском интерфейсе, но через некоторое время получаю вывод «завершена анимация» на консоли. При следующем взаимодействии с пользователем (например, прикосновение к экрану) элемент переходит непосредственно к месту назначения (без анимации). Я ввел строку, недействительную родительскую, чтобы после перехода к анимации элемент переместился в пункт назначения «по-своему». Тем не менее, это не поведение, я хочу.

Мне кажется, что элемент не делает недействительным сам или родительский вид во время выполнения анимации. В связи с этим пользовательский интерфейс не обновляется, и я вижу старое состояние элемента View. При выполнении любого взаимодействия с пользователем (например, касание экрана) представление становится недействительным и правильно перерисовывается.

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

ответ

0

Может быть, это видео может помочь вам http://graphics-geek.blogspot.com/2013/06/devbytes-animating-listview-deletion_21.html

+0

Спасибо за вашу помощь. Я видел видео раньше, но, увидев его во второй раз, дал мне подсказку о том, как реализовать лучшее обходное решение для моей проблемы. Теперь я добавляю [OnPreDrawListener] (http://developer.android.com/reference/android/view/ViewTreeObserver.OnPreDrawListener.html) к [ViewTreeObserver] (http://developer.android.com/reference/ android/view/ViewTreeObserver.html) моего родительского ListView. В методе onPreDraw() я вызываю parent.invalidateViews(), если анимации выполняются любыми элементами. Теперь я вижу анимацию, но я сомневаюсь, что это оптимальное решение. Больше идей? – guru

Смежные вопросы