android-windowmanager nombre" - ¿Qué API en Android usa Facebook para crear cabezas de chat?




{skullowner:"nombre"} "tu (4)

Springy heads proporciona un comportamiento basado en la primavera de chat heads out de la caja. Todo lo que tiene que definir es la posibilidad de dibujar para que la cabeza del chat y el fragmento se abran una vez que se haga clic en él. Las cabezas de conversación se 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, necesita agregar esto a sus dependencias de gradle.

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

¿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?


This :

Permite que una aplicación abra ventanas utilizando el tipo TYPE_SYSTEM_ALERT, que se muestra sobre todas las demás aplicaciones. Muy pocas aplicaciones deben 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"

// EDITAR: El código completo here :

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 olvides iniciar 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 UI de pantalla completa y conceptualmente dedicadas que toman toda la interacción. Hay algunas excepciones a esto. Para empezar, hay diálogos 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 esté debajo.

También puedes hacer tus propias interfaces de usuario especiales. Puede agregar vistas directamente al WindowManager , especificando un indicador de tipo. Los jefes de chat probablemente usan TYPE_PHONE . Existen algunos tipos similares, pero el propósito es el mismo: las superposiciones de propósito especial que pueden aparecer por encima de cualquier otra cosa sin que aparentemente la aplicación principal esté presente.

Sin embargo, eso solo te lleva muy lejos debido a problemas con la interacción. Al principio, su superposición absorberá toda la interacción, por lo que la cabeza no solo obtiene eventos, sino que también bloquea la interacción a todo lo que está debajo.

Puede configurar este comportamiento utilizando los LayoutParams . FLAG_NOT_TOUCH_MODAL significa que los eventos fuera de su área de visualización van a las interfaces de usuario subyacentes. Ahora encontrará que funciona, pero que otras cosas malas siguen sucediendo, como que los botones de menú / retroceso no se dirigen a las aplicaciones, más ningún teclado. Para resolverlo necesitas FLAG_NOT_FOCUSABLE .

También se obtiene un efecto secundario del bit no enfocable, que ya no es una interacción agradable con su superposición, por ejemplo, al presionar los botones. Sin embargo, puedes obtener algunos eventos táctiles básicos, en los que siempre puedes hacer cálculos matemáticos, y eso es probablemente suficiente para los Chat Heads. Solo tenga en cuenta que lo deja solo en muchas áreas, como la animación de la interfaz de usuario.

En este hilo de se puede encontrar una buena descripción general de los detalles, que incluye permitir el consumo de interacción selectiva. En particular, uno de los enlaces de respuesta lo llevará hasta here , lo que es un buen proyecto de ejemplo. Tenga en cuenta que ICS cambió la forma en que funciona un poco, pero los subprocesos lo explican.

Todo esto es cosa de API pública, pero en realidad no parece ser una cosa común que uno debería estar haciendo como una cuestión de rutina. La documentación está llena de referencias a comportamientos especiales de aplicaciones del sistema, y ​​con buena razón; ¿Y si todos lo hicieran?


Este atributo declara a qué actividad está asociada esta disposición de forma predeterminada .





android facebook android-windowmanager