it-swarm.com.de

Welche APIs in Android verwendet Facebook, um Chat-Köpfe zu erstellen?

Wie erstellt Facebook die Chatköpfe auf Android? Was ist die API, um die schwebenden Ansichten über alle anderen Ansichten zu erstellen?

225
Daniel A. White

This one:

Ermöglicht einer Anwendung, Fenster mit dem Typ TYPE_SYSTEM_ALERT zu öffnen, der über allen anderen Anwendungen angezeigt wird. Nur sehr wenige Anwendungen sollten diese Berechtigung verwenden. Diese Fenster sind für die Interaktion mit dem Benutzer auf Systemebene vorgesehen.

Konstanter Wert: "Android.permission.SYSTEM_ALERT_WINDOW"

// EDIT: Der vollständige Code hier :

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

Vergiss nicht, den Dienst irgendwie zu starten:

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

.. Und füge diesen Dienst deinem Manifest hinzu.

217
Waza_Be

In der Regel sind Android Vollbild-Aktivitäten, konzeptionell festgelegte Benutzeroberflächen, die die gesamte Interaktion übernehmen. Es gibt einige Ausnahmen. Zunächst gibt es Popup-Dialogfelder, die das nicht ausfüllen Ein weiterer Grund ist der Toast Android), bei dem es sich um ein nicht interaktives Popup handelt. Sie können es nicht berühren, und wenn Sie es versuchen, gelangen Sie zu dem, was darunter liegt.

Sie können auch Ihre eigenen speziellen Benutzeroberflächen erstellen. Sie können Ansichten direkt zu WindowManager hinzufügen, indem Sie ein Typflag angeben. Chat Heads verwendet wahrscheinlich TYPE_PHONE . Es gibt einige ähnliche Typen, aber der Zweck ist derselbe: Überlagerungen für spezielle Zwecke, die über allem anderen angezeigt werden können, ohne dass die übergeordnete Anwendung anscheinend vorhanden ist.

Das bringt dich aber nur so weit, weil es Probleme mit der Interaktion gibt. Zuerst absorbiert Ihre Überlagerung die gesamte Interaktion, sodass nicht nur der Kopf Ereignisse erhält, sondern Sie auch die Interaktion mit allen darunter liegenden Elementen blockieren.

Sie konfigurieren dieses Verhalten mit LayoutParams . FLAG_NOT_TOUCH_MODAL bedeutet, dass Ereignisse außerhalb Ihres Anzeigebereichs zu den zugrunde liegenden Benutzeroberflächen geleitet werden. Sie werden jetzt feststellen, dass es funktioniert, aber es passieren immer noch andere schlimme Dinge, z. B., dass die Schaltflächen Zurück/Menü nicht auf Apps und keine Tastatur gerichtet werden. Um das zu lösen, brauchst du FLAG_NOT_FOCUSABLE.

Sie erhalten auch einen Nebeneffekt durch das nicht fokussierbare Bit, bei dem es sich nicht mehr um nette Interaktionen mit Ihrer Überlagerung handelt, z. Taste drückt. Sie können jedoch einige grundlegende Berührungsereignisse abrufen, mit denen Sie immer rechnen können, und das ist wahrscheinlich genug für Chat Heads. Beachten Sie jedoch, dass Sie in zahlreichen Bereichen, wie z. B. der Benutzeroberflächenanimation, auf sich allein gestellt sind.

Einen guten Überblick über die Details, einschließlich der Berücksichtigung von selektivem Interaktionsverbrauch, finden Sie in dieser StackOverflow-Thread . Insbesondere einer der Antwortlinks führt Sie schließlich zu hier , einem guten Beispielprojekt. Beachten Sie, dass ICS etwas an der Funktionsweise geändert hat, aber die Threads erklären dies.

Dies ist alles öffentliches API-Zeug, aber es scheint nicht wirklich eine Mainstream-Sache zu sein, die man selbstverständlich tun sollte. Die Dokumentation ist mit Verweisen auf spezielle System-App-Verhaltensweisen übersät, und das aus gutem Grund. Was wäre, wenn jeder es getan hätte?

52
Rob Pridham

Springy Heads gibt das frühlingsbasierte Verhalten von Chat Heads aus der Box. Alles, was Sie definieren müssen, ist die Zeichenfunktion, mit der der Chat-Kopf und das Fragment geöffnet werden, sobald Sie auf den Chat-Kopf klicken. Die Chatköpfe kollabieren, wenn sie minimiert werden, und folgen beim Ziehen dem Finger.

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

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