eaglesakuraの技術ブログ

技術的な話題とか、メモとか。

システムレイヤーにOpenGL対応Viewを追加する

Manifest設定

  • システムレイヤーへの描画は専用のPermissionがある
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

WindowManagerでViewを登録

  • レンダリング用のViewとタップ用のViewを分けると設計が楽になる場合がある
    • SurfaceViewは軽量だが、View移動ができない
      • OpenGL側でViewportを調整してあげると良い
    • Viewを移動するならTextureViewが良い
// レンダリング用のフラグ
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        // レイアウトの幅 / 高さ設定
        WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT,
        // レイアウトの挿入位置設定
        WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
        // ウィンドウ属性
        // TextureViewを利用するには、FLAG_HARDWARE_ACCELERATED が必至となる。
        WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
                //
                | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
                | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
                | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_FULLSCREEN
        ,
        // 透過属性を持たなければならないため、TRANSLUCENTを利用する
        PixelFormat.TRANSLUCENT);
// Viewの位置はmarginで調整する
params.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;


windowManager.addView(hogeView, params);
// システムレイヤーのView位置を移動する
WindowManager.LayoutParams params = (WindowManager.LayoutParams) hogeView.getLayoutParams();
synchronized (updateRunner) {
    params.x = reqX;
    params.y = reqY;
    params.width = reqW;
    params.height = reqH;
}
windowManager.updateViewLayout(hogeView, params);