2013-04-12 1 views
215

Wie erstellt Facebook die Chat Heads auf Android? Was ist die API, um die schwebenden Ansichten über allen anderen Ansichten zu erstellen?Welche APIs in Android verwendet Facebook, um Chat Heads zu erstellen?

+6

Diese App hat auch "Chat Heads" https://play.google.com/store/apps/details?id=com.ninja.sms – Oli

+11

Wenn Sie ein Beispiel suchen, sehen https : //github.com/marshallino16/FloatingNotification – marshallino16

+5

Hier finden Sie eine Demo und eine einfache Bibliothek: https://github.com/ericbhatti/floaties Mit dieser Bibliothek können Sie schwebende Fenster mit nur 2 Zeilen erstellen. –

Antwort

210

This one:

Ermöglicht eine Anwendung, Fenster zu öffnen, den Typ TYPE_SYSTEM_ALERT verwenden, über alle anderen Anwendungen gezeigt. Sehr wenige Anwendungen sollten diese Berechtigung verwenden; Diese Fenster sind für die Interaktion auf Systemebene mit dem Benutzer vorgesehen.

Konstanter Wert: "android.permission.SYSTEM_ALERT_WINDOW"

// EDIT: Der vollständige Code 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); 
    } 
} 

Vergessen Sie nicht irgendwie den Dienst zu starten:

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

.. Und diesen Service zu Ihrem Manifest hinzufügen.

+4

Es gibt mehr komische Sachen, denke ich. Was ist mit der Handhabung von Eingaben außerhalb des "Kopfes" und der Verschiebbarkeit? Ich denke, dass Sie mindestens [FLAG_NOT_TOUCH_MODAL] (http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_NOT_TOUCH_MODAL), sowie einige kluge Logik benötigen, um die Fensterattribute zu aktualisieren (dh Bewegen Sie es, während Sie es ziehen. – Delyan

+2

darin, wie man choke -heads entfernt? –

+6

Dachte, dass es wert ist, ein SDK zu erwähnen, das ich für die Erstellung der schwimmenden UI entwickelt habe: www.tooleap.com – Arik

50

In der Regel sind Android-Aktivitäten im Vollbildmodus, konzeptionell dedizierte Benutzeroberflächen, die die gesamte Interaktion übernehmen. Es gibt ein paar Ausnahmen. Zum einen gibt es Popup-Dialoge, die den Bildschirm nicht füllen. Ein anderer ist der Android-Toast, der ein nicht-interaktives Popup ist - du kannst es nicht berühren, und wenn du es versuchst, wird es zu dem, was darunter ist, gehen.

Sie können auch Ihre eigenen speziellen Benutzeroberflächen erstellen. Sie können Ansichten direkt zur WindowManager hinzufügen, indem Sie einen Typ-Flag angeben. Chat Heads verwendet wahrscheinlich TYPE_PHONE. Es gibt ein paar ähnliche Typen, aber der Zweck ist der gleiche: Overlays für spezielle Zwecke, die über allem anderen erscheinen können, ohne dass die Hauptanwendung offensichtlich vorhanden ist.

Das bringt Sie aber bisher nur wegen Problemen mit der Interaktion. Zuerst wird Ihr Overlay die gesamte Interaktion absorbieren, so dass der Kopf nicht nur Ereignisse erhält, sondern auch die Interaktion mit dem darunterliegenden Objekt.

Sie konfigurieren dieses Verhalten mit der LayoutParams. FLAG_NOT_TOUCH_MODAL bedeutet, dass Ereignisse außerhalb Ihres Anzeigebereichs zu den zugrunde liegenden Benutzeroberflächen gehen. Sie werden jetzt feststellen, dass es funktioniert, aber dass noch andere schlimme Dinge passieren, wie die Zurück-/Menü-Tasten nicht auf Apps gerichtet werden, plus keine Tastatur. Um das zu lösen, benötigen Sie FLAG_NOT_FOCUSABLE.

Sie erhalten einen Nebeneffekt von dem nicht fokussierbaren Bit, das keine netten Interaktionen mit Ihrem Overlay mehr ist, z. Taste drückt. Sie können jedoch einige grundlegende Berührungsereignisse erhalten, mit denen Sie immer rechnen können, und das ist wahrscheinlich genug für Chat Heads. Seien Sie sich jedoch bewusst, dass Sie in vielen Bereichen wie UI-Animation selbständig bleiben.

Eine gute Übersicht über das Detail, einschließlich der Möglichkeit der selektiven Interaktion, finden Sie in this StackOverflow thread. Insbesondere wird einer der Antwort-Links Sie schließlich here nehmen, was ein gutes Beispielprojekt ist. Beachten Sie, dass ICS geändert hat, wie das funktioniert, aber die Threads erklären das.

Dies ist alles öffentliche API-Zeug, aber es scheint nicht wirklich eine Mainstream-Sache, die man tun sollte, als eine Selbstverständlichkeit. Die Dokumentation ist mit Verweisen auf spezielle System-App-Verhaltensweisen übersät, und zwar aus gutem Grund; Was wäre, wenn alle es getan hätten?

+0

Konnte ich irgendwie Orientierungsänderungen für diese Ansicht blockieren? Wenn die zugrunde liegende Aktivität die Ausrichtung ändert, ändert meine Ansicht auch ihre Ausrichtung. –

+1

Nein. Die Orientierungsänderung ist gerätespezifisch, nicht nur für die Aktivität. –

7

Springy heads gibt Feder-basierte Verhalten von Chat-Köpfe aus der Box. Alles, was Sie definieren müssen, ist das Zeichen für den Chat-Kopf und das Fragment, das geöffnet wird, sobald der Chat-Kopf angeklickt wird. Die Chat-Köpfe reduzieren sich beim Minimieren und folgen dem Finger beim Ziehen.

Das Projekt enthält eine Demo-App, die alle eingebauten Funktionen demonstriert. Um es zu verwenden, müssen Sie dies zu Ihren Abhängigkeiten hinzufügen.

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

Hey @KiranKumar, Sie haben eine sehr klare Bibliothek erstellt .. Ich liebe es einfach .. Ich versuche, verschiedene Aspekte aus dieser Bibliothek zu lernen .. Ich habe versucht, es außerhalb des Anwendungsfensters zu laufen, irgendwie bin ich etwas erfolgreich in tun, dass so .. Aber das Problem entsteht, wenn ich den Chat-Kopf außerhalb des Fensters der App klicke .. das Fragment wäre nicht in der Lage zu öffnen und zurückgeben java.lang.OutOfMemoryError .. wenn es von Ihrer Seite möglich sein könnte um mir einen Weg durch diese zu geben .. Es wird gerne geehrt .. – arraystack

+0

@arraystack jetzt können Sie es in einem Dienst ausführen. Überprüfen Sie die Liste, wenn Zweige in der GitHub Repo –

+0

@KiranKumar Vielen Dank, Das Problem mit der neuen lib ist die Erlaubnis von Draw über Anwendung in Marshmallow-Version – arraystack

Verwandte Themen