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
- Fragmentos de ViewPager - Transiciones de elementos compartidos
- Android: ¿Cómo mover un BitmapDrawable?
- Cómo hacer una animación de derecha a izquierda en un diseño
- Deslice la animación izquierda / derecha entre fragmentos
- Android cómo configurar windowanimation mediante programación
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
- Excesivo sistema innecesario invocado GC en android 2.3.5 durante la animación
- Cómo animar la adición o la eliminación de Android ListView filas
- Android ObjectAnimation sólo se inició una vez
- androide; Establecer animaciones de entrada y salida en AdapterViewFlipper: nombre de animador desconocido traducir
- La vista animada de Android fuera del fragmento se está recortando
- Cómo aplicar mediante programación simultáneamente translate & scale animation en una vista
- Animado (VectorDrawable) animado mediante programación en tiempo de ejecución
- Animar agregar / quitar elementos de ListView con CursorAdapter es posible?
Tiene dos opciones para lograr esto (mantener el feedback de contacto del usuario coherente con la posición de View
):
-
Cree un contenedor transparente (como
FrameLayout
) lo suficientemente grande para que contenga suView
más su desplazamiento de animación (en su caso con una altura de 366 + 300 px ). De esta manera, agregará el contenedor a laWindow
, mientras que laView
permanece dentro del contenedor y se puede animar / trasladar. -
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 unValueAnimator
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
- Error: org.apache.http.conn.HttpHostConnectException: Se ha rechazado la conexión a http://10.0.2.2:8080
- Android proguard incompleto stacktrace