概述
Window是窗体对象,它是android体系中非常基础、至关重要的一环。基本上Android中所有的视图都是通过Window来呈现的,可以说Window是实际上的View的管理者。平时我们直接用到Window和WindowManager对象的时候却不是很多,一般都是在设置Android设备悬浮窗口时才会直接用到。但是还是要多多探究Window和WindowManager对象,这对深层次理解Android系统有很大帮助。
Window窗口特性FLAG
Window窗口特性表示的是Android设备窗口显示情况,它由一组标志flag标志。不同的标志控制不同的显示风格和显示样式。Android中window有很多特性显示标志,主要有以下几种。
public static final int FEATURE_OPTIONS_PANEL = 0; //显示面板(默认)
public static final int FEATURE_NO_TITLE = 1;//不显示屏幕顶部标题
@Deprecated
public static final int FEATURE_PROGRESS = 2; //显示进度指示器
public static final int FEATURE_LEFT_ICON = 3; //显示左边的图标
public static final int FEATURE_RIGHT_ICON = 4; //显示右边的图标
@Deprecated
public static final int FEATURE_INDETERMINATE_PROGRESS = 5; //显示不确定进度标志(从API 21开始不再支持)
public static final int FEATURE_CONTEXT_MENU = 6;//显示上下文菜单(默认显示)
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_SWIPE_TO_DISMISS = 11;//从左侧滑动时,窗口消失
public static final int FEATURE_CONTENT_TRANSITIONS = 12; //请求窗口内容的变化,使用transitionmanager
public static final int FEATURE_ACTIVITY_TRANSITIONS = 13;//允许Activity通过发送或接收来运行Activity转换
public static final int FEATURE_MAX = FEATURE_ACTIVITY_TRANSITIONS; //feature ID最大值
除此以外,还有window进度条方面的相关特性标志。
@Deprecated
public static final int PROGRESS_VISIBILITY_ON = -1; //设置进度条可见
@Deprecated
public static final int PROGRESS_VISIBILITY_OFF = -2; //设置进度条不可见
@Deprecated
public static final int PROGRESS_INDETERMINATE_ON = -3;//开启进度条不确定模式
@Deprecated
public static final int PROGRESS_INDETERMINATE_OFF = -4;//关闭进度条不确定模式
@Deprecated
public static final int PROGRESS_START = 0; //主要进度条初始值
@Deprecated
public static final int PROGRESS_END = 10000; //主要进度条最大值(结束值)
@Deprecated
public static final int PROGRESS_SECONDARY_START = 20000;//次级进度条初始值
@Deprecated
public static final int PROGRESS_SECONDARY_END = 30000;//次级进度条最大值(结束值)
//当使用自定义背景时,状态栏的背景视图
public static final String STATUS_BAR_BACKGROUND_TRANSITION_NAME = "android:status:background";
//当使用自定义背景时,导航栏的背景视图
public static final String NAVIGATION_BAR_BACKGROUND_TRANSITION_NAME = "android:navigation:background";
Window层级
HTML中有视图分层的概念,z-index。其实,在Window中也有分层的概念,用z-order标识,层级越大越展示在上面。Window中主要有三大种类型:应用Window、子Window和系统Window。
应用window:对应着activity;
子window:不能单独存在,必须依附在父window中,如dialog;
系统window:需要声明权限才能创建的window,比如toast、悬浮窗口等。
在上述三类Window中,应用window的层级是最小的,一般处在1-99级;子window是中间层级,一般在1000-1999级;而系统window则拥有最高层级,范围是2000-2999。
WindowManager常用方法
WindowManager是外界访问Window的入口,WindowManager和Window对象交互是一个IPC的过程。我们在进行android项目开发时,最经常采用WindowManger提供的只有三个方法addView(View view, ViewGroup.LayoutParams params)、updateViewLayout(View view, ViewGroup.LayoutParams params)和removeView(View view),即视图的添加、更新和删除。其实,这三个方法是由ViewManager接口提供,而WindowManager继承了这个接口。
public interface ViewManager {
public void addView(View view, ViewGroup.LayoutParams params);
public void updateViewLayout(View view, ViewGroup.LayoutParams params);
public void removeView(View view);
}
@SystemService(Context.WINDOW_SERVICE)
public interface WindowManager extends ViewManager {
...
...
}
至于View视图的拖动操作,可以通过onTouch(View v,MotionEvent event)方法来进行设定。具体的原理是改变view的布局参数的值,即设置LayoutParams布局参数中x和y的值。
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
xInScreen = event.getRawX();
yInScreen = event.getRawY();
windowManager.updateViewLayout(this, mParams);
break;
case MotionEvent.ACTION_UP:
break;
default:
break;
}
return true;
}
以上便是Window和WindowManager的重要知识点介绍。另外,在另一篇文章Android桌面悬浮窗口举例中给出了具体的应用实例,有需要的朋友可以看一下,希望能给大家带来帮助。