android中的UI中的窗口之Window类介绍

        Android的WebKit的GUI和Android的GUI用的是同一套GDI——Skia,但GUI层是完全不同的设计,分别自成体系。

        Android中窗口的Window类,位于代码树frameworks\base\core\java\android\view\Windowjava.java文件,是一个抽象类,概括了Android窗口的基本属性和基本功能。

        1).  Window类的基本属性如下:

          FEATURE_OPTIONS_PANEL = 0;                      可选的Panel标志(默认使能) 
          FEATURE_NO_TITLE = 1;                                 无标题栏 
          FEATURE_PROGRESS = 2;                                 标题栏上显示加载进度,如webview加载网页时(条状进度条) 
          FEATURE_LEFT_ICON = 3;                                标题栏左侧显示一个图标 
          FEATURE_RIGHT_ICON = 4;                              标题栏右侧显示一个图标 
          FEATURE_INDETERMINATE_PROGRESS = 5;   不确定的进度(圆圈状等待图标) 
          FEATURE_CONTEXT_MENU = 6;                        Menu菜单(默认使能) 
          FEATURE_CUSTOM_TITLE = 7;                          自定义标题栏,该属性不能与其他标题栏属性合用 
          FEATURE_ACTION_BAR = 8;                               ActionBar属性,ActionBar显示的,TitleBar就没有啦
                                                             

          FEATURE_ACTION_BAR_OVERLAY = 9;            覆盖在内容之上的ActionBar

          FEATURE_ACTION_MODE_OVERLAY = 10;        AcitionBar的覆盖在内容的模式

          FEATURE_OPENGL = 8;                                       若开启OpenGL,那么2D将由OpenGL处理(OpenGL中2D是3D的子集) 
          PROGRESS_VISIBILITY_ON = -1;                         进度条可见 
          PROGRESS_VISIBILITY_OFF = -2;                       进度条不可见 
          PROGRESS_INDETERMINATE_ON = -3;              开启不确定模式 
          PROGRESS_INDETERMINATE_OFF = -4;             关闭不确定模式 
          PROGRESS_START = 0;                                        第一进度条的最小值 
          PROGRESS_END = 10000;                                     第一进度条的最大值 
          PROGRESS_SECONDARY_START = 20000;          第二进度条的最小值 
          PROGRESS_SECONDARY_END = 30000;              第二进度条的最大值 

       经常使用到的: 

1、隐藏标题栏 

requestWindowFeature(Window.FEATURE_NO_TITLE); 

2、在标题栏显示进度条 

requestWindowFeature(Window.FEATURE_PROGRESS); 

setContentView(R.layout.progressbar_1); 

setProgressBarVisibility(true); 

final ProgressBar progressHorizontal = (ProgressBar)findViewById(R.id.progress_horizontal); 

setProgress(progressHorizontal.getProgress() * 100); 

setSecondaryProgress(progressHorizontal.getSecondaryProgress()* 100); 

3、使用自定义标题栏 

requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 

setContentView(R.layout.xxx); 

getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE,R.layout.my_title_bar); 

4、清除标题栏内容,而区域保留 

((ViewGroup)getWindow().findViewById(com.android.internal.R.id.title_container)).removeAllViews(); 

5、隐藏标题栏 

((ViewGroup)getWindow(). findViewById(com.android.internal.R.id.title_container)).setVisibility(View.GONE); 

6、显示标题栏 

((ViewGroup)getWindow(). findViewById(com.android.internal.R.id.title_container)).setVisibility(View.VISIBLE); 

其他注意事项 

(1) requestWindowFeature()要在setContentView()之前调用; 

(2) 设置各种Feature,是具有排它性的,一旦设置,后续不可更改为别的类型; 

(3)当使用TabHost(由ActivityGroup派生)时,各个Tab里的Activity,要么都是NO_TITLE,要么都是CUSTOM_TITLE,无法分别进行设置

ID_ANDROID_CONTENT = com.android.internal.R.id.content;  就是显示内容的id。


2). Window类的内部类接口Callback包含一系列dispatchXxxx函数和一系列onXxxx函数,用于处理UI事件

public boolean dispatchKeyEvent(KeyEvent event);

public boolean dispatchKeyShortcutEvent(KeyEvent event);

public boolean dispatchTouchEvent(MotionEvent event);

