全国咨询热线:400-618-4000

Android培训之WindowManager的使用(三)

更新时间:2019年04月20日23时10分 来源:Android培训学院

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