2013-04-12 14 views
215

In che modo Facebook crea i Chat Head su Android? Qual è l'API per creare le viste mobili sopra tutte le altre viste?Quali sono le API di Android utilizzate per creare Chat Head?

+6

Questa applicazione è anche "Chat teste" https://play.google.com/store/apps/details?id=com.ninja.sms – Oli

+11

Se siete alla ricerca di un esempio, vedere https : //github.com/marshallino16/FloatingNotification – marshallino16

+5

Qui puoi trovare una demo e una semplice libreria: https://github.com/ericbhatti/floaties Usando questa libreria puoi creare finestre mobili usando solo 2 linee. –

risposta

210

This uno:

Consente ad un'applicazione di aprire finestre usando l'TYPE_SYSTEM_ALERT tipo , mostrato in cima a tutte le altre applicazioni. Pochissime applicazioni dovrebbero usare questa autorizzazione; queste finestre sono intese per per l'interazione a livello di sistema con l'utente.

Costante Valore: "android.permission.SYSTEM_ALERT_WINDOW"

// EDIT: Il codice completo 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); 
    } 
} 

Non dimenticate di avviare il servizio in qualche modo:

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

.. E aggiungi questo servizio al tuo Manifesto.

+4

C'è altra roba strana, penso. Per quanto riguarda la gestione dell'input al di fuori della "testa" e la trascinabilità? Penso che avresti almeno bisogno di [FLAG_NOT_TOUCH_MODAL] (http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_NOT_TOUCH_MODAL), nonché di una logica intelligente per aggiornare gli attributi di Window (es. , spostalo) mentre lo stai trascinando. – Delyan

+2

in che modo rimuovere le chatheadheads? –

+6

Pensavo che valesse la pena citare un SDK che ho sviluppato per creare un'interfaccia utente mobile: www.tooleap.com – Arik

50

Di norma, le attività Android sono interfacce utente a schermo intero e concettualmente dedicate che svolgono tutte le interazioni. Ci sono alcune eccezioni a questo. Per cominciare, ci sono finestre di dialogo popup che non riempiono lo schermo. Un altro è il toast Android, che è un popup non interattivo - non puoi toccarlo, e se lo provi andrai a qualsiasi cosa ci sia sotto.

Puoi anche creare le tue UI speciali. È possibile aggiungere viste direttamente a WindowManager, specificando un flag di tipo. Probabilmente Chat Heads usa TYPE_PHONE. Ci sono alcuni tipi simili, ma lo scopo è lo stesso: sovrapposizioni di scopi speciali che possono apparire sopra qualsiasi altra cosa senza che l'applicazione madre sia presente.

Questo ti porta solo lontano, a causa di problemi di interazione. All'inizio, il tuo overlay assorbirà tutte le interazioni, quindi non solo la testa ottiene eventi, ma blocchi l'interazione a tutto ciò che si trova al di sotto.

Si configura questo comportamento utilizzando LayoutParams. FLAG_NOT_TOUCH_MODAL significa che gli eventi al di fuori dell'area di visualizzazione passano alle UI sottostanti. Ora troverai che funziona, ma che altre cose brutte si verificano ancora, come i pulsanti indietro/menu non vengono indirizzati alle app, più nessuna tastiera. Per risolvere questo è necessario FLAG_NOT_FOCUSABLE.

Si ottiene un effetto collaterale anche dal bit non focalizzabile, che non è più un'interazione piacevole con il proprio overlay, ad es. pulsante preme. Puoi comunque ottenere alcuni eventi di tocco di base, che puoi sempre fare in matematica, e questo è probabilmente sufficiente per Chat Heads. Basta essere consapevoli del fatto che ti lascia da solo in molte aree, come l'animazione dell'interfaccia utente.

Una buona panoramica dei dettagli, compresa la possibilità di un consumo di interazione selettiva, è disponibile in this StackOverflow thread. In particolare uno dei link di risposta alla fine ti porterà a here, che è un buon esempio di progetto. Nota che ICS ha cambiato il modo in cui funziona un po ', ma i thread lo spiegano.

Questa è tutta roba pubblica dell'API, ma in realtà non sembra una cosa mainstream che si dovrebbe fare naturalmente. La documentazione è disseminata di riferimenti a comportamenti app di sistema speciali e a ragione; e se lo facessero tutti?

+0

Posso bloccare in qualche modo le modifiche di orientamento per queste viste? Se l'attività sottostante cambia orientamento, la mia vista cambia anche il suo orientamento. –

+1

No. Il cambio di orientamento è a livello di dispositivo, non solo per l'attività. –

7

Springy heads fornisce un comportamento basato sulla molla di chat test fuori dalla scatola. Tutto ciò che devi definire è il drawable per la testata della chat e il frammento da aprire dopo aver fatto clic sulla testa della chat. Le teste della chat si comprimono quando vengono ridotte al minimo e seguono il dito quando vengono trascinate.

Il progetto include un'app demo che dimostra tutte le funzionalità incorporate. Per usarlo, è necessario aggiungerlo alle dipendenze gradle.

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

Ehi @KiranKumar, hai creato una libreria molto chiara .. Lo adoro .. Sto cercando di imparare vari aspetti da questa libreria .. Ho cercato di eseguirlo fuori dalla finestra dell'applicazione, in qualche modo ho un po 'di successo in facendo così .. Ma, il problema sorge quando faccio clic sulla testa della chat fuori dalla finestra dell'app .. il frammento non sarebbe in grado di aprire e restituire java.lang.OutOfMemoryError .. se potrebbe essere possibile dal tuo lato per darmi un modo per farlo .. Sarà onorato con piacere .. – arraystack

+0

@arraystack ora puoi eseguirlo in un servizio. Controlla l'elenco delle filiali nel repository di GitHub –

+0

@KiranKumar Grazie, il problema con la nuova libreria è il permesso di Draw over application in Marshmallow Version – arraystack

Problemi correlati