Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android FakeWindow的小應用大用途

android FakeWindow的小應用大用途

編輯:關於Android編程

android FakeWindow的小應用大用途

 

在windowmanager裡面有一個FakeWindow,仔細一看也就是一個透明的應用覆蓋到屏幕的最前端,這樣有什麼好處呢?首先我們還是從應用的需求來看這個問題。在android系統裡不管是手機還是平板,狀態欄一般都是在的,導航欄在有些設備裡面是沒有的,因為android需要的那些HOMEBACKMENUSERCACH可能已經做在觸摸屏上,或者是其他一些低成本的觸摸小按鍵上或者硬按鍵上,但是也有很多機器是沒有這些的,那麼就需要一個導航欄了,這樣前期背景就清楚了。

有了導航欄跟狀態欄,好是好,特別是導航欄占屏幕位置啊,在一些需要大屏幕或者全屏的應用中,導航欄跟狀態欄顯得又是那麼礙眼,比如看圖片的時候、看電影的時候,一般來說都希望能夠完全占領屏幕,這樣看效果好一些。要想效果好,就得有方法是不是,當然是。我們知道導航欄跟狀態欄屬於systemui的范疇,要占領他們的位置,得跟他們好好商量一下吧,還好有windowsmanager的policy來協調。具體位置:

 

 

android rameworksasepolicysrccomandroidinternalpolicyimplPhoneWindowManager.java,怎麼申請全屏的設計很簡單,筆者在去年的博文中介紹過,需要看的看看這個【SystemUI中狀態欄跟導航欄隱藏顯示控制方法及效果示例】鏈接:http://blog.csdn.net/edsam49/article/details/11819209

當你申請了全屏時,phoneWindowsmanager會給給系統加一個FakeWindow來接受觸摸屏的輸入事件,不限於觸摸屏啊,如果是按鍵的也能截住這個消息。來看看這個FakeWindow是怎麼添加到系統的,代碼如下:

 

            if (navVisible || navAllowedHidden) {
                if (mHideNavFakeWindow != null) {
                    mHideNavFakeWindow.dismiss();
                    mHideNavFakeWindow = null;
                }
            } else if (mHideNavFakeWindow == null) {
                // add this for navi would show without navigation bar when SYSTEM_UI_FLAG_HIDE_NAVIGATION setted
                if (mFocusedWindow != null) {
                    //Log.i(TAG, ----> chen mFocusedWindow: + mFocusedWindow);
                    final WindowManager.LayoutParams attr = mFocusedWindow.getAttrs();
                    final CharSequence title =  attr.getTitle();
                    if (!needFullScreenNoNavigationBar(title)) {
		                mHideNavFakeWindow = mWindowManagerFuncs.addFakeWindow(
		                        mHandler.getLooper(), mHideNavInputEventReceiverFactory,
		                        hidden nav, WindowManager.LayoutParams.TYPE_HIDDEN_NAV_CONSUMER, 0,
		                        0, false, false, true);
                    }
                }
            }
關鍵的還是mWindowManagerFuncs.addFakeWindow()這個函數來添加的,具體參數可以看看這個函數原型,也很簡單的,具體可在下面這兩個文件中看看:

 

我們在此也大概了解了FakeWindow,也就是在全屏的時候能夠截住事件輸入,在PhoneWindowsmanager裡面這個FakeWindow是一旦收到事件輸入消息就dismiss了,就消去,同時導航欄什麼的該出來就出來了。筆者是在做車載導航產品,我們在倒車的時候,屏幕需要全屏顯示倒車視頻信號,這個信號是覆蓋最上面的,如果倒車的時候你去按屏幕,而這個時候如果不截住這種事件輸入消息,在倒車視頻下面的應用不知道會處理得像上面樣子,反正你就不知道會點到什麼,這樣顯然是不大好的,那我們就需要在處理倒車視頻的把輸入事件給截住,當然有人說那我這時候把觸摸屏驅動裡不往上報數據,那還有按鍵呢?那也有人說那這個時候,我也不報,如果還有走串口協議過來的呢?還有鼠標呢?鍵盤呢?一個個的去截,一個個的去disabled,太累了。有了FakeWindow就方便很多,也就是價格透明窗體來截任何輸入事件,這樣會方便很多,對系統的開銷也不大,幾乎可以忽略不計。

FakeWindow還是很有用處的,希望這個介紹對有些同學有用。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved