2015-11-09 7 views
5

Sto facendo un build Android personalizzato, in cui il mio servizio aggiunge una vista in cima ad ogni app. Utilizzare il seguente codice:Animazione della finestra di Android insieme alla vista

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

Sono in grado di aggiungere la visualizzazione correttamente. Sto animando la vista usando

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

Sto vedendo la vista animare, ma non la finestra. La finestra trasparente in cui si trovava la vista non è animata. Questo è lo stesso comportamento come descritto nel Android Property Animation

Un altro svantaggio del sistema animazione vista è che solo modificato in cui è stato estratto il Vista, e non l'attuale View stessa. Ad esempio, se hai animato un pulsante per spostarti sullo schermo, il pulsante si disegna correttamente, ma la posizione effettiva in cui è possibile fare clic sul pulsante non cambia, quindi devi implementare la tua logica per gestirlo.

Come si anima la finestra insieme alla vista?

Grazie

+0

cosa fa il tuo 'layout di myView' assomiglia? – tachyonflux

risposta

1

Si potrebbe fare in modo che la vostra finestra riempie l'intero schermo, eliminando l'altezza e la larghezza dal params finestra. Se si desidera controllare le dimensioni della vista, impostarla nel layout.


In caso contrario, è possibile utilizzare un ValueAnimator e ripetutamente chiamare 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

Hai due opzioni per raggiungere questo obiettivo (mantenere feedback tocco dell'utente coerenti con il View' s posizione) :

  1. Creare un contenitore trasparente (come un FrameLayout) abbastanza grande da contenere il tuo View più il suo offset di animazione (nel tuo caso con un'altezza di 366 + 300 px). In questo modo, aggiungi il contenitore allo Window, mentre lo View rimane all'interno del contenitore e può essere animato/traslato.

  2. Sposta la posizione assoluta della vista sullo schermo, creando una sorta di animazione personalizzata; è sufficiente impostare il valore mParams.x in modo dinamico utilizzando un ValueAnimator o, se si desidera un maggiore effetto di rimbalzo, utilizzando un effetto molla tramite la libreria Rebound. Ti suggerisco l'ultimo, è davvero stravagante!

Ecco un (non testato) esempio con Rebound:

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

Ricordate che è necessario aggiungere dichiarazione di compilazione del Rebound nelle dipendenze prima:

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

Prova questo per favore:

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

E mantenere animate myView come avete fatto

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

Avviso per il Impostare la larghezza & altezza della vista nel file XML - R.layout.myView