2011-01-07 3 views
4

Ниже моего ListView у меня есть бар с корзиной для мусора.Анимация ListView item to trash

Когда какое-либо действие выполняется, предположим, что он просто нажимает на элемент, я хотел бы, чтобы элемент анимировался до мусорного контейнера. Это означает, что оба движутся вниз и сжимаются горизонтально до ширины 0.

Как это можно достичь? Я подозреваю, что это связано с созданием растрового изображения, а затем анимацией этого растрового изображения вниз и все меньше. Это также означает, что в зависимости от того, где элемент списка относится к экрану, его, возможно, придется сокращать быстрее, чем другие времена (например: если элемент списка уже близко к нижней части экрана, а не к верхней части). Я просто не знаю, как добиться этого.

Единственная анимация, которую я сделал, включает в себя представление полосы в нижней части экрана. У меня нет опыта передвижения вокруг свободно плавающего объекта и изменения его размера.

Может ли кто-нибудь предоставить мне хорошее направление?

ответ

0

Что касается анимации, посмотрите на Animation. Похоже, вы захотите построить AnimationSet, состоящий из ScaleAnimation, AlphaAnimation и TranslateAnimation. Затем вы применяете эту анимацию к тому, что вы создаете, чтобы перемещаться по списку. В верхней части моей головы я, вероятно, подошел бы к этому аспекту, создав копию элемента, который будет удален, анимируя его в «мусор», а затем удалив исходный элемент. Но этот подход может быть более сложным/менее эффективным, чем создание растрового изображения.

2

Выполните следующие шаги для достижения этой цели:

Во-первых, нужно создать «» пылесосом копию вашего списка пункта. Для этого вам нужно раздуть новое представление, которое имеет ту же структуру, что и элементы списка в вашем списке. После этого, вам нужно добавить, что к менеджеру окон, как это:

  WindowManager.LayoutParams windowParams = new WindowManager.LayoutParams(); 
      windowParams.gravity = Gravity.TOP | Gravity.RIGHT; 
      windowParams.x = item.getLeft(); 
      windowParams.y = item.getTop(); 
      windowParams.height = item.getHeight(); 
      windowParams.width = item.getWidth(); 
      windowParams.flags = 
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 
          | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 
          | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON 
          | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN 
          | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS; 
      windowParams.format = PixelFormat.TRANSLUCENT; 
      windowParams.windowAnimations = 0; 

      View hooveredView = getClonedView(item); 

      // Add the hoovered view to the window manager, as a new view in the screen 
      WindowManager mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); 
      mWindowManager.addView(hooveredView, windowParams); 

Теперь создадим новый класс анимации, который получает в WindowParams и изменить координаты х и у, чтобы переместить пылесосом элемент в нижняя корзина. Обновление новой позиции просмотра с помощью этого кода:

 mWindowManager.updateViewLayout(mViewToAnimate, mWindowParams); 

Вы также можете играть с шириной и высотой для имитации усадки зрения.

Для того, чтобы оживить пустое место слева в списке, вы можете использовать мой ExpandAnimation объяснил на своем блоге: http://udinic.wordpress.com/2011/09/03/expanding-listview-items/

Это довольно много его. Если вам нужна дополнительная информация - просто спросите.

+0

Где метод getClonedView? Eclipse, похоже, не может найти его. – Gio

+1

Как я писал: «Во-первых, вам нужно создать« разобранную »копию вашего элемента списка ...». Этот метод предполагает возврат копии представления, которое вы хотите оживить, для вас это выполняется. – Udinic

+0

Хорошо, я понял. Спасибо за ваш ответ. Я уже решил эту проблему :) – Gio