2013-04-12 15 views
215

W jaki sposób Facebook tworzy czaty na Androida? Co to jest API, aby utworzyć pływające widoki na górze wszystkich innych widoków?Jakie interfejsy API w systemie Android to Facebook, które służą do tworzenia nagłówków czatów?

+6

Ta aplikacja jest również „Chat Heads” https://play.google.com/store/apps/details?id=com.ninja.sms – Oli

+11

Jeśli szukasz przykład zobaczyć https : //github.com/marshallino16/FloatingNotification – marshallino16

+5

Możesz znaleźć demo i prostą bibliotekę tutaj: https://github.com/ericbhatti/floaties Korzystając z tej biblioteki, możesz tworzyć ruchome okna za pomocą zaledwie 2 linii. –

Odpowiedz

210

This jeden:

Zezwala aplikacji na otwarte okna przy użyciu typu TYPE_SYSTEM_ALERT, pokazany na wierzchu wszystkich innych aplikacji. Bardzo niewiele aplikacji powinno korzystać z tego pozwolenia; te okna są przeznaczone do interakcji na poziomie systemu z użytkownikiem.

Stała wartość: "android.permission.SYSTEM_ALERT_WINDOW"

// EDIT: pełny kod 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); 
    } 
} 

Nie zapomnij uruchomić usługę jakoś:

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

.. I dodaj tę usługę do Manifestu.

+4

Myślę, że jest więcej dziwnych rzeczy. A co z obsługą danych wejściowych poza "głową", a także z możliwością przeciągania? Myślę, że potrzebujesz przynajmniej [FLAG_NOT_TOUCH_MODAL] (http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_NOT_TOUCH_MODAL), a także sprytnej logiki do aktualizacji atrybutów okna (np. , przesuń go) podczas przeciągania. – Delyan

+2

w ten sposób usunąć głowice czatów? –

+6

Pomyślałem, że warto wspomnieć o SDK, który opracowałem do tworzenia pływającego interfejsu użytkownika: www.tooleap.com – Arik

50

Z reguły działania Androida to pełnoekranowe koncepcyjnie dedykowane interfejsy, które wymagają interakcji. Istnieje kilka wyjątków od tego. Na początek pojawiają się okna dialogowe, które nie wypełniają ekranu. Innym jest toast Android, który jest nieinteraktywnym wyskakującym okienka - nie możesz go dotknąć, a jeśli spróbujesz, przejdzie do tego, co jest pod spodem.

Możesz także tworzyć swoje własne specjalne interfejsy. Widoki można dodawać bezpośrednio do WindowManager, określając flagę typu. Chat Heads prawdopodobnie używa TYPE_PHONE. Istnieje kilka podobnych typów, ale cel jest taki sam: nakładki specjalnego przeznaczenia, które mogą pojawiać się nad wszystkim innym bez widocznej obecności aplikacji nadrzędnej.

To jednak sprawia, że ​​jesteście aż tak daleko z powodu problemów z interakcją. Na początku Twoja nakładka pochłonie całą interakcję, więc nie tylko głowa otrzyma zdarzenia, ale zablokujesz interakcję z wszystkim pod spodem.

Skonfigurować to zachowanie za pomocą LayoutParams. FLAG_NOT_TOUCH_MODAL oznacza, że ​​zdarzenia spoza obszaru wyświetlania przechodzą do podstawowych interfejsów użytkownika. Przekonasz się, że to działa, ale jeszcze inne złe rzeczy wciąż się zdarzają, np. Przyciski wstecz/menu nie są kierowane do aplikacji ani klawiatury. Aby rozwiązać problem, potrzebujesz FLAG_NOT_FOCUSABLE.

Otrzymujesz również efekt uboczny z bitu, który nie może być aktywowany, co nie jest już miłym interakcją z nakładką, np. Prasy przyciskowe. Możesz uzyskać podstawowe informacje o zdarzeniach dotykowych, które zawsze możesz wykonywać w matematyce, a to prawdopodobnie wystarczy na czatach. Po prostu pamiętaj, że pozostawia Cię sam w wielu obszarach, takich jak animacja interfejsu użytkownika.

Dobry przegląd szczegółów, w tym pozwalających na selektywne zużycie interakcji, można znaleźć w this StackOverflow thread. W szczególności jeden z linków do odpowiedzi w końcu zabierze Cię here, co jest dobrym przykładem projektu. Zauważ, że usługa ICS zmieniła sposób działania, ale wątki to wyjaśniają.

To wszystko jest publiczne API, ale tak naprawdę nie wydaje się być głównym nurtem, który należy robić w sposób oczywisty. Dokumentacja jest zaśmiecona odniesieniami do specjalnych zachowań aplikacji systemowych i nie bez powodu; co jeśli wszyscy to zrobili?

+0

Czy mogę zablokować jakoś zmiany orientacji dla tego widoku? Jeśli podstawowa czynność zmienia orientację, mój widok zmienia także jego orientację. –

+1

Nie. Zmiana orientacji dotyczy całego urządzenia, a nie tylko aktywności. –

7

Springy heads daje wiosenne zachowanie głowic czatowych po wyjęciu z pudełka. Wszystko, co musisz zdefiniować, to losowanie nagłówka czatu i fragmentu do otwarcia po kliknięciu nagłówka czatu. Głowice czatu zwijają się po zminimalizowaniu i podążają za palcem po przeciągnięciu.

Projekt zawiera aplikację demonstracyjną, która demonstruje wszystkie wbudowane funkcje. Aby z niego skorzystać, musisz dodać to do swoich zależności gradle.

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

Hej @KiranKumar, stworzyłeś bardzo przejrzystą bibliotekę .. Po prostu to uwielbiam .. Próbuję nauczyć się różnych aspektów z tej biblioteki .. Próbowałem uruchomić ją poza oknem aplikacji, jakoś jestem lekko udany w robi to tak ... Ale problem powstaje, gdy klikam na czacie poza oknem aplikacji ... fragment nie będzie mógł otworzyć i powrócić java.lang.OutOfMemoryError .. jeśli to możliwe z twojej strony aby mi to przekazać .. Będzie chętnie zaszczycony .. – arraystack

+0

@arraystack teraz możesz go uruchomić w serwisie. Sprawdź listę, czy gałęzie w repozytorium GitHub –

+0

@KiranKumar Dziękuję, problem z nową biblioteką jest zgodą aplikacji Draw over w wersji Marshmallow – arraystack