すべての上にビューを描くにはどうすればいいですか? 質問する

すべての上にビューを描くにはどうすればいいですか? 質問する

現在表示されているものの上に画面上に通知を作成できるアプリを作成したいと考えています。Go SMS メッセージ ポップアップのようなもの、または次の図の ChatHead のようなもの:

ここに画像の説明を入力してください

タッチイベントを含めて動的に描画できればさらに良いでしょう。これを行う従来の標準的な方法は何ですか?

例:

ホーム画面、アプリドロワー、その他のアプリのいずれの場合でも、クリックしたりドラッグしたりできるアイコンのようなものです。投稿された画像の画面の端近くにある円形のアイコンに注目してください。どのアプリでもどこにでもドラッグできます。

ベストアンサー1

Toast やダイアログ ウィンドウなどの動作は次のとおりです。

追加または最前面に持ってくるだけでは機能しない場合、たとえば、サービスが別のクライアント アクティビティまたはアプリケーションに独自のビューを追加する場合 (FaceUnlock はこれを行います)、または階層に依存できない場合は、ウィンドウ マネージャーとウィンドウ トークンを使用する必要があります。その後、レイアウトを作成し、以前と同じようにアニメーションとハードウェア アクセラレーションを利用できます。

    WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);

    WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(WindowManager.LayoutParams.FIRST_SUB_WINDOW);
    layoutParams.width = 300;
    layoutParams.height = 300;

    layoutParams.format = PixelFormat.RGBA_8888;
    layoutParams.flags =
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED;
    layoutParams.token = getWindow().getDecorView().getRootView().getWindowToken();

    //Feel free to inflate here
    mTestView = new View(this);
    mTestView.setBackgroundColor(Color.RED);

    //Must wire up back button, otherwise it's not sent to our activity
    mTestView.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                onBackPressed();
            }
            return true;
        }
    });
    windowManager.addView(mTestView, layoutParams);

その後、onDestroy(またはonPause)でビューを削除してください。そうしないとクラッシュします。

   if (mTestView != null) {
       WindowManager windowManager = (WindowManager) getBaseContext().getSystemService(Context.WINDOW_SERVICE);
       if (mTestView.isShown()) {
            windowManager.removeViewImmediate(mTestView);
       }
   }

おすすめ記事