2015-11-09 8 views
5

Ich mache eine benutzerdefinierte Android-Build, in dem mein Service eine Ansicht über jeder App hinzufügt. Mit dem folgenden Code:Animieren von Android-Fenster zusammen mit der Ansicht

WindowManager mWM = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); 
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); 
mParams = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.TYPE_PHONE, 
       WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
       PixelFormat.TRANSLUCENT); 
mParams.height = 117; 
mParams.width = 366; 
View myView = inflater.inflate(R.layout.myView,null); 
mWM.addView(myView, mParams); 

Ich bin in der Lage, die Ansicht erfolgreich hinzuzufügen. Ich animiere die Ansicht mit

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 300); 
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX).start(); 

Ich sehe die Ansicht animieren, aber nicht das Fenster. Das transparente Fenster, in dem sich die Ansicht befand, animiert nicht. Dies ist das gleiche Verhalten wie in Android Property Animation

Ein weiterer Nachteil der Ansicht Animationssystem beschrieben ist, dass es nur dann geändert, wenn die Ansicht gezogen wurde, und nicht die tatsächliche Ansicht selbst. Wenn Sie beispielsweise eine Schaltfläche animieren, um sich über den Bildschirm zu bewegen, wird die Schaltfläche korrekt gezeichnet, aber der tatsächliche Speicherort, an dem Sie auf die Schaltfläche klicken können, ändert sich nicht. Daher müssen Sie Ihre eigene Logik implementieren.

Wie animiere ich das Fenster zusammen mit der Ansicht?

Dank

+0

Was ist Ihr 'myView' Layout aussehen? – tachyonflux

Antwort

1

Man könnte es so machen, dass Ihre Fenster durch Entfernen der Höhe und Breite der Fenster params den gesamten Bildschirm ausfüllt. Wenn Sie die Ansichtsgröße steuern möchten, legen Sie sie stattdessen in Ihrem Layout fest.


Andernfalls können Sie eine ValueAnimator und rufen Sie verwenden wiederholt WindowManager 's updateViewLayout:

ValueAnimator va = ValueAnimator.ofInt(mParams.x, 300); 
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
    public void onAnimationUpdate(ValueAnimator animation) { 
     Integer value = (Integer) animation.getAnimatedValue(); 
     mParams.x = value.intValue(); 
     mWM.updateViewLayout(myView, mParams); 
    } 
}); 
2

Sie haben zwei Möglichkeiten, dies zu erreichen (wobei die Touch-Feedback des Benutzers im Einklang mit der View seine Position) :

  1. einen transparenten Behälter erstellen (wie ein FrameLayout) groß genug, um Ihre View plus seine Animation Offset (in Ihrem Fall mit einer Höhe von 366 + 300 px) enthält. Auf diese Weise fügen Sie den Container der Window hinzu, während die View innerhalb des Containers bleibt und animiert werden kann.

  2. Verschieben Sie die absolute Position Ihrer Ansicht auf dem Bildschirm, Erstellen einer Art von benutzerdefinierten Animation; Sie müssen nur den mParams.x Wert dynamisch unter Verwendung eines ValueAnimator oder, wenn Sie mehr bounciness wollen, einen Frühlingseffekt durch die Rebound Bibliothek verwenden. Ich schlage dir das letzte vor, es ist wirklich schick!

Hier ist ein (nicht getestet) Beispiel Zugstufe mit:

SpringSystem springSystem = SpringSystem.create(); 
Spring spring = springSystem.createSpring(); 
final int originalPos = mParams.x; 
final int offset = 300; 
spring.addListener(new SimpleSpringListener() { 

    @Override 
    public void onSpringUpdate(Spring spring) { 
    float value = (float) spring.getCurrentValue(); 
    mParams.x = originalPos + ((int) value*offset) 
    mWM.updateViewLayout(myView, mParams); 
    } 
}); 
spring.setEndValue(1); 

Denken Sie daran, dass Sie die Kompilierung Aussage der Zugstufe in Ihrer Abhängigkeiten zuerst hinzufügen müssen:

// Gradle dependency on Rebound 
dependencies { 
    compile 'com.facebook.rebound:rebound:0.3.8' 
} 
1

diese bitte versuchen Sie es:

WindowManager mWM = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE); 
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);WindowManager.LayoutParams mParams = new WindowManager.LayoutParams(); 
mParams = new WindowManager.LayoutParams(
       WindowManager.LayoutParams.MATCH_PARENT, 
       WindowManager.LayoutParams.MATCH_PARENT, 
       WindowManager.LayoutParams.TYPE_PHONE, 
       WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, 
       PixelFormat.TRANSLUCENT); 
mParams.gravity = Gravity.TOP | Gravity.LEFT; 
mParams.x = 0; 
mParams.y = 0; 

View myView = inflater.inflate(R.layout.myView,null); 
LinearLayout parent = new LinearLayout(context); 
parent.addView(myView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
mWM.addView(parent, mParams); 

Und belebter myView halten, wie Sie

tat
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 300); 
ObjectAnimator.ofPropertyValuesHolder(myView, pvhX).start(); 

Hinweis Legen Sie die Breite & Höhe der Ansicht in der XML-Datei - R.layout.myView

Verwandte Themen