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