Windowmanager mit Animation

8

Zuerst einmal allen, die versuchen, auf dieses Thema zu antworten.

Ich habe eine Aktivität, und ich wollte am oberen Bildschirmrand eine Art Menü anzeigen, und ich habe den Fenstermanager dafür verwendet. Es ging um UI-Probleme, denen ich begegnete, warum ich den Fensterverwalter für ein solches Menü auswähle. Aber jetzt möchte ich, dass dieses Menü animiert wird, aber es scheint, dass Animation keine Wirkung hat. Hier ist mein Code.

Wenn jemand eine Idee hat, wie man den Windowmanager animiert, werde ich es schätzen.

%Vor%

Vielen Dank im Voraus. Grüße.

    
Omer Faruk KURT 27.07.2011, 05:11
quelle

2 Antworten

18

Erstens, bitte kodiere für deine eigene Gesundheit nicht so viele Konstanten. Der Name des Window Manager-Dienstes lautet Context.WINDOW_SERVICE . Der Fenstertyp ist WindowManager.LayoutParams.TYPE_PHONE . Die Flags, die Sie gesetzt haben, ist ... ummm ... WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE (ernst, auch in Dezimal geschrieben ??). Das Format ist PixelFormat.RGBA_8888 (und ich würde dringend empfehlen, stattdessen PixelFormat.TRANSLUCENT zu verwenden).

Nun, zuerst, was in der Welt macht TYPE_PHONE ? Das willst du nicht machen. Wenn Sie möchten, dass ein Fenster über dem Hauptfenster liegt, sollten Sie TYPE_APPLICATION verwenden. In der Tat möchte ich Sie dazu auffordern, einfach Dialog dafür zu verwenden und sein angehängtes Fenster so zu setzen, wie Sie es möchten. Es kümmert sich um alle Details der Arbeit mit dem Fenstermanager und beschränkt Sie in keiner Weise darauf, wie Sie es animieren können.

Ich denke, das Hauptproblem, das Sie hier haben, ist, dass Sie versuchen, die Stammansicht des Fensters zu animieren. Die Grundansicht ist etwas Besonderes - sie definiert den obersten Teil des Fensters, stimmt genau mit dem Fenster überein und ist immer gezwungen, die Größe des Fensters zu haben. Es ist, was das Layout seiner untergeordneten Fenster antreibt. Wenn Sie eine Ansichtsanimation erstellen möchten, sollten Sie die Stammansicht (es ist der Anker des Fensters) belassen und die darin enthaltenen Elemente animieren.

Da Sie jedoch eine Animation im alten Stil verwenden, gibt es eine bessere Möglichkeit, um ganze Fenster zu animieren, wie das System Dialoge und Aktivitäten animiert und solche: Legen Sie die Animation in den Layout-Parametern des Fensters fest. Dann wendet der Fenstermanager diese Animation auf die gesamte Fensteroberfläche an, wie Sie es spezifizieren. Dies ist effizienter, als dies innerhalb des Fensters zu tun, da jedes Bild der Animation nur das erneute Zusammensetzen des Bildschirms mit der neuen Animationsumwandlung erfordert, anstatt den Fensterinhalt neu zu zeichnen und dann neu zu kombinieren.

Sie tun dies, indem Sie WindowManager.LayoutParams.windowAnimations setzen. Dies ist ein Ganzzahlfeld, das die Ressourcen-ID einer -Stil -Ressource verwendet, die die verschiedenen Animationen definiert, die mit dem Fenster verknüpft sind. Der für die Standarddialoge verwendete Stil lautet beispielsweise:

%Vor%

Sie setzen windowEnterAnimation auf die Animationsressource, die ausgeführt wird, wenn das Fenster angezeigt wird, und windowExitAnimation auf die zu startende Animation, wenn sie ausgeblendet ist. Wenn nicht festgelegt, wird keine Animation ausgeführt.

Also für Ihren Code hier, können Sie einfach einen Dialog erstellen, seinen Inhalt auf Ihren benutzerdefinierten Inhalt setzen, seine Schwere, Breite und Höhe auf die Werte einstellen, die Sie hier haben, und sein windowAnimations -Feld auf Ihren Stil setzen, indem Sie Animationen. Sie können die Flags auch anpassen, wenn Sie ein anderes Verhalten als ein Standarddialog (nicht Touch-Modal oder ähnliches) möchten. Die API in Dialog.getWindow() enthält alles, was Sie zum Festlegen der Layoutparameter benötigen.

    
hackbod 08.01.2013 02:38
quelle
1

mParams.windowAnimations = android.R.style.Animation_Toast;

    
user3777589 26.06.2014 03:05
quelle