Animación de la ventana de Android junto con la vista

Estoy haciendo una versión Android personalizada, en la que mi servicio agrega una vista en la parte superior de cada aplicación. Utilizando el código siguiente:

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

Puedo agregar la vista correctamente. Estoy animando la vista usando

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

Estoy viendo la vista animada, pero no la ventana. La ventana transparente donde solía estar la vista, no está animando. Este es el mismo comportamiento descrito en Android Property Animation

Otra desventaja del sistema de animación de vista es que sólo se modificó donde se dibujó la vista, y no la propia vista real. Por ejemplo, si animas un botón para moverte por la pantalla, el botón dibuja correctamente, pero la ubicación real donde puedes hacer clic en el botón no cambia, por lo que tienes que implementar tu propia lógica para manejar esto.

¿Cómo puedo animar la ventana junto con la vista?

Gracias

Tiene dos opciones para lograr esto (mantener el feedback de contacto del usuario coherente con la posición de View ):

  1. Cree un contenedor transparente (como FrameLayout ) lo suficientemente grande para que contenga su View más su desplazamiento de animación (en su caso con una altura de 366 + 300 px ). De esta manera, agregará el contenedor a la Window , mientras que la View permanece dentro del contenedor y se puede animar / trasladar.

  2. Mueva la posición absoluta de su vista en la pantalla , creando una especie de animación personalizada; Sólo tiene que establecer el valor mParams.x forma dinámica utilizando un ValueAnimator o, si desea más bounciness, utilizando un efecto de resorte a través de la biblioteca Rebound . Te sugiero que el último, es realmente de lujo!

He aquí un ejemplo (no probado) usando 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); 

Recuerde que debe agregar primero la instrucción de compilación de Rebound en sus dependencias:

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

Usted podría hacerlo de modo que su ventana llena la pantalla entera quitando la altura y el ancho de los params de la ventana. Si desea controlar el tamaño de la vista, establezca en su diseño.


De lo contrario, puede utilizar un ValueAnimator y llamar repetidamente al ValueAnimator WindowManager :

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

Pruebe esto por favor:

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

Y sigue animando myView como lo hiciste

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

Aviso para establecer el ancho y la altura de la vista en el archivo XML – R.layout.myView

  • Fragmento de superposición de animación de transacciones
  • Cómo especificar el atributo fromXType en el archivo anim xml
  • Cómo restablecer AnimationDrawable
  • La vista de Android se desvanece en programaticamente
  • Cambiar el tamaño de los diseños de forma programática (como animación) hasta "wrap_content"
  • Android 2.3: Crecer / reducir el error de animación?
  • ¿Cómo realizar una animación de desvanecimiento en la transición de la actividad?
  • Dibujar en un lienzo con demora - "hacer onDraw () reducir la velocidad"
  • Creación de animación en la aplicación para Android
  • Cómo desplazar la vista de desplazamiento horizontal sin animación
  • Comportamiento extraño de View.getHitRect ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.