0

Java アプリ (API 23) があります。その中に と がMainActivityありAccessibilityServiceます。AccessibilityService では:

@Override
public void onServiceConnected() {
    oView = new LinearLayout(this);
    oView.setBackgroundColor(0x88ff0000); // The translucent red color
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            width,
            height,
            xPos, yPos,
            WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE |
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
                    WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            PixelFormat.TRANSLUCENT
    );
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    wm.addView(oView, params);
} 

を調整する必要があるのでwidth、ステータス バーとナビゲーション バーを含む画面全体をカバーします。つまり、ステータス バー、画面、およびナビゲーション バーのサイズを見つける必要があります (必要な値を取得したら、必要な値を計算できます)。heightxPosyPos

ステータスバーの高さを見つけましたか? - 最良の答えは

ViewCompat.setOnApplyWindowInsetsListener(rootView, new OnApplyWindowInsetsListener() {
                @Override
                public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) {
                    //THIS is the value you want.
                    int statusBarHeight = insets.getSystemWindowInsetTop();
                    int navigationBar = insets.getSystemWindowInsetBottom();

                    // Let the view handle insets as it likes.
                    return ViewCompat.onApplyWindowInsets(v, insets);
                }
            });

しかしrootView、アクティビティが表示される保証はないので、何を使用できますか? そして、ビューの作成onServiceConnected()を内部から移動する必要がありonApplyWindowInsets()ますか?

これは本当にこれを行うための最良の方法ですか?

上記について心に留めておくべきフォローアップの質問 - 上記とそれがそれらにも答えているかどうかに応じて、ここまたは別の質問で尋ねます。

画面が回転するとどうなりますか?ステータス バーやナビゲーション バーが表示されなくなった場合 (たとえば、全画面表示になった場合) はどうなりますか? それを処理し、高さを読み直して、ビューを再作成する必要があるようです。それを行う方法についての考えやガイダンスは大歓迎です。

=== 更新 - これまでの進捗状況 ===

画面サイズとステータス バーに関する情報 (サイズ、場所) だけが必要だと思っていましたが、ナビゲーション バーが画面の左側にある場合があるため、それが必要であり、キーボードも影響を与える可能性があります。

で画面サイズを取得できます

    Display myDisplay = wm.getDefaultDisplay();
    Display.Mode mode = myDisplay.getMode();
    int height = mode.getPhysicalHeight();
    int width = mode.getPhysicalWidth();

私はまださまざまな場所とサイズに取り組んでいます。ビューを作成してからインセットを読み取ろうとしましたが、間違った答えが得られました。したがって、より良い答えが得られない限り、おそらく使用する必要があります

    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }

しかし、ステータス バーが非表示になっていると、場合によっては間違った回答が返される可能性があり、画面上のどこにあるのかわかりません。私はまだそれに取り組んでいます。試してみることがいくつかあるので、見てみましょう。

サービスで回転を処理するには、onConfigurationChanged()を使用します。サービスを使用して Android で方向の変化を監視する方法を参照してください。

それが誰かの助けになることを願っています-どうか、それらの最後の部分を必死に探してください.

4

1 に答える 1