教育行业A股IPO第一股(股票代码 003032)

全国咨询/投诉热线:400-618-4000

Android培训之WindowManager的使用(二)

更新时间:2016年07月26日10时38分 来源:传智播客Android培训学院 浏览次数:

2.3. 查看屏幕上的Window

我们再往屏幕上加一个PopupWindow和一个Dialog,当前界面如下:



在Eclipse中,点击菜单 Window - Open Perspective - Others,选择 HierarchyView,打开,选择Windows面板,可以看到当前屏幕中所有的Window:



我们添加的Window在其中显示的标题为AddWindow,另外,我们可以看到还有别的几个Window,比如 PopupWindow,MainActivity,加粗的那一个其实是MainActivity中弹出的Dialog,还能看到 StatusBar(状态栏),RecentsPanel(最近应用列表)等等,这也证明了我们前面说的,Android中所有的界面都是显示在Window中的。

3桌面悬浮窗实现思路

3.1. 在桌面上显示Window

如果我们在Activity中使用WindowManager添加Window,当Activity退出时,添加的Window也会被回收掉。所以要想在桌面上显示悬浮窗,可以在Service中使用WindowManager添加Window,这样只要服务不停止,就可以一直显示。当服务启动时,在其onCreate方法中,使用WindowManager的 addView方法添加一个系统Window,当服务销毁时,可以在其 onDestroy中使用WindowManager的removeView 方法移除Window。大体是这样的思路,代码就不再给出了。

3.2.. 让这个Window随手指移动

要想让这个Window能接收事件,需要给他设置相应的flags(只要不包含FLAG_NOT_TOUCHABLE即可),另外其type也不能是 TYPE_TOAST。可以使用:TYPE_PRIORITY_PHONE,表示比来去电界面的Window级别还要高一些(来去电界面的Window是系统Window)。
mParams.type = WindowManager.LayoutParams. TYPE_PRIORITY_PHONE;
mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
注意添加权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
 然后给Window里的View设置onTouchListener,重写onTouch方法:
private int mStartX;
private int mStartY;
@Override
public boolean onTouch(View v,MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        // 记录坐标起始点,getRawX,getRawY返回值为float,
        // 需转化为int,变成像素数后再使用
        mStartX = (int) event.getRawX();
        mStartY = (int) event.getRawY();
        break;
    case MotionEvent.ACTION_MOVE:
        int newX = (int) event.getRawX();
        int newY = (int) event.getRawY();
        // 获取手指移动的距离
        int dx = newX - mStartX;
        int dy = newY - mStartY;
        // 修改Window的x,y坐标
        mParams.x += dx;
        mParams.y += dy;
        // 修改Window的布局参数
        // 这里不能修改Window里的View的布局参数,因为View是在Window中显示的,
        // 修改View的布局参数并不能移动外面的Window
        mWindowManager.updateViewLayout(mView,mParams);
        // 重新记录新的坐标起始点
        mStartX = (int) event.getRawX();
        mStartY = (int) event.getRawY();
        break;
    default:
        break;
    }
    return true;
}
这样就实现了Window随着手指拖动而移动了。


本文版权归传智播客Android培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Android培训学院
首发:http://www.itcast.cn/Android


0 分享到:
和我们在线交谈!