public boolean dispatchTrackballEvent(MotionEvent event);

public boolean dispatchGenericMotionEvent(MotionEvent event);                            移动事件

public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event);

public View onCreatePanelView(int featureId);

public boolean onCreatePanelMenu(int featureId, Menu menu);

public boolean onPreparePanel(int featureId, View view, Menu menu);

public boolean onMenuOpened(int featureId, Menu menu);                                      用户选择菜单项。

public boolean onMenuItemSelected(int featureId, MenuItem item);                          用户选择菜单项。

public void onWindowAttributesChanged(WindowManager.LayoutParams attrs);        当前窗口属性改变。 

public void onContentChanged();                                  窗口的view发生改变。 

public void onWindowFocusChanged(boolean hasFocus);窗口的焦点发生变换

public void onAttachedToWindow();                              窗口附加到窗口管理器上。

public void onDetachedFromWindow();                          窗口从窗口管理器上摘除。

public void onPanelClosed(int featureId, Menu menu);

public boolean onSearchRequested();                       当用户按下了search按钮。如果启动了搜索界面则返回true,如果不能执行则返回false。

public ActionMode onWindowStartingActionMode(ActionMode.Callback callback);

public void onActionModeStarted(ActionMode mode);

public void onActionModeFinished(ActionMode mode);

3). 自定义WindowManager类(内部类LocalWindowManager)。主要修改了addView函数,设置title。 

 private class LocalWindowManager extends WindowManagerImpl.CompatModeWrapper 

WindowManager并不是什么“窗口管理器”,WindowManagerService才是窗口管理器,WindowManager主要管理一堆状态字。WindowManager的LayoutParams子类内容十分丰富。其实WindowManager.java的主要内容就是由这个类定义构成。

LayoutParams如下定义:

public int x;

public int y;

如果忽略gravity属性,那么它表示窗口的x/y绝对位置。当设置了Gravity.LEFT或Gravity.RIGHT之后,x/y值就表示到特定边的距离。

float horizontalWeight  float erticalWeight

表示在水平或垂直方向上有多少空间可以放大拉伸的,如果定义0则不能拉伸,其它值则会按比例均给所有的Views。


public int type;

窗口类型:有3种主要类型

Applicationwindows:取值在 FIRST_APPLICATION_WINDOW和LAST_APPLICATION_WINDOW 之间。 

   是通常的、顶层的应用程序窗口,必须将token设置成activity的token。 

Sub_windows:取值在 FIRST_SUB_WINDOW和 LAST_SUB_WINDOW 之间。 

   与顶层窗口相关联,token必须设置为它所附着的宿主窗口的token。 

Systemwindows:取值在 FIRST_SYSTEM_WINDOW和 LAST_SYSTEM_WINDOW 之间。 

   用于特定的系统功能。它不能用于应用程序,使用时需要特殊权限。 

Applicaitonwindows:
        public static final int FIRST_APPLICATION_WINDOW = 1; 应用程序窗口        
       
        public static final int TYPE_BASE_APPLICATION   = 1; 所有应用基本的应用窗口,所有的其它应用窗口都必须出现在它上面        
       
        public static final int TYPE_APPLICATION        = 2; 普通应用程序窗口。token必须设置为Activity的token,以指出该窗口属谁    
 
        public static final int TYPE_APPLICATION_STARTING = 3;应用启动的特定应用窗口,由系统来使用直到应用显示它自己的窗口
    
        public static final int LAST_APPLICATION_WINDOW = 99; 应用结束窗口


sub_window:
     
        public static final int FIRST_SUB_WINDOW        = 1000; 子窗口。子窗口的Z序和坐标空间都依赖于他们的宿主窗口。

   
        public static final int TYPE_APPLICATION_PANEL  = FIRST_SUB_WINDOW; 面板窗口,显示于宿主窗口上层。    


        public static final int TYPE_APPLICATION_MEDIA  = FIRST_SUB_WINDOW+1; 媒体窗口,例如视频。显示于宿主窗口下层。

    
        public static final int TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW+2; 应用程序窗口的子面板。显示于所有面板窗口的上层。(GUI的一般规律,越“子”越靠上) 


        public static final int TYPE_APPLICATION_ATTACHED_DIALOG = FIRST_SUB_WINDOW+3; 对话框。类似于面板窗口,绘制类似于顶层窗口,而不是宿主的子窗口。

      
        public static final int TYPE_APPLICATION_MEDIA_OVERLAY  = FIRST_SUB_WINDOW+4; 媒体信息。显示在媒体层和程序窗口之间,需要实现透明(半透明)效果。(如显示字幕)
    
        public static final int LAST_SUB_WINDOW         = 1999; 子窗口结束窗口。

