質問

私はそれをグーグルで試してみましたが、直接的なカットの答えはありません。

開発者のウェブサイトの定義も明確ではありません:

アプリがウィンドウマネージャーと通信するために使用するインターフェイス。使用する Context.getSystemService(Context.WINDOW_SERVICE) これらのいずれかを取得します。

平凡な6年生の英語を持っている人がそれが何であるかを説明できますか?

そして、それを使用して、一方から他方に移動したとしても、いくつかのアクティビティを介して残るフローティングオブジェクトを作成するにはどうすればよいですか?

役に立ちましたか?

解決

Android WindowManagerはシステムサービスであり、Windowsが表示されているWindowsのZオーダー付きリストと画面上のレイアウトの管理を担当します。とりわけ、アプリを開設または閉じたり、画面を回転させたりするときに、ウィンドウの遷移とアニメーションを自動的に実行します。

すべてのアクティビティには、画面にコンテンツを表示するために使用されるウィンドウがあります。アクティビティでsetContentViewを呼び出すと、アクティビティのデフォルトウィンドウにそのビューを添付します。デフォルトのウィンドウが画面に入力されるため、アクティビティのウィンドウが他のアクティビティを隠すようになります。ウィンドウマネージャーには、上部にあるウィンドウが表示されます。したがって、通常、Windowsについて心配する必要はありません - アクティビティを作成するだけで、Androidはあなたのために残りをします。

ただし、画面に入らないフローティングウィンドウを作成するなど、異常なことをしたい場合は、WindowManagerと対話する必要があります。他のアプリケーションの前で見えるフローティングウィンドウを作成する場合、別のアプリが前景に来るとアクティビティが停止し、その窓が隠されたり破壊されたりするため、アクティビティを使用することはできません。代わりに、バックグラウンドサービスからウィンドウを表示する必要があります。例えば:

WindowManager.LayoutParams p = new WindowManager.LayoutParams(
    // Shrink the window to wrap the content rather than filling the screen 
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    // Display it on top of other application windows, but only for the current user
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
    // Don't let it grab the input focus
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    // Make the underlying application window visible through any transparent parts
    PixelFormat.TRANSLUCENT);

// Define the position of the window within the screen
p.gravity = Gravity.TOP | Gravity.RIGHT;
p.x = 0;
p.y = 100;

WindowManager windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
windowManager.addView(myView, p);

これが機能するには、AndroidManifest.xmlに次の許可を追加する必要があります

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

他のヒント

Android APIバージョン> 23の場合、 android.permission.SYSTEM_ALERT_WINDOW ランタイムを要求する必要があります。さらに、 TYPE_SYSTEM_ERROR そして、いくつかのいくつかのタイプがAndroid API 26で非難されています。

public void showWindowManager() {
    if (requestPermission()) {
        return;
    }

    WindowManager.LayoutParams p =
            new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    Build.VERSION.SDK_INT > Build.VERSION_CODES.O
                            ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
                            : WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                    PixelFormat.TRANSLUCENT);


    final WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    LayoutInflater layoutInflater =
            (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
    final View popupView = layoutInflater.inflate(R.layout.window_manager_layout, null);
    windowManager.addView(popupView, p);

    // dismiss windowManager after 3s
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            windowManager.removeView(popupView);
        }
    }, 3000);
}

@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
        if (Settings.canDrawOverlays(this)) {
            showWindowManager();
        }
    }
}

public boolean requestPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
            return true;
        }
    }
    return false;
}

Window Managerは画面を整理し、どこに行くべきか、どのように階層化されるべきかを処理します。

これは、フローティングオブジェクトの優れたオープンソースの例です。フローティングオブジェクトの例

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top