web-dev-qa-db-fra.com

Quelles API dans Android Facebook utilise-t-il pour créer des têtes de conversation?

Comment Facebook crée-t-il les têtes de chat sur Android? Qu'est-ce que l'API pour créer les vues flottantes au-dessus de toutes les autres vues?

225
Daniel A. White

Ceci un:

Permet à une application d'ouvrir des fenêtres en utilisant le type TYPE_SYSTEM_ALERT, affiché en haut de toutes les autres applications. Très peu d'applications devraient utiliser cette permission. ces fenêtres sont conçues pour une interaction au niveau du système avec l'utilisateur.

Valeur constante: "Android.permission.SYSTEM_ALERT_WINDOW"

// EDIT: Le code complet ici :

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

N'oubliez pas de démarrer le service en quelque sorte:

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

.. Et ajoutez ce service à votre manifeste.

217
Waza_Be

En règle générale, les activités Android sont des interfaces utilisateur en mode plein écran, dédiées de manière conceptuelle, qui prennent en charge toutes les interactions. Il y a quelques exceptions à cela. Pour commencer, il existe des boîtes de dialogue contextuelles qui ne remplissent pas l'écran. Un autre exemple est le toast Android, qui est une fenêtre contextuelle non interactive - vous ne pouvez pas le toucher, et si vous essayez, il ira à tout ce qui se trouve en dessous.

Vous pouvez également créer vos propres interfaces utilisateur spéciales. Vous pouvez ajouter des vues directement à la WindowManager, en spécifiant un indicateur de type. Les chefs de conversation utilisent probablement TYPE_PHONE . Il existe quelques types similaires, mais le but est le même: des superpositions à des fins spéciales qui peuvent apparaître au-dessus de tout autre élément sans la demande parent apparemment présente.

Cela ne vous mène que jusqu'à présent, cependant, à cause de problèmes d'interaction. Au début, votre superposition absorbera toute l’interaction. Ainsi, non seulement la tête reçoit les événements, mais vous bloquez l’interaction avec tout ce qui se trouve en dessous.

Vous configurez ce comportement à l'aide de LayoutParams . FLAG_NOT_TOUCH_MODAL signifie que les événements situés en dehors de votre zone d'affichage vont aux interfaces utilisateur sous-jacentes. Vous constaterez maintenant que cela fonctionne, mais que d’autres mauvaises choses se produisent encore, comme les boutons Retour/Menu ne sont pas dirigés vers les applications, plus aucun clavier. Pour résoudre ce problème, vous avez besoin de FLAG_NOT_FOCUSABLE.

Vous obtenez également un effet secondaire lié au bit non focalisable, qui n’est plus une interaction de Nice avec votre superposition, par exemple. bouton appuie. Vous pouvez cependant obtenir quelques événements tactiles de base, sur lesquels vous pouvez toujours faire des calculs, et c'est probablement suffisant pour les têtes de conversation. Sachez simplement que cela vous laisse dans de nombreux domaines, comme l'animation d'interface utilisateur.

Vous trouverez un bon aperçu des détails, notamment en ce qui concerne la consommation d’interactions sélectives, dans ce fil StackOverflow . En particulier, l’un des liens de réponse vous mènera éventuellement ici , ce qui est un bon exemple de projet. Notez que ICS a changé un peu le fonctionnement de ce logiciel, mais les threads l'expliquent.

Tout cela concerne les API publiques, mais cela ne semble pas vraiment être une chose courante que l’on devrait faire normalement. La documentation est jonchée de références à des comportements d'applications système spécifiques, et avec raison; Et si tout le monde le faisait?

52
Rob Pridham

Springy heads donne un comportement basé sur le ressort des têtes de discussion hors de la boîte. Tout ce que vous avez à définir est le dessin pour la tête de discussion et le fragment à ouvrir une fois que vous avez cliqué sur la tête de discussion. Les têtes de conversation s'effondrent lorsqu'elles sont réduites et suivent le doigt lorsqu'elles sont déplacées.

Le projet comprend une application de démonstration qui présente toutes les fonctionnalités intégrées. Pour l'utiliser, vous devez l'ajouter à vos dépendances.

compile 'com.flipkart.springyheads:library:0.9.6'
7
Kiran Kumar