2013-04-13 7 views
33

Come posso implementare una sovrapposizione popup per un'app che può essere visualizzata su qualsiasi altra app.Come implementare una sovrapposizione popup che può essere visualizzata su qualsiasi altra app in Android

Facebook ha implementato una funzione molto simile chiamata Chatheads nella sua nuova versione di Facebook Messanger. Sono stato davvero sorpreso di vedere che questo è il modo in cui è possibile. Nell'immagine, vedi una testa di chat (cane sulla destra) su un'altra app.

Facebook Messanger's Chathead over other app

+0

Penso che questa sia una domanda legittima. Potrebbe essere male dichiarato per alcune persone. Riformula la domanda in modo che si concentri maggiormente sugli overlay popup dello schermo su qualsiasi app piuttosto che su Facebook Messenger stesso, attribuiscilo come esempio. Screenshot è anche bello dare contesto. –

+0

Spero che la mia domanda sia migliore ora. – Flo

+0

Dai un'occhiata ai commenti di Facebook Messanger su Google Play. Per alcune persone non funziona, potrebbe avere qualcosa a che fare con tutti quei TouchWizzes e HTC Senses ... –

risposta

4

This è un esempio minimo, semplice, e generale di un galleggiante "chathead" overlay in stile.

utilizza il seguente codice per rendere le cose float:

windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); 
chatHead = new ImageView(this); 
chatHead.setImageResource(R.drawable.floating); 
final 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); 

La fonte sorgente completo può essere trovato here (sotto la licenza Apache).

2

So che la sua tardi per inviare la risposta, mi post lo stesso per le altre persone che stanno cercando la risposta

AndroidFloatingImage

6

codice sorgente completo è qui: http://www.piwai.info/chatheads-basics
Nota: Avrete bisogno <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

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

non funziona genera un'eccezione di autorizzazione – jonney

+0

@ jonney che sembra essere un problema di Android 6. Devi permetterlo esplicitamente nelle impostazioni. – jaytj95

+0

Quindi è necessario chiedere un'autorizzazione SYSTEM_ALERT_WINDOW. Il programma di installazione del pacchetto si blocca nel momento in cui chiedo il permesso di runtime. Come posso evitare questo? –

2

C'è una biblioteca per che se si vuole Messenger come comportamento: Bubbles.

Se si preferisce implementarlo, guardare Window Manager come altri suggeriscono. Puoi anche dare un'occhiata al codice sorgente di Bubbles per essere ispirato.

0

Ogni attività, il dialogo e il servizio sono collegati con una finestra. Facebook mantiene un servizio in esecuzione in background e nel servizio che recuperano gestore oggetti finestra

windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

Creare layout Parametri necessario nell'inserire la tua vista

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

Ora aggiungere l'immagine per window manager seguendo metodo

windowManager.addView(yourView, params); 
Problemi correlati