windowmanager的奇技淫巧

android界面編程方面有兩大核心,一個是View代表的界面元素,一個是WindowManager代表的界面管理.前者為卒子,后者為將帥.

基礎(chǔ)

一切view,在界面最終以Window形式展現(xiàn),被WindowManager管理.

WindowManager提供有三個方法:添加View别智、更新View和刪除View.

   public void addView(View view, ViewGroup.LayoutParams params);  
    public void updateViewLayout(View view, ViewGroup.LayoutParams params);  
    public void removeView(View view);  

View的展現(xiàn)規(guī)則封裝在LayoutParams中,其內(nèi)部屬性見:

WindowManager.LayoutParams詳解

LayoutParams 主要的幾個屬性

flag

標識這個window怎么響應事件,怎樣的一個透明度,以及一些全屏,鎖屏顯示等等.

WindowManager.LayoutParams的各種flag含義

type

類似于前端里的z-index.值越大越在上面.
type的真正含義: 類型-->根據(jù)值的范圍將window分成三大類:

  • 系統(tǒng)級窗口(System windows):
    ranging from FIRST_SYSTEM_WINDOW to LAST_SYSTEM_WINDOW 2000-2999
    可以在任何地方顯示
  • 應用級窗口(Application windows):
    ranging from FIRST_APPLICATION_WINDOW to LAST_APPLICATION_WINDOW 1-99
    典型的: activity
  • 子窗口(Sub-windows):
    ranging from FIRST_SUB_WINDOW to LAST_SUB_WINDOW 1000-1999
    必須依附于某一個應用級窗口

WindowManager.LayoutParams.type的使用
WindowManager.LayoutParams.type屬性

系統(tǒng)內(nèi)置的窗口實現(xiàn)

  • popupwindow
  • dialog
  • activity
  • toast
  • notification

系統(tǒng)級窗口,6.0以前的權(quán)限

一般來說,彈出系統(tǒng)級窗口需要申請android.permission.SYSTEM_ALERT_WINDOW權(quán)限,
但是,TYPE_TOAST雖然是系統(tǒng)級窗口,不用申請
然而,國產(chǎn)rom,比如MIUI,會強制要求申請此權(quán)限,更鬧心的是,還默認關(guān)閉這個權(quán)限.
所以,需要兼顧6.0以前的權(quán)限申請,以及適配:

https://github.com/hss01248/FloatWindowPermission

奇技淫巧

需求1

在屏幕上顯示一個浮動控件。需要能接收點擊事件入挣,還要能顯示在statusBar(狀態(tài)欄)之上护姆,不能被狀態(tài)欄遮住

來自 WindowManager的那些蛋疼的事

            WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
            |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
            | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
            PixelFormat.TRANSLUCENT);

需求2

偷偷地拍照:

  • 思路1:彈出一個透明的activity,這個activity還要能夠不攔截任何事件,屏幕的所有觸摸都要能夠傳遞到下層activity.
    攔路虎: 對activity的許多flag設(shè)置會無效,主要是activity無法設(shè)置不攔截事件.
  • 思路2: 彈出一個type = TYPE_TOAST的窗口,1平方像素.

代碼庫見此: https://github.com/hss01248/HiddenCamera

核心代碼:

        final WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);

        PhotoCallback callback2 = new PhotoCallback() {
            @Override
            public void onFail() {
                callback.onFail();
                windowManager.removeView(page.getRootView());
            }

            @Override
            public void onSuccess(String path) {
                callback.onSuccess(path);
                windowManager.removeView(page.getRootView());
            }
        };
        page.setCallback(callback2);
      WindowManager.LayoutParams params =  new WindowManager.LayoutParams();//dialog.getWindow().getAttributes();
        params.type = WindowManager.LayoutParams.TYPE_TOAST;
        params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                |WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                |WindowManager.LayoutParams.FLAG_DIM_BEHIND//后面變暗
                |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
        params.width = WindowManager.LayoutParams.WRAP_CONTENT;
        params.height = WindowManager.LayoutParams.WRAP_CONTENT;
        params.gravity = Gravity.LEFT| Gravity.TOP;
        params.dimAmount = 0;//后面變暗區(qū)域透明...
        windowManager.addView(page.getRootView(),params);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锈候,一起剝皮案震驚了整個濱河市继低,隨后出現(xiàn)的幾起案子黑界,更是在濱河造成了極大的恐慌勉失,老刑警劉巖羹蚣,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乱凿,居然都是意外死亡顽素,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門徒蟆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胁出,“玉大人,你說我怎么就攤上這事后专』耄” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵戚哎,是天一觀的道長裸诽。 經(jīng)常有香客問我,道長型凳,這世上最難降的妖魔是什么丈冬? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮甘畅,結(jié)果婚禮上埂蕊,老公的妹妹穿的比我還像新娘。我一直安慰自己疏唾,他們只是感情好蓄氧,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著槐脏,像睡著了一般喉童。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上顿天,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天堂氯,我揣著相機與錄音,去河邊找鬼牌废。 笑死咽白,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的鸟缕。 我是一名探鬼主播晶框,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了三妈?” 一聲冷哼從身側(cè)響起畜埋,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤莫绣,失蹤者是張志新(化名)和其女友劉穎畴蒲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體对室,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡模燥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了掩宜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蔫骂。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖牺汤,靈堂內(nèi)的尸體忽然破棺而出辽旋,到底是詐尸還是另有隱情,我是刑警寧澤檐迟,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布补胚,位于F島的核電站,受9級特大地震影響追迟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一窗悯、第九天 我趴在偏房一處隱蔽的房頂上張望娜亿。 院中可真熱鬧,春花似錦廓块、人聲如沸厢绝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昔汉。三九已至,卻和暖如春浓利,著一層夾襖步出監(jiān)牢的瞬間挤庇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工贷掖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嫡秕,地道東北人。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓苹威,卻偏偏與公主長得像昆咽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

推薦閱讀更多精彩內(nèi)容