В iOS есть очень простое и мощное средство для анимации добавления и удаления строк UITableView, вот клип из видео на YouTube, показывающий анимацию по умолчанию. Обратите внимание, как окружающие строки сворачиваются в удаленную строку. Эта анимация помогает пользователям отслеживать, что изменилось в списке и где они находились в списке при изменении данных.
Так как я разрабатывал для Android, я не нашел эквивалентного средства для анимации отдельных строк в TableView . При вызове notifyDataSetChanged()
моего адаптера ListView немедленно обновляет свое содержимое новой информацией. Я хотел бы показать простую анимацию новой строки, которая сдвигается или сдвигается при изменении данных, но я не могу найти никакого документированного способа сделать это. Похоже, что LayoutAnimationController может содержать ключ к тому, чтобы заставить это работать, но когда я устанавливаю LayoutAnimationController в моем ListView (аналогично LayoutAnimation2 в ApiDemo ) и удаляю элементы из моего адаптера после отображения списка, элементы сразу исчезают, а не выводятся из анимации. ,
Я также пробовал что-то вроде следующего, чтобы оживить отдельный элемент при его удалении:
@Override
protected void onListItemClick(ListView l, View v, final int position, long id) {
Animation animation = new ScaleAnimation(1, 1, 1, 0);
animation.setDuration(100);
getListView().getChildAt(position).startAnimation(animation);
l.postDelayed(new Runnable() {
public void run() {
mStringList.remove(position);
mAdapter.notifyDataSetChanged();
}
}, 100);
}
Тем не менее, строки, окружающие анимированный ряд, не перемещаются, пока не переместятся на свои новые позиции при notifyDataSetChanged()
вызове. Похоже, ListView не обновляет свой макет после размещения его элементов.
Хотя написание моей собственной реализации / форка ListView приходило мне в голову, это кажется чем-то, что не должно быть таким сложным.
Спасибо!
Ответы:
для анимации сверху вниз:
источник
anim.setAnimationListener(new AnimationListener() { ... })
использовать обработчикpopulateList()
?Handler
. Во-вторых, он делает код менее сложным благодаря использованию встроенного обратного вызова для завершения анимации. В-третьих, вы не знаете, как работает реализацияHandler
иAnimation
будет работать на каждой платформе; Вполне возможно, что ваш отложенный запуск произойдет до того, как закончится анимация.Он
RecyclerView
заботится о добавлении, удалении и изменении порядка анимации!Этот простой проект AndroidStudio имеет
RecyclerView
. взгляните на коммиты :источник
Посмотрите на решение Google. Вот только метод удаления.
ListViewRemovalAnimation код проекта и демонстрация видео
Требуется Android 4.1+ (API 16). Но у нас 2014 снаружи.
источник
Так как
ListViews
они высоко оптимизированы, я думаю, что это невозможно. Вы пытались создать свой «ListView» с помощью кода (то есть, надувая строки из xml и добавляя их в aLinearLayout
) и анимируя их?источник
LinearLayout
, однако при работе с очень большими наборами данныхLinearLayout
производительность станет ужасной.ListView
имеет много интеллектуальных оптимизаций по переработке представления, которые позволяют ему обрабатывать большие наборы данных (UITableView iOS имеет те же оптимизации). Написание собственного представления переработчика подпадает под категорию переиздания ListView :(Рассматривали ли вы анимацию развертки вправо? Вы можете сделать что-то вроде рисования постепенно увеличивающейся белой полосы в верхней части элемента списка, а затем удалить ее из списка. Другие камеры все равно встали бы на свои места, но лучше, чем ничего.
источник
вызовите listView.scheduleLayoutAnimation (); перед изменением списка
источник
Я взломал вместе другой способ сделать это без необходимости манипулировать списком. К сожалению, обычные Android-анимации, похоже, манипулируют содержимым строки, но на самом деле неэффективны при уменьшении представления. Итак, сначала рассмотрим этот обработчик:
Добавьте эту коллекцию в свой адаптер List:
и добавить
Далее, где бы вы ни хотели скрыть строку, добавьте это:
Это оно! Вы можете изменить скорость анимации, изменив количество пикселей, на которое она сжимается по высоте сразу. Не очень сложно, но это работает!
источник
После вставки новой строки в ListView, я просто прокручиваю ListView в новую позицию.
источник
Я не пробовал, но похоже, что animateLayoutChanges должен делать то, что вы ищете. Я вижу это в классе ImageSwitcher, я полагаю, что это также и в классе ViewSwitcher?
источник
Поскольку Android является открытым исходным кодом, вам не нужно переопределять оптимизацию ListView. Вы можете взять код ListView и попытаться найти способ взломать анимацию, вы также можете открыть запрос функции в трекере ошибок Android (и если вы решили его реализовать, не забудьте внести патч ).
К вашему сведению, исходный код ListView здесь .
источник
Вот исходный код, позволяющий вам удалять строки и изменять их порядок.
Также доступен демонстрационный APK-файл. Удаление строк выполняется больше по аналогии с приложением Gmail от Google, которое показывает вид снизу после прокрутки вида сверху. Вид снизу может иметь кнопку «Отменить» или что угодно.
источник
Как я объяснил мой подход на своем сайте, я поделился ссылкой. В любом случае, идея заключается в создании растровых изображений с помощью getdrawingcache. У него есть два растровых изображения и анимация нижнего растрового изображения для создания эффекта перемещения.
Пожалуйста, смотрите следующий код:
Для понимания с изображениями смотрите это
Спасибо.
источник
Я сделал что-то похожее на это. Один из подходов заключается в интерполяции во времени анимации высоты представления во времени внутри строк
onMeasure
при выдачеrequestLayout()
для listView. Да, это может быть лучше сделать внутри кода listView напрямую, но это было быстрое решение (это выглядело хорошо!)источник
Просто делюсь другим подходом:
Сначала установите для android: animateLayoutChanges представления списка значение true :
Затем я использую обработчик для добавления элементов и обновления списка с задержкой:
источник