Есть 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'ы можно удалить.
Комментариев нет:
Отправить комментарий