1. 程式人生 > >通過WindowManager建立視窗

通過WindowManager建立視窗

概要

視窗(Window)的概念平時並不是很常用,但有時候我們需要建立一個懸浮窗,這時候就需要使用Window來實現,通過WindowManager來新增一個Window,Window是一個抽象的概念,以View的形式存在。

WindowManager類

WindowManager正如其名,是外界訪問Window的入口。WindowManager提供了三個方法。

addView()方法

public void addView(View view, ViewGroup.LayoutParams params)
新增view到視窗
- view:需要新增到視窗的view
- params:用於配置建立的視窗資訊

    //在安卓6.0及以後需要判斷是否具有許可權(是否允許應用出現在其他應用之上)
    if (Build.VERSION.SDK_INT >= 23) {
        //如果已勾選“出現在其他應用之上”
        if (Settings.canDrawOverlays(MainActivity.this)) {
            showFloatView();
        } else {
        //否則進入開啟許可權介面有使用者手動授權
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
            startActivity(intent);
        }
    } else
{ showFloatView(); } void showFloatView(){ //這裡以建立一個懸浮的ImageView為例 ImageView floatView = new ImageView(this); floatView.setImageResource(R.drawable.img_1); //建立一個WindowManager物件 WindowManager windowManager = (WindowManager) getApplication().getSystemService(getApplication().WINDOW_SERVICE); //使用LayoutParams配置視窗資訊,這裡直接在構造方法中設定,也可以建立後設置
WindowManager.LayoutParams params = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, //設定視窗大小,此處為包裹內容 WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_PHONE, //懸浮在所有視窗之上 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, //不獲取焦點 PixelFormat.TRANSLUCENT); //透明? params.gravity = Gravity.TOP | Gravity.LEFT; //設定視窗對齊方式 params.x = 0; params.y = 100; windowManager.addView(floatView, params); //顯示視窗,對應為removeView() }

removeView()方法

public void removeView(View view)
從視窗移除view

updateViewLayout()方法

public void updateViewLayout(View view, ViewGroup.LayoutParams params)
更新view的顯示。

通常需要監聽view的觸控事件,獲取座標等資料,然後在params變數中重新填充資料,呼叫此方法更新即可。

ViewGroup.LayoutParams類

  • 常用flag
    • FLAG_NOT_FOCUSALBE:不獲取焦點,同時會啟用FLAG_NOT_TOUCH_MODAL。
    • FLAG_NOT_TOUCH_MODAL:開啟後系統會將window區域之外的點選事件傳遞給底層的window,區域之內由自己處理,一般需要開啟,否則無法響應單擊事件。
    • FLAG_SHOW_WHEN_LOCKED:讓window顯示在鎖屏介面上。
  • x、y:視窗顯示的位置
  • width、height:視窗的寬高
  • gravity:視窗顯示的對齊方式
  • type:視窗型別
  • format:The desired bitmap format. May be one of the constants in PixelFormat. Default is OPAQUE.(不是很理解,暫時把原話搬過來)