systemwindow:

public static final int FIRST_SYSTEM_WINDOW    = 2000;  系统窗口。非应用程序创建。 

 

public static final int TYPE_STATUS_BAR =FIRST_SYSTEM_WINDOW;  状态栏。只能有一个状态栏;它位于屏幕顶端,其他窗口都位于它下方。


public staticfinal int TYPE_SEARCH_BAR =FIRST_SYSTEM_WINDOW+1;  搜索栏。只能有一个搜索栏;它位于屏幕上方。 

 

public staticfinal int TYPE_PHONE  =FIRST_SYSTEM_WINDOW+2;  电话窗口。它用于电话交互(特别是呼入)。它置于所有应用程序之上,状态栏之下。

 

public staticfinal int TYPE_SYSTEM_ALERT = FIRST_SYSTEM_WINDOW+3;  系统提示。它总是出现在应用程序窗口之上。

 

public staticfinal int TYPE_KEYGUARD  =FIRST_SYSTEM_WINDOW+4;  锁屏窗口。

 

public staticfinal int TYPE_TOAST            =FIRST_SYSTEM_WINDOW+5; 信息窗口。用于显示toast。

 

public staticfinal int TYPE_SYSTEM_OVERLAY    = FIRST_SYSTEM_WINDOW+6;  系统顶层窗口。显示在其他一切内容之上。此窗口不能获得输入焦点,否则影响锁屏。


public staticfinal int TYPE_PRIORITY_PHONE    = FIRST_SYSTEM_WINDOW+7;  电话优先,当锁屏时显示。此窗口不能获得输入焦点,否则影响锁屏。 

 

public staticfinal int TYPE_SYSTEM_DIALOG     = FIRST_SYSTEM_WINDOW+8;  系统对话框。(例如音量调节框)。

 

public staticfinal int TYPE_KEYGUARD_DIALOG   = FIRST_SYSTEM_WINDOW+9; 锁屏时显示的对话框。

 

public staticfinal int TYPE_SYSTEM_ERROR      = FIRST_SYSTEM_WINDOW+10; 系统内部错误提示,显示于所有内容之上。


public staticfinal int TYPE_INPUT_METHOD      = FIRST_SYSTEM_WINDOW+11; 内部输入法窗口,显示于普通UI之上。应用程序可重新布局以免被此窗口覆盖。 

 

public staticfinal int TYPE_INPUT_METHOD_DIALOG=FIRST_SYSTEM_WINDOW+12; 内部输入法对话框,显示于当前输入法窗口之上。

 

public staticfinal int TYPE_WALLPAPER         =FIRST_SYSTEM_WINDOW+13;  墙纸窗口。

 

public staticfinal int TYPE_STATUS_BAR_PANEL   =FIRST_SYSTEM_WINDOW+14; 状态栏的滑动面板。


public staticfinal int LAST_SYSTEM_WINDOW     = 2999;  系统窗口结束。 



public int memoryType;  窗口所使用的内存缓冲类型,默认为NORMAL。 
 
public staticfinal int MEMORY_TYPE_NORMAL = 0; 窗口缓冲位于主内存。
 
public staticfinal int MEMORY_TYPE_HARDWARE = 1; 窗口缓冲位于可以被DMA访问,或者硬件加速的内存区域。
 
public staticfinal int MEMORY_TYPE_GPU = 2; 窗口缓冲位于可被图形加速器访问的区域。
 
public staticfinal int MEMORY_TYPE_PUSH_BUFFERS = 3; 窗口缓冲不拥有自己的缓冲区,不能被锁定。缓冲区由本地方法提供。


public int flags;  行为选项/标志,默认为none 

public staticfinal int FLAG_DIM_BEHIND       = 0x00000002; 窗口之后的内容变暗。 
 
public staticfinal int FLAG_BLUR_BEHIND       = 0x00000004;窗口之后的内容变模糊。



另外,还有输入法和Grativity的标志属性等。






  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值