¿Cómo crea Facebook los Chat Heads en Android? ¿Cuál es la API para crear las vistas flotantes sobre todas las demás vistas?
¿Cómo crea Facebook los Chat Heads en Android? ¿Cuál es la API para crear las vistas flotantes sobre todas las demás vistas?
Respuestas:
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 de sistema con el usuario.
Valor constante: "android.permission.SYSTEM_ALERT_WINDOW"
// EDITAR: 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 olvide iniciar el servicio de alguna manera:
startService(new Intent(context, ChatHeadService.class));
.. Y agregue este servicio a su Manifiesto.
Como regla general, las actividades de Android son UI de pantalla completa, conceptualmente 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. Otro es el brindis de Android, que es una ventana emergente no interactiva: no puede tocarlo y, si lo intenta, irá a lo que esté debajo.
También puedes hacer tus propias IU especiales. Puede agregar vistas directamente al WindowManager
, especificando un indicador de tipo. Chat Heads probablemente usa TYPE_PHONE . Hay algunos tipos similares, pero el propósito es el mismo: superposiciones de propósito especial que pueden aparecer sobre la parte superior de cualquier otra cosa sin que la aplicación principal aparentemente esté presente.
Sin embargo, eso solo te lleva muy lejos, debido a problemas de interacción. Al principio, su superposición absorberá toda la interacción, por lo que no solo la cabeza recibe eventos, sino que bloquea la interacción con todo lo que está debajo.
Configura este comportamiento utilizando los LayoutParams . FLAG_NOT_TOUCH_MODAL
significa que los eventos fuera de su área de visualización van a las IU subyacentes. Ahora descubrirá que funciona, pero que otras cosas malas aún suceden, como los botones de retroceso / menú no se dirigen a las aplicaciones, además de que no hay teclado. Para resolver eso que necesitas FLAG_NOT_FOCUSABLE
.
También obtiene un efecto secundario del bit no enfocable, que ya no es una buena interacción con su superposición, por ejemplo, al presionar botones. Sin embargo, puede obtener algunos eventos táctiles básicos, en los que siempre puede hacer cálculos, y eso probablemente sea suficiente para Chat Heads. Solo tenga en cuenta que lo deja solo en muchas áreas, como la animación de la interfaz de usuario.
Una buena visión general de los detalles, incluyendo el permitir para el consumo interacción selectiva, se puede encontrar en este hilo StackOverflow . En particular, uno de los enlaces de respuesta te llevará eventualmente aquí , lo cual es un buen proyecto de ejemplo. Tenga en cuenta que ICS cambió un poco la forma en que esto funciona, pero los hilos lo explican.
Todo esto es material público de API, pero en realidad no parece una cosa convencional que uno debería estar haciendo de forma natural. La documentación está llena de referencias a comportamientos especiales de la aplicación del sistema, y con buenas razones; ¿Y si todos lo hicieran?
Springy heads ofrece un comportamiento basado en la primavera de los chat heads fuera de la caja. Todo lo que tiene que definir es el dibujo del encabezado del chat y el fragmento que se abrirá una vez que se haga 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 muestra todas las funciones integradas. Para usarlo, debe agregar esto a sus dependencias de gradle.
compile 'com.flipkart.springyheads:library:0.9.6'