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
、ステータス バーとナビゲーション バーを含む画面全体をカバーします。つまり、ステータス バー、画面、およびナビゲーション バーのサイズを見つける必要があります (必要な値を取得したら、必要な値を計算できます)。height
xPos
yPos
ステータスバーの高さを見つけましたか? - 最良の答えは
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 で方向の変化を監視する方法を参照してください。
それが誰かの助けになることを願っています-どうか、それらの最後の部分を必死に探してください.