这个技术只要掌握好WindowManager的显示类型即可。只要学会了该知识点,就能够实现例如360,QQ管家那样的悬浮窗效果。下面看看效果图。。。
核心代码:
实现函数
还有一个权限是必须要添加的。
核心代码:
private boolean isAdded = false; // 是否已增加悬浮窗 private static WindowManager wm; private static WindowManager.LayoutParams params; private LinearLayout layout; private Button btnStart; private Button btnScreen;
实现函数
/** * 创建悬浮窗 */ @SuppressLint("ClickableViewAccessibility") private void createFloatView() { btnStart = new Button(getApplicationContext()); btnStart.setText(getString(R.string.string_init)); btnStart.setOnClickListener(this); btnScreen = new Button(getApplicationContext()); btnScreen.setText(getString(R.string.string_screen)); btnScreen.setOnClickListener(this); wm = (WindowManager) getApplicationContext().getSystemService( Context.WINDOW_SERVICE); params = new WindowManager.LayoutParams(); params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; /* * 如果设置为params.type = WindowManager.LayoutParams.TYPE_PHONE; 那么优先级会降低一些, * 即拉下通知栏不可见 */ params.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明 // 设置Window flag params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; /* * 下面的flags属性的效果形同“锁定”。 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。 * wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL | * LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE; */ // 设置悬浮窗的长得宽 params.width = -2; params.height = -2; // 设置悬浮窗的Touch监听 layout = new LinearLayout(getApplicationContext()); layout.setOrientation(LinearLayout.HORIZONTAL); layout.setClickable(true); layout.setPadding(30, 30, 30, 30); layout.addView(btnStart); layout.addView(btnScreen); layout.setOnTouchListener(new OnTouchListener() { int lastX, lastY; int paramX, paramY; public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); paramX = params.x; paramY = params.y; break; case MotionEvent.ACTION_MOVE: int dx = (int) event.getRawX() - lastX; int dy = (int) event.getRawY() - lastY; params.x = paramX + dx; params.y = paramY + dy; // 更新悬浮窗位置 wm.updateViewLayout(layout, params); break; } return true; } }); wm.addView(layout, params); isAdded = true; }
还有一个权限是必须要添加的。
收藏的用户(0) X
正在加载信息~
推荐阅读
最新回复 (0)
站点信息
- 文章2300
- 用户1336
- 访客10861715
每日一句
True success inspires others to act.
真正的成功是激励他人行动。
真正的成功是激励他人行动。
语法错误: 意外的令牌“标识符”
全面理解Gradle - 定义Task
Motrix全能下载工具 (支持 BT / 磁力链 / 百度网盘)
谷歌Pixel正在开始起飞?
获取ElementUI Table排序后的数据
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is
亲测!虚拟机VirtualBox安装MAC OS 10.12图文教程
华为手机app闪退重启界面清空log日志问题
android ndk开发之asm/page.h: not found
手机屏幕碎了怎么备份操作?
免ROOT实现模拟点击任意位置
新手必看修改DSDT教程
thinkpad t470p装黑苹果系统10.13.2
新会员