web-dev-qa-db-ja.com

Facebookはチャットヘッドの作成にAndroidのどのAPIを使用していますか?

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

221
Daniel A. White

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

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

213
Waza_Be

原則として、Androidアクティビティはフルスクリーンであり、すべての操作を行う概念的に専用のUIです。これにはいくつかの例外があります。まず、画面いっぱいに表示されないポップアップダイアログがあります。もう1つはAndroidトーストです。これは非対話型のポップアップです-タッチすることはできず、試してみると下にあるものに移動します。

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

ただし、相互作用に問題があるため、ここまでの説明で終わります。最初は、オーバーレイがすべてのインタラクションを吸収するため、頭がイベントを取得するだけでなく、その下のすべてに対するインタラクションをブロックします。

LayoutParams を使用してこの動作を設定します。 FLAG_NOT_TOUCH_MODALは、表示領域外のイベントが基になるUIに送られることを意味します。これで動作するようになりましたが、戻る/メニューボタンがアプリにリダイレクトされず、キーボードがないなど、他の悪いことがまだ発生しています。これを解決するには、FLAG_NOT_FOCUSABLEが必要です。

フォーカスできないビットからも副作用が発生します。これは、オーバーレイとのニース相互作用ではなくなります。ボタンを押します。ただし、いくつかの基本的なタッチイベントを取得できます。これらのイベントではいつでも数学を実行でき、チャットヘッドにはおそらくこれで十分です。 UIアニメーションなどの多くの領域で、自分で作業を行うことができます。

選択的なインタラクションの消費を許可するなど、詳細の概要は このStackOverflowスレッド にあります。特に、回答リンクの1つが最終的に here になります。これは良いプロジェクト例です。 ICSはこれが少し動作する方法を変更したことに注意してくださいが、スレッドはそれを説明しています。

これはすべてパブリックAPIのものですが、当然のこととして、実際に行うべき主流のようには見えません。ドキュメントには、特別なシステムアプリの動作への参照があり、十分な理由があります。誰もがそれをした場合はどうなりますか?

50
Rob Pridham

Springy heads は、すぐに使用できるチャットヘッドのスプリングベースの動作を提供します。定義する必要があるのは、チャットヘッドのドロウアブルと、チャットヘッドがクリックされると開くフラグメントのみです。チャットヘッドは最小化すると折りたたまれ、ドラッグすると指に従います。

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

compile 'com.flipkart.springyheads:library:0.9.6'
7
Kiran Kumar