Android GUI之Window、WindowManager
通過前幾篇的文章(查看系列文章:http://www.cnblogs.com/jerehedu/p/4607599.html#gui?),我們清楚了Activity實際上是將視圖的創建和顯示交給了Window對象進行了處理并分析了視圖的測量、布局及繪制過程。本篇文章將繼續詳細分析Window及WindowManger的作用。
首先,我們將通過下圖弄清楚他們之間的關系。
通過前幾篇的文章,我們清楚了Activity實際上是將視圖的創建和顯示交給了Window對象進行了處理并分析了視圖的測量、布局及繪制過程。本篇文章將繼續詳細分析Window及WindowManger的作用。
首先,我們將通過下圖弄清楚他們之間的關系。
/** Flag for the "options panel" feature. This is enabled by default. */public static final int FEATURE_OPTIONS_PANEL = 0;/** Flag for the "no title" feature, turning off the title at the top* of the screen. */public static final int FEATURE_NO_TITLE = 1; //無標題欄/** Flag for the progress indicator feature */public static final int FEATURE_PROGRESS = 2; //在標題欄上添加加載進度條/** Flag for having an icon on the left side of the title bar */public static final int FEATURE_LEFT_ICON = 3;/** Flag for having an icon on the right side of the title bar */public static final int FEATURE_RIGHT_ICON = 4;/** Flag for indeterminate progress */public static final int FEATURE_INDETERMINATE_PROGRESS = 5;/** Flag for the context menu. This is enabled by default. */public static final int FEATURE_CONTEXT_MENU = 6;/** Flag for custom title. You cannot combine this feature with other title features. */ public static final int FEATURE_CUSTOM_TITLE = 7; public static final int FEATURE_ACTION_BAR = 8; public static final int FEATURE_ACTION_BAR_OVERLAY = 9; public static final int FEATURE_ACTION_MODE_OVERLAY = 10; public static final int FEATURE_MAX = FEATURE_ACTION_MODE_OVERLAY;/** Flag for setting the progress bar's visibility to VISIBLE */public static final int PROGRESS_VISIBILITY_ON = -1;/** Flag for setting the progress bar's visibility to GONE */public static final int PROGRESS_VISIBILITY_OFF = -2;/** Flag for setting the progress bar's indeterminate mode on */public static final int PROGRESS_INDETERMINATE_ON = -3;/** Flag for setting the progress bar's indeterminate mode off */public static final int PROGRESS_INDETERMINATE_OFF = -4;/** Starting value for the (primary) progress */public static final int PROGRESS_START = 0;/** Ending value for the (primary) progress */public static final int PROGRESS_END = 10000;/** Lowest possible value for the secondary progress */public static final int PROGRESS_SECONDARY_START = 20000;/** Highest possible value for the secondary progress */ public static final int PROGRESS_SECONDARY_END = 30000;那么如何應用這些窗口特征呢?在Activity中,我們可以調用方法requestWindowFeature,實際此方法是調用了Window中的requestFeature的方法,方法原型如下:
public boolean requestFeature(int featureId) {final int flag = 1<<featureId;mFeatures |= flag;mLocalFeatures |= mContainer != null ? (flag&~mContainer.mFeatures) : flag;return (mFeatures&flag) != 0; }注意此方法必須在setContentView方法之前調用才有效,一旦應用了這些窗口特征后續不可更改。
在window中定義了一個CallBack接口,此接口中一定了一系列的時間回調方法,用于處理UI的各種事件,如按鍵事件、觸摸事件、軌跡球、Accessibility事件、菜單事件等等。比如Activity就實現了此接口。關于事件這塊的內容,我們后面專門做分析研究。
在window中還定義了WindowManager,從字面上可以理解為窗口管理器,實際上它并不是真正的窗口管理器,WindowManager Service才是Android中真正意義上的窗口管理器。實際上Window內的WindowManager只是用于管理Window內部的視圖,通過方法setWindowManager,可以看到Window中是如何創建WindowManager的,具體源碼如下:
public void setWindowManager(WindowManager wm, IBinder appToken, String appName,boolean hardwareAccelerated) {mAppToken = appToken;mAppName = appName;mHardwareAccelerated = hardwareAccelerated|| SystemProperties.getBoolean(PROPERTY_HARDWARE_UI, false);if (wm == null) {wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);}mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);}通過該方法我們可以看到通過WindowManagerImpl的createLoaclWindowManager方法創建了一個WindowManager對象。
從上圖中,我們看出WindowManager接口是繼承了ViewManager接口,從源碼中可以看出ViewManager接口只有三個方法,具體如下:
public interface ViewManager {public void addView(View view, ViewGroup.LayoutParams params);public void updateViewLayout(View view, ViewGroup.LayoutParams params);public void removeView(View view); }很好理解主要用于window中view的添加、更新和刪除。
WindowManager接口內容也比較簡單,除了繼承自ViewManager中的方法外,還定義了3個內部類和兩個方法,具體API如下。
在這里我們要重點關注一下LayoutParams這個內部類,此類定義了許多與窗口相關的屬性,比如位置、窗口類型(主要有三類:Application Windows、Sub-windows、System windows)、行為選項標志、窗口透明度等等,在此不再貼源碼了,有興趣的可以自行查看。
從window中的方法setWindowManager中可以看出創建的WindowManager的對象實際上是WindowManagerImpl,此類是WindowManager的實現類,源碼如下:
public final class WindowManagerImpl implements WindowManager {private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();private final Display mDisplay;private final Window mParentWindow;public WindowManagerImpl(Display display) {this(display, null);}private WindowManagerImpl(Display display, Window parentWindow) {mDisplay = display;mParentWindow = parentWindow;}public WindowManagerImpl createLocalWindowManager(Window parentWindow) {return new WindowManagerImpl(mDisplay, parentWindow);}public WindowManagerImpl createPresentationWindowManager(Display display) {return new WindowManagerImpl(display, mParentWindow);}@Overridepublic void addView(View view, ViewGroup.LayoutParams params) {mGlobal.addView(view, params, mDisplay, mParentWindow);}@Overridepublic void updateViewLayout(View view, ViewGroup.LayoutParams params) {mGlobal.updateViewLayout(view, params);}@Overridepublic void removeView(View view) {mGlobal.removeView(view, false);}@Overridepublic void removeViewImmediate(View view) {mGlobal.removeView(view, true);}@Overridepublic Display getDefaultDisplay() {return mDisplay;} }該實現類比較簡單,主要持有Window類型的mParentWindow對象,并提供一系列的方法用于構建WindowManagerImpl對象,其他方法的實現主要調用WindowManagerGlobal對象中的響應方法。
在window的setWindowManager方法主要調用了WindowManagerImpl的createLocalWindowManager創建了WindowManager對象,這樣就將Window和WindowManager關聯起來了,也就意味在調用WindowManager的addView、updateViewLayout、removeView時實際上操作的是Window內部的View,這一點可以通過查看WindowManagerGlobal相關方法的源碼可以看出。
?
疑問咨詢或技術交流,請加入官方QQ群:?(452379712)
?
作者:杰瑞教育出處:http://www.cnblogs.com/jerehedu/?
本文版權歸煙臺杰瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
轉載于:https://www.cnblogs.com/jerehedu/p/4751208.html
總結
以上是生活随笔為你收集整理的Android GUI之Window、WindowManager的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设置ArcGIS的外观改回到出厂
- 下一篇: Windows Server 2012R