Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Как в GridView при длинном тапе на элементе - плавно изменить размеры всех дочерних элементов

Есть GridView. Хочу сделать так, чтобы при длинном клике, элементы уменьшались в размере все одновременно, по-типу анимации.
Например, как в галерее фотографий. Когда при длинном клике происходит переход в режим мультивыбора.
Вот пример чего хочу добиться:

Пробовал делать анимацию на элемент - но срабатывает только на первом элементе, несмотря на то, на какой элемент нажимаю.
Сам GridView через Adapter и Holder наполняется элементами:



На элементах прикручены слушатели:
ticketsGrid.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override public boolean onItemLongClick(AdapterView parentLong, View viewLong, int positionLong, long idLong) { return true; } });
и:
ticketsGrid.setOnItemClickListener(new OnItemClickListener() {
@Override public void onItemClick(AdapterView parentShort, View viewShort, final int positionShort, long idShort) {
return true; } });
Может есть готовые библиотеки или кто-то уже делал такое?


Ответ

Делал для GridLayout через анимацию веса и такой класс:
public class WeightAnimation implements Animator.AnimatorListener { public static final int DURATION = 500; private ValueAnimator va;
WeightAnimation(float from, float to, final View view) { va = ValueAnimator.ofFloat(from, to); //fromWeight, toWeight va.setDuration(DURATION); va.setInterpolator(new LinearInterpolator()); va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { ((LinearLayout.LayoutParams) view.getLayoutParams()).weight = (float) animation.getAnimatedValue(); view.requestLayout(); } }); va.addListener(this); }
public void startAnimation() { va.start(); }
@Override public void onAnimationStart(Animator animation) {
}
@Override public void onAnimationEnd(Animator animation) { //код по окончанию анимации }
@Override public void onAnimationCancel(Animator animation) {
}
@Override public void onAnimationRepeat(Animator animation) {
} }
Использование, где нужно:
void collapseAnimation(final View view, final boolean isCollapsing) { WeightAnimation wa = new WeightAnimation(isCollapsing ? 1f : 0f, isCollapsing ? 0f : 1f, view); wa.startAnimation(); }
Передаете все ваши View, для нужного isCollapsing=false, для остальных = true
По прежнему остается вопрос быстродействия, особенно, если у вас много View. Но на небольшое их количество работает стабильно.
Если отслеживать анимацию не нужно - implements и animationListener'ы можно удалить.

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

Отправить комментарий