要想实现悬浮窗口,首先得有“android.permission.SYSTEM_ALERT_WINDOW”的权限,然后参数如下:
WindowManager.LayoutParams params = new WindowManager.LayoutParams(); //设置窗口类型在所有窗口之上 params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;如果没有params.flags这句话的话,在生成悬浮窗口后,悬浮窗口后的界面上东西都不能点。这句话的目的是让悬浮窗口失去焦点。简单封装成一个视图,直接new就可以使用了。
package com.androidtouch; import android.content.Context; import android.graphics.Rect; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; public class FloatView extends View { private float mTouchX; private float mTouchY; private float x; private float y; private float mStartX; private float mStartY; private OnClickListener mClickListener; private WindowManager windowManager; private WindowManager.LayoutParams windowManagerParams;; public FloatView(Context context) { super(context); windowManager = (WindowManager) getContext().getApplicationContext() .getSystemService(Context.WINDOW_SERVICE); windowManagerParams = new WindowManager.LayoutParams(); windowManagerParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; windowManagerParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY; windowManagerParams.format = 1; windowManagerParams.gravity = Gravity.LEFT | Gravity.TOP; windowManagerParams.height = Dp2Px(64); windowManagerParams.width = Dp2Px(64); windowManager.addView(this, windowManagerParams); } @Override public boolean onTouchEvent(MotionEvent event) { // 获取到状态栏的高度 Rect frame = new Rect(); getWindowVisibleDisplayFrame(frame); int statusBarHeight = frame.top; // 获取相对屏幕的坐标,即以屏幕左上角为原点 x = event.getRawX(); y = event.getRawY() - statusBarHeight; // statusBarHeight是系统状态栏的高度 switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 捕获手指触摸按下动作 // 获取相对View的坐标,即以此View左上角为原点 mTouchX = event.getX(); mTouchY = event.getY(); mStartX = x; mStartY = y; break; case MotionEvent.ACTION_MOVE: // 捕获手指触摸移动动作 updateViewPosition(); break; case MotionEvent.ACTION_UP: // 捕获手指触摸离开动作 updateViewPosition(); mTouchX = mTouchY = 0; if ((x - mStartX) < 5 && (y - mStartY) < 5) { if (mClickListener != null) { mClickListener.onClick(this); } } break; } return true; } @Override public void setOnClickListener(OnClickListener l) { this.mClickListener = l; } private void updateViewPosition() { // 更新浮动窗口位置参数 windowManagerParams.x = (int) (x - mTouchX); windowManagerParams.y = (int) (y - mTouchY); windowManager.updateViewLayout(this, windowManagerParams); // 刷新显示 } public int Dp2Px(float dp) { final float scale = getContext().getResources().getDisplayMetrics().density; return (int) (dp * scale + 0.5f); } public int Px2Dp(float px) { final float scale = getContext().getResources().getDisplayMetrics().density; return (int) (px / scale + 0.5f); } }
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2300
- 用户1336
- 访客10855505
每日一句
Challenges spark life; conquering them gives purpose.
挑战点亮生活,征服赋予意义。
挑战点亮生活,征服赋予意义。
新会员