2011-01-07 11 views
4

Unter meinem ListView habe ich eine Bar mit einem Mülleimer darauf.Animieren von ListView-Element in den Papierkorb

Wenn eine Aktion ausgeführt wird, nehmen Sie an, dass es einfach auf das Element klickt, ich möchte, dass das Element in den Papierkorb animiert wird. Dies bedeutet, dass sich beide horizontal nach unten bewegen und auf eine Breite von 0 schrumpfen.

Wie kann dies erreicht werden? Ich vermute, dass es darum geht, eine Bitmap des Elements zu erstellen und dieses Bitmap dann nach unten und immer kleiner zu animieren. Je nachdem, wo sich das Listenelement relativ zum Bildschirm befindet, muss es möglicherweise schneller als zu anderen Zeiten verkleinert werden (dh wenn sich das Listenelement bereits am unteren Bildschirmrand und nicht am oberen Bildschirmrand befindet). Ich bin mir nicht sicher, wie ich das erreichen soll.

Die einzige Animation, die ich gemacht habe, beinhaltet eine Leiste vom unteren Rand des Bildschirms. Ich habe keine Erfahrung darin, ein frei schwebendes Objekt zu bewegen und seine Größe zu verändern.

Könnte mir jemand eine gute Richtung geben?

Antwort

0

Für die Durchführung der Animation werfen Sie einen Blick auf Animation. Es sieht so aus, als ob Sie eine AnimationSet bestehend aus ScaleAnimation, AlphaAnimation und TranslateAnimation bauen wollen. Dann wenden Sie diese Animation auf alles an, was Sie erstellen, um sich über die Listenansicht zu bewegen. Aus der Nähe meines Kopfes würde ich wahrscheinlich diesen Aspekt angehen, indem ich eine Kopie des zu löschenden Gegenstandes anlege, ihn in den "Müll" animiere und dann den ursprünglichen Gegenstand lösche. Aber dieser Ansatz kann schwieriger/weniger effizient sein als das Erstellen einer Bitmap.

2

Befolgen Sie diese Schritte, um dieses Ziel zu erreichen:

Zuerst müssen Sie eine „hoovered“ Kopie Ihres Listeneintrag erstellen. Um dies zu tun, müssen Sie eine neue Ansicht aufblasen, die die gleiche Struktur wie die Listenelemente in Ihrer Listenansicht hat. Danach müssen Sie das zum Windows-Manager hinzuzufügen, wie folgt aus:

  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); 

nun neue Animation-Klasse erstellen, die die WindowParams bekommt, und die Koordinaten x und y ändern, um die hoovered Punkt zu schieben der untere Mülleimer. Aktualisieren Sie die neue Ansicht Position durch diesen Code verwenden:

 mWindowManager.updateViewLayout(mViewToAnimate, mWindowParams); 

Sie können auch mit der Breite und Höhe spielen, um zu simulieren, die Ansicht schrumpft.

Um die leere Stelle auf der Liste links zu animieren, können Sie meine ExpandAnimation verwenden erklärt auf meinem Blog: http://udinic.wordpress.com/2011/09/03/expanding-listview-items/

, dass es ziemlich viel. Wenn Sie mehr Details brauchen - fragen Sie einfach.

+0

Wo ist die getClonedView-Methode? Eclipse scheint es nicht zu finden. – Gio

+1

Wie ich schrieb: "Zuerst müssen Sie eine" Hoovered "Kopie Ihres Listenelements erstellen ..". Diese Methode soll eine Kopie der Ansicht, die Sie animieren möchten, zurückgeben, die Implementierung dafür liegt bei Ihnen. – Udinic

+0

Ok ich habe es. Danke für deine Antwort. Ich habe dieses Problem bereits gelöst :) – Gio

Verwandte Themen