Android之Window和WindowManager简述

概述

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桌面悬浮窗口举例中给出了具体的应用实例,有需要的朋友可以看一下,希望能给大家带来帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值