231 votes

Ce que l'Api d'Android est Facebook utilisez pour créer des Têtes de Chat?

Comment Facebook créer les Chat Heads sur Android? Qu'est-ce que l'API pour créer le floating point de vue sur le dessus de tous les autres points de vue?

219voto

Waza_Be Points 14584

Celui-ci:

http://developer.android.com/reference/android/Manifest.permission.html#SYSTEM_ALERT_WINDOW

Permet à une application pour ouvrir les fenêtres à l'aide de l' TYPE_SYSTEM_ALERT, indiquée sur le dessus de toutes les autres applications. Très peu d'applications devraient utiliser cette autorisation; ces fenêtres sont destinés pour le système de niveau de l'interaction avec l'utilisateur.

La Valeur de la constante: "android.la permission.SYSTEM_ALERT_WINDOW"

//EDIT: Le code complet: http://www.piwai.info/chatheads-basics/

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

52voto

Rob Pridham Points 1997

En règle générale, Android activités sont en plein écran, sur le plan conceptuel dédié de l'Isu qui prennent toute interaction. Il existe quelques exceptions à cela. Pour commencer, il y a des boîtes de dialogue popup qui ne remplit pas l'écran. Un autre est le Android pain grillé, qui est un non-interactive pop - up vous ne pouvez pas le toucher, et si vous l'essayez vais aller à tout ce qui est en dessous.

Vous pouvez faire votre propre spécial de l'Isu. Vous pouvez ajouter des points de vue directement à l' WindowManager, la spécification d'un type de drapeau. Chat Heads utilise probablement TYPE_PHONE. Il ya quelques types similaires, mais le but est le même: à des fins spéciales de superposition qui peuvent apparaître sur le dessus de quoi que ce soit d'autre sans l'application parent apparemment.

Qui ne mène pas loin, mais en raison de problèmes d'interaction. Au début, votre superposition va absorber la totalité de l'interaction, de sorte que non seulement la tête des événements, mais le blocage de l'interaction tout en dessous.

Vous configurer ce comportement à l'aide de la LayoutParams. FLAG_NOT_TOUCH_MODAL signifie que les événements à l'extérieur de votre zone d'affichage aller à la sous-jacentes de l'Isu. Maintenant vous trouverez qu'il fonctionne, mais que d'autres mauvaises choses se produisent encore, comme le dos/les boutons de menu n'obtenez pas dirigé vers des applications, ainsi que pas de clavier. Pour résoudre ce que vous avez besoin d' FLAG_NOT_FOCUSABLE.

Vous obtenez un effet secondaire de la non-focusable peu trop, ce qui n'est pas de belles interactions avec vos superposition de plus, par exemple, on appuie sur un bouton. Vous pouvez obtenir certains évènements tactiles, vous pouvez toujours faire des maths, et c'est probablement suffisant pour les Têtes de Chat. Juste être conscient qu'elle vous laisse sur votre propre dans beaucoup de domaines, comme l'INTERFACE utilisateur de l'animation.

Un bon aperçu du détail, y compris en permettant sélectif de l'interaction de la consommation, peut être trouvé dans cette StackOverflow fil. En particulier, l'un de la réponse liens vous emmènera ici, ce qui est un bon exemple de projet. Notez que ICS changé la façon dont cela fonctionne un peu, mais les fils de l'expliquer.

C'est toutes les API de trucs, mais il ne semble pas vraiment comme un grand chose que l'on devrait faire comme une question de cours. La documentation est parsemée de références à un système spécial d'application de comportements, et avec une bonne raison; ce que si tout le monde faisait?

13voto

FoY Points 106

Serait quelque chose comme ce travail?

https://www.youtube.com/watch?v=hdxdTkdNkVs

Vous pouvez regarder le code ici:

https://github.com/fouady/SpotifyTray-Android

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X