FacebookはAndroidでチャットヘッドをどのように作成しますか?他のすべてのビューの上にフローティングビューを作成するAPIとは何ですか?
これ one:
他のすべてのアプリケーションの上に表示されるタイプTYPE_SYSTEM_ALERTを使用して、アプリケーションがウィンドウを開くことを許可します。この許可を使用するアプリケーションはほとんどありません。これらのウィンドウは、ユーザーとのシステムレベルの対話を目的としています。
定数値: "Android.permission.SYSTEM_ALERT_WINDOW"
//編集:完全なコード 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));
..そして、このサービスをマニフェストに追加します。
原則として、Androidアクティビティはフルスクリーンであり、すべての操作を行う概念的に専用のUIです。これにはいくつかの例外があります。まず、画面いっぱいに表示されないポップアップダイアログがあります。もう1つはAndroidトーストです。これは非対話型のポップアップです-タッチすることはできず、試してみると下にあるものに移動します。
独自の特別なUIも実行できます。型フラグを指定して、WindowManager
にビューを直接追加できます。チャットヘッドはおそらく TYPE_PHONE を使用します。いくつかの類似したタイプがありますが、目的は同じです。親アプリケーションが明らかに存在しなくても、他の何かの上に表示できる特別な目的のオーバーレイ。
ただし、相互作用に問題があるため、ここまでの説明で終わります。最初は、オーバーレイがすべてのインタラクションを吸収するため、頭がイベントを取得するだけでなく、その下のすべてに対するインタラクションをブロックします。
LayoutParams を使用してこの動作を設定します。 FLAG_NOT_TOUCH_MODAL
は、表示領域外のイベントが基になるUIに送られることを意味します。これで動作するようになりましたが、戻る/メニューボタンがアプリにリダイレクトされず、キーボードがないなど、他の悪いことがまだ発生しています。これを解決するには、FLAG_NOT_FOCUSABLE
が必要です。
フォーカスできないビットからも副作用が発生します。これは、オーバーレイとのニース相互作用ではなくなります。ボタンを押します。ただし、いくつかの基本的なタッチイベントを取得できます。これらのイベントではいつでも数学を実行でき、チャットヘッドにはおそらくこれで十分です。 UIアニメーションなどの多くの領域で、自分で作業を行うことができます。
選択的なインタラクションの消費を許可するなど、詳細の概要は このStackOverflowスレッド にあります。特に、回答リンクの1つが最終的に here になります。これは良いプロジェクト例です。 ICSはこれが少し動作する方法を変更したことに注意してくださいが、スレッドはそれを説明しています。
これはすべてパブリックAPIのものですが、当然のこととして、実際に行うべき主流のようには見えません。ドキュメントには、特別なシステムアプリの動作への参照があり、十分な理由があります。誰もがそれをした場合はどうなりますか?
Springy heads は、すぐに使用できるチャットヘッドのスプリングベースの動作を提供します。定義する必要があるのは、チャットヘッドのドロウアブルと、チャットヘッドがクリックされると開くフラグメントのみです。チャットヘッドは最小化すると折りたたまれ、ドラッグすると指に従います。
プロジェクトには、すべての組み込み機能を示すデモアプリが含まれています。これを使用するには、これをgradle依存関係に追加する必要があります。
compile 'com.flipkart.springyheads:library:0.9.6'