2013-04-12 6 views
215

FacebookはどのようにAndroidでチャットヘッドを作成していますか?他のすべてのビューの上にフローティングビューを作成するAPIとは何ですか?チャットヘッドの作成にFacebookが使用しているAndroidのAPIは何ですか?

+6

も「ヘッズチャット」しているこのアプリ https://play.google.com/store/apps/details?id=com.ninja.sms – Oli

+11

あなたが例を探しているなら、見HTTPS ://github.com/marshallino16/FloatingNotification – marshallino16

+5

デモと簡単なライブラリはhttps://github.com/ericbhatti/floatiesにあります。このライブラリを使用すると、わずか2行でフローティングウィンドウを作成できます。 –

答えて

210

Thisいずれか

は、アプリケーションが他のすべてのアプリケーションの上に示されたタイプ TYPE_SYSTEM_ALERTを使用してウィンドウを開くことができます。 このアクセス許可を使用するアプリケーションはごくわずかです。これらのウィンドウは、ユーザーとのシステムレベルの対話のために となっています。

定数値: "android.permission.SYSTEM_ALERT_WINDOW"

// EDIT: 完全なコード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); 
    } 
} 

は何とかサービスを開始することを忘れないでください:

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

..このサービスをマニフェストに追加します。

+4

もっと奇妙なことがあると思います。 "頭"の外での入力とドラッグ可能性の扱いはどうでしょうか?私はあなたが少なくともウィンドウ属性を更新するいくつかの巧妙なロジックと同様に[FLAG_NOT_TOUCH_MODAL](http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_NOT_TOUCH_MODAL)を必要としていると思う、それを動かす)あなたがそれをドラッグしている間。 – Delyan

+2

そのチャットヘッドを削除するには? –

+6

フローティングUIを作成するために開発したSDKについて言及する価値はあると思っています:www.tooleap.com – Arik

50

一般に、Androidのアクティビティは全画面表示の概念的に専用のUIで、すべてのやり取りを行います。これにはいくつかの例外があります。まず、画面いっぱいにないポップアップダイアログがあります。もう1つはAndroidトーストで、非インタラクティブなポップアップです。手を触れることはできません。試してみると、下にあるものに移動します。

独自の特別なUIも使用できます。タイプフラグを指定して、直接ビューをWindowManagerに追加することができます。チャットヘッドはおそらくTYPE_PHONEを使用します。いくつかの似たタイプがありますが、目的は同じです:親アプリケーションが存在していない状態で他のものの上に表示される特別な目的のオーバーレイです。

これは、これまでのところ、インタラクションの問題が原因で、これまでのところしかできません。最初は、オーバーレイがすべての相互作用を吸収するため、ヘッドがイベントを取得するだけでなく、下のすべてのものとのやりとりをブロックします。

LayoutParamsを使用してこの動作を構成します。 FLAG_NOT_TOUCH_MODALは、表示領域外のイベントが基になるUIに移動することを意味します。あなたは今、それが動作するが、それ以外の悪いことは、バック/メニューボタンがアプリケーションに向けられず、キーボードもないように起こることがわかります。それを解決するにはFLAG_NOT_FOCUSABLEが必要です。

非フォーカスビットからも副作用があります。オーバーレイとのやりとりはこれ以上ありません。ボタンを押す。あなたはいつも数学をすることができるいくつかの基本的なタッチイベントを得ることができます、それはおそらくチャットヘッドのために十分です。 UIアニメーションのような多くの領域であなた自身を残すことに気をつけてください。

選択的な対話の消費を許可するなど、詳細の概要はthis StackOverflow threadにあります。特に、回答リンクの1つでは、最終的にhereになります。これは、良いサンプルプロジェクトです。 ICSはこの仕組みを少し変えましたが、スレッドによってそのことが説明されています。

これはすべて公開APIのものですが、当然のことながら主流のようには見えません。ドキュメンテーションは、特別なシステムアプリの動作を参照していますが、その理由は十分です。もし誰もがそれをしたらどうしますか?

+0

これらのビューで何らかの向きの変更をブロックできますか?基本的なアクティビティが方向を切り替える場合、私の視点も方向を変えます。 –

+1

いいえ。オリエンテーションの変更は、アクティビティだけでなく、デバイス全体に適用されます。 –

7

Springy headsは、チャットヘッドのバナーベースの動作をそのままの状態で提供します。定義しなければならないのは、チャットヘッドがクリックされたときにチャットヘッドとフラグメントがオープンできるドロアブルだけです。最小化するとチャットヘッドが崩壊し、ドラッグされたときに指に従います。

プロジェクトには、すべての組み込み機能を示すデモアプリケーションが含まれています。これを使用するには、これをgradleの依存関係に追加する必要があります。

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

こんにちは@KiranKumar、あなたは非常に明確なライブラリを作成しました..私はそれを愛しています..私はこのライブラリからさまざまな側面を学びたいと思っています..私はアプリケーションウィンドウの外でそれを実行しようとしています、しかし、問題は、アプリのウィンドウの外でチャットヘッドをクリックすると発生します。フラグメントが開いてjava.lang.OutOfMemoryErrorを返すことができなくなります。あなたの側から可能な場合これで私に何らかの方法を与えることができます..それは喜んで敬意を表します。 – arraystack

+0

@arraystackこれでサービスで実行できます。 GitHubリポジトリのブランチであればリストを確認してください –

+0

@KiranKumarありがとうございました。新しいlibの問題は、マシュマロバージョンのアプリケーションを引き出す許可です – arraystack

関連する問題