浮窗就是当当前页面关闭后,仍能在手机上显示的窗口,像浮在最上层一样,一直存在,一般可跟随手拖动而移动。
加速球就是一个浮窗。
浮窗的大小和形状等都可以自己设定,不是一定的。
效果(屏幕中小方形为浮窗,可拖动,下面的浮窗按钮与本文无关):
开启浮窗需要首先开启手机的浮窗权限,有些手机默认不允许开启浮窗:找到manifest下的AndroidManifest.xml文件,在其中添加一句代码,开启权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
开启后可以开始写代码了。
只做浮窗demo,不添加其他功能,直接在activity中进行:
先声明要用到的变量:
//浮窗
private WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
private static WindowManager windowManager;
//浮窗内容
private static ImageView imageView;
然后再onCreat中添加以下代码:
//浮窗获得service
windowManager = (WindowManager) getApplication().getSystemService(WINDOW_SERVICE);
lp.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT |WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
lp.gravity = Gravity.LEFT|Gravity.TOP; //显示在屏幕左上角
//显示位置与指定位置的相对位置差
lp.x = 0;
lp.y = 0;
//悬浮窗的宽高
lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
//设置浮窗为透明,如果不设置为透明,图片下面的部分浮窗会为黑色(默认黑,也可能为其他色),不好看
lp.format = PixelFormat.TRANSPARENT;
//移除窗口
if (imageView != null){
windowManager.removeView(imageView);
}
//imageview设置
imageView = new ImageView(getApplicationContext());
imageView.setImageResource(R.mipmap.ic_launcher);
windowManager.addView(imageView,lp);
//imageview触摸监听
imageView.setOnTouchListener(new View.OnTouchListener() {
private float lastX, lastY;
private float nowX, nowY;
private float tranX,tranY;
@Override
public boolean onTouch(View v, MotionEvent event) {
boolean ret = false;
switch (event.getAction()){
//按下
case MotionEvent.ACTION_DOWN:
//上次位置
lastX = event.getRawX();
lastY = event.getRawY();
ret = true;
break;
//拖动
case MotionEvent.ACTION_MOVE:
//当前目标位置
nowX = event.getRawX();
nowY = event.getRawY();
tranX = nowX - lastX;
tranY = nowY - lastY;
//移动
lp.x += tranX;
lp.y += tranY;
//更新位置
windowManager.updateViewLayout(imageView,lp);
//记录当前坐标作为下一次计算的上一次移动的位置坐标
lastX = nowX;
lastY = nowY;
break;
//弹起不操作
case MotionEvent.ACTION_UP:
break;
}
return ret;
}
});
Toast.makeText(MainActivity.this,"已开启Toucher",Toast.LENGTH_SHORT).show();
简易的初始在屏幕左上角,大小和图片一样大,可拖动的浮窗完成。
仍在入门,如有错误,欢迎指出