¿Qué API en Android usa Facebook para crear Chats Head?

¿Cómo crea Facebook las cabezas de chat en Android? ¿Cuál es la API para crear las vistas flotantes sobre todas las demás vistas?

Este :

Permite que una aplicación abra ventanas usando el tipo TYPE_SYSTEM_ALERT, que se muestra en la parte superior de todas las demás aplicaciones. Muy pocas aplicaciones deberían usar este permiso; estas ventanas están destinadas a la interacción a nivel del sistema con el usuario.

Valor constante: “android.permission.SYSTEM_ALERT_WINDOW”

// EDIT: El código completo aquí :

public class ChatHeadService extends Service { private WindowManager windowManager; private ImageView chatHead; @Override public IBinder onBind(Intent intent) { // Not used return null; } @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); chatHead = new ImageView(this); chatHead.setImageResource(R.drawable.android_head); WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT); params.gravity = Gravity.TOP | Gravity.LEFT; params.x = 0; params.y = 100; windowManager.addView(chatHead, params); } @Override public void onDestroy() { super.onDestroy(); if (chatHead != null) windowManager.removeView(chatHead); } } 

No te olvides de comenzar el servicio de alguna manera:

 startService(new Intent(context, ChatHeadService.class)); 

.. Y agrega este servicio a tu Manifiesto.

Como regla general, las actividades de Android son pantallas completas, interfaces conceptuales dedicadas que toman toda la interacción. Hay algunas excepciones a esto. Para empezar, hay cuadros de diálogo emergentes que no llenan la pantalla. Otra es la tostada de Android, que es una ventana emergente no interactiva; no puedes tocarla y, si lo intentas, irá a lo que se encuentre debajo.

También puedes hacer tus propias IU especiales. Puede agregar vistas directamente a WindowManager , especificando un indicador de tipo. Chat Heads probablemente usa TYPE_PHONE . Hay algunos tipos similares, pero el objective es el mismo: superposiciones de propósitos especiales que pueden aparecer por encima de cualquier otra cosa sin que la aplicación principal esté aparentemente presente.

Eso solo te lleva tan lejos, sin embargo, debido a problemas con la interacción. Al principio, su superposición absorberá toda la interacción, por lo que la cabeza no solo obtendrá eventos, sino que bloqueará la interacción con todo lo que se encuentre debajo.

Configura este comportamiento utilizando los LayoutParams . FLAG_NOT_TOUCH_MODAL significa que los eventos fuera del área de visualización van a las UI subyacentes. Ahora encontrará que funciona, pero que otras cosas malas todavía suceden, como los botones de atrás / menú no se dirigen a las aplicaciones, además de no tener teclado. Para resolver eso necesitas FLAG_NOT_FOCUSABLE .

Obtienes un efecto secundario del bit no enfocable también, lo que ya no es una buena interacción con tu superposición, por ejemplo, presionar un botón. Sin embargo, puede obtener algunos eventos táctiles básicos, que siempre puede realizar en matemáticas, y eso es probablemente suficiente para las Cabezas de chat. Solo ten en cuenta que te deja solo en muchas áreas, como la animación de IU.

En este hilo de StackOverflow se puede encontrar una buena visión general de los detalles, que incluye el consumo de interacción selectiva. En particular, uno de los enlaces de respuesta eventualmente lo llevará aquí , que es un buen ejemplo de proyecto. Tenga en cuenta que ICS cambió la forma en que esto funciona un poco, pero los hilos lo explican.

Esto es todo material API público, pero en realidad no parece una cosa convencional que uno debería estar haciendo por rutina. La documentación está llena de referencias a comportamientos especiales de las aplicaciones del sistema, y ​​con buenas razones; ¿y si todos lo hicieran?

Springy heads ofrece el comportamiento basado en la spring de las cabezas de conversación fuera de la caja. Todo lo que tiene que definir es el dibujable para el encabezado del chat y el fragmento para abrir una vez que se hace clic en el encabezado del chat. Las cabezas de chat colapsan cuando se minimizan y siguen el dedo cuando se arrastran.

El proyecto incluye una aplicación de demostración que demuestra toda la funcionalidad incorporada. Para usarlo, debes agregar esto a tus dependencias de gradle.

 compile 'com.flipkart.springyheads:library:0.9.6'