2013-04-13 8 views
33

他のアプリで表示できるアプリのポップアップオーバーレイを実装するにはどうすればよいですか。Androidのほかのアプリで表示できるポップアップオーバーレイを実装する方法

Facebookは、新しいFacebook MessangerバージョンでChatheadsと非常によく似た機能を実装しました。私はこれがいくつかの可能性を見て本当に驚いた。画像では、別のアプリでチャットヘッド(右の犬)が見えます。

Facebook Messanger's Chathead over other app

+0

これは正当な質問だと思います。一部の人にとっては、それはあまり言い表せないかもしれません。質問を言い換えると、Facebook Messenger自体ではなくアプリの画面ポップアップオーバーレイにもっと焦点を当てるようになります。また、スクリーンショットはコンテキストを与えるのがいいです。 –

+0

私の質問がより良くなることを願っています。 – Flo

+0

Google PlayのFacebook Messangerのコメントをご覧ください。一部の人にとって、それは動作しません、それはすべてのそれらのTouchWizzesとHTC Sensesと関係があるかもしれません... –

答えて

4

This浮動 "chathead" スタイルオーバーレイの、最小限のシンプル、かつ一般的な例です。

それは物事がフロートにするために、次のコードを使用しています:

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

完全なソースソースはhere(Apacheライセンスの下で)見つけることができます。

2

私が知っているその答えを投稿して後半に、私は答えを求めている他の人々

AndroidFloatingImage

6

完全なソースコードはここにあるため、とにかくそれを投稿します:http://www.piwai.info/chatheads-basics
注:必要になります:あなたは行動のようにMessengerをしたい場合は、そのためのライブラリがあります<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

doesnt仕事。 Android 6の問題と思われる許可例外 – jonney

+0

@ jonneyが生成されます。これを明示的に設定で許可する必要があります。 – jaytj95

+0

したがって、SYSTEM_ALERT_WINDOW権限を要求する必要があります。ランタイムパーミッションを尋ねる瞬間、パッケージインストーラがクラッシュします。どうすればこの問題を回避できますか? –

2

が必要。

自分で実装することをお望みならば、他の人が示唆するようにウィンドウマネージャーを見てください。インスピレーションを得るには、Bubblesのソースコードもご覧ください。

0

すべてのアクティビティ、ダイアログ、サービスはウィンドウに添付されています。 Facebookは、バックグラウンドで実行されているサービスを維持し、サービスに彼らは

windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

によってウィンドウマネージャのオブジェクトをフェッチレイアウトのparamsは現在、以下のことにより、ウィンドウマネージャにビューを追加するには、ビューを追加しながら

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

を必要として作成します。方法

windowManager.addView(yourView, params); 
関連する問題