0

今日、ナビゲーション バー (または戻る、ホームなどがあるソフトキー) を含む画面全体をオーバーレイするアプリを見ました。chainfire による CF.Lumen (android 4.4+ が必要) です。

これは一般的なアプローチでは不可能であり、多くのSOの回答が私に言ったことを思い出しました。そこで、Lumens apk(sorry chainfire) から smali コードを調べました。0x7d6型指定子として見つかったのはTYPE_SYSTEM_OVERLAY. 一般に、これによりビューがロック画面の上にオーバーレイされます。見栄えは良いですが、ナビゲーション バー領域をオーバーレイしません。ロック画面でも。に置き換えMATCH_PARENTました9999が、それでもナビゲーションバー領域をオーバーレイしません。

Android のソース コードを調べたところ、文書化されていない型がさらに多くあることに興味深いことがわかりました。

FIRST_SYSTEM_WINDOW = 2000;

TYPE_NAVIGATION_BAR = FIRST_SYSTEM_WINDOW+19;

TYPE_BOOT_PROGRESS = FIRST_SYSTEM_WINDOW+21;

これらをアプリに適用しましたが、許可が拒否されたというクラッシュが発生しました。INTERNAL_SYSTEM_WINDOWOR よりも文書化されていないものが必要ですSYSTEM_ALERT_WINDOW。これらのアクセス許可は、システム アプリに対してのみ付与されます。

これは、ナビゲーションバー領域を除く画面全体を埋めるビューを追加する私のコードです。

それを達成するにはどうすればよいですか?(ナビゲーションバー領域を含むオーバーレイを作成します)

final WindowManager.LayoutParams paramsRL = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
                    | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                    | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
            PixelFormat.TRANSLUCENT);
windowManager.addView(view_floating, paramsRL);
4

2 に答える 2

2

動作する小さな例を次に示します。

    FrameLayout frameLayout = new FrameLayout(context);
    frameLayout.setBackgroundColor(Color.BLACK);
    frameLayout.setAlpha(0.5f);

    windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                    | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                    | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
                    | WindowManager.LayoutParams.FLAG_FULLSCREEN
                    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
            PixelFormat.TRANSLUCENT);

    //make sure height includes the nav bar size (get the dimension of whole screen)
    params.height = screenHeight;
    params.width = screenWidth;
    windowManager.addView(frameLayout, params);

    //add your view to this frameLayout
    frameLayout.addView(....);

ここで重要なことは次の 3 つです。

  1. 画面全体にコンテンツを表示できる TYPE_SYSTEM_OVERLAY (または同様のタイプ)。

  2. FLAG_LAYOUT_NO_LIMITS により、許可されている通常のサイズを超えることができます。

  3. ソフトキーの背後でカバーするために必要な追加の高さを設定します。主な問題は、パラメーターを match_parent に設定したときに、画面の高さからナビゲーション バーを差し引いた値に設定されることでした。余分な高さを設定すると、問題が解決します。

于 2016-03-05T18:14:15.767 に答える