Android 可任意位置移动的悬浮窗
1.悬浮窗权限申请:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {if (!Settings.canDrawOverlays(getApplicationContext())) {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);startActivityForResult(intent, 0);} else {mIntent = new Intent(MainActivity.this/*需要启动service的activity*/, FloatWindowService.class/*需要启动的service*/);bindService(mIntent, serviceConnection, Context.BIND_AUTO_CREATE);//直接启动服务方式启动}
}private ServiceConnection serviceConnection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {}@Overridepublic void onServiceDisconnected(ComponentName name) {}
};
在Activity回调申请权限的结果:
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data){super.onActivityResult(requestCode, resultCode, data);if (requestCode == 0) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (Settings.canDrawOverlays(this)) {Intent mIntent = new Intent(MainActivity.this,FloatWindowService.class);startService(mIntent);//直接启动服务方式启动}}}
}
2.创建悬浮窗:
wp = new WindowManager.LayoutParams();
mWindowManager = (WindowManager) getApplication().getSystemService(WINDOW_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {wp.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {wp.type = WindowManager.LayoutParams.TYPE_PHONE;
}
wp.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;//悬浮窗外部可点击
wp.gravity = Gravity.LEFT | Gravity.TOP;//悬浮窗弹出显示位置
wp.x = 0;
wp.y = 0;wp.width = WindowManager.LayoutParams.WRAP_CONTENT;
wp.height = WindowManager.LayoutParams.WRAP_CONTENT;LayoutInflater inflater = LayoutInflater.from(getApplication());
mFloatLayout = (LinearLayout) inflater.inflate(R.layout.float_window, null, false);
View view = mFloatLayout.findViewById(R.id.playMonitor);//自定义悬浮窗布局
view.setOnTouchListener(this);//设置移动监听,此处view是自定义充满布局的控件
mWindowManager.addView(mFloatLayout, wp);
3.设置滑动监听:
private int mTouchStartX, mTouchStartY, mStartX, mStartY, mTouchCurrentX, mTouchCurrentY;@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mTouchStartX = (int) event.getRawX();mTouchStartY = (int) event.getRawY();mStartX = (int) event.getX();mStartY = (int) event.getY();break;case MotionEvent.ACTION_MOVE:mTouchCurrentX = (int) event.getRawX();mTouchCurrentY = (int) event.getRawY();wp.x += mTouchCurrentX - mTouchStartX;wp.y += mTouchCurrentY - mTouchStartY;mWindowManager.updateViewLayout(mFloatLayout, wp);mTouchStartX = mTouchCurrentX;mTouchStartY = mTouchCurrentY;}return true;
}
4.PS:这里悬浮窗在service中实现,多用作媒体播放器,app不在栈顶时的任务管理等场景。Demo:https://download.csdn.net/download/mozushixin_1/12966330
有问题可以邮件交流。(E-mail:mozushixin@163.com)
Android 可任意位置移动的悬浮窗相关推荐
- Android M及以上版本系统 悬浮窗权限 的解决方案
Android M及以上版本系统 悬浮窗权限 的解决方案 Android的窗口体系中,WindowManager占有非常重要的地位,平时我们使用悬浮窗会遇到一些权限的问题. 当 Android工程在 ...
- Android窗口Window的创建(悬浮窗)
创建悬浮窗以及基于无障碍服务的窗口 关于悬浮窗的创建 启动悬浮窗 关于前台服务 启动服务 无障碍窗口 知识点 参考链接 关于悬浮窗的创建 首先需要获取WindowManager WindowManag ...
- Android仿优酷视频的悬浮窗播放
Android仿优酷视频的悬浮窗播放 之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer 这个要求就代表不能 ...
- android浮窗播放器,Android仿优酷视频的悬浮窗播放效果
之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer 这个要求就代表不能在悬浮窗中新建视频控件,所以需要在悬浮 ...
- 【Android 学习】实现仿360悬浮窗
本篇博客转自郭霖的博客http://blog.csdn.net/guolin_blog/article/details/8689140 360手机卫士我相信大家都知道,好多人手机上都会装这一款软件,那 ...
- Android实现仿360手机卫士悬浮窗效果
大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多 ...
- Android各版本查询和开启悬浮窗权限
Android 各版本查询和开启悬浮窗权限 如果你是从事Android开发的程序员,那么你肯定对于权限这个词不会陌生,Android的权限分为一般权限和危险权限,一般权限(只需在AndroidMani ...
- android仿照360壁纸照片显示特效,Android仿360桌面手机卫士悬浮窗效果
大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我先说几句不相干的话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多 ...
- Android开发之仿手机卫士悬浮窗效果
基本的实现原理,这种桌面悬浮窗的效果很类似与Widget,但是它比Widget要灵活的多.主要是通过WindowManager这个类来实现的,调用这个类的addView方法用于添加一个悬浮窗,upda ...
最新文章
- Spring AOP小记
- linux目录挂载到内存,Linux中内存挂载到目录下
- HttpClient发送Get请求(java)【从新浪云搬运】
- 试题导入mysql乱码_解决Mysql导入乱码问题
- elementui可编辑单元格_关于遥感解译点室内解译编号的读取编辑方法
- *PAT_B_1030_Java(22分)_C++(25分)
- 机器人的动力学和动力学联系_通过机器学习了解幸福动力学(第2部分)
- 【LeetCode笔记】剑指 Offer 57- II. 和为 s 的连续正数序列(Java、滑动窗口、二刷)
- 关于SVG的viewBox
- 【以太坊开发】发币指南--基础篇
- Android RecyclerView之PagerSnapHelper原理解析(二)
- AOP面向切面编程(1.6w字长文讲清AOP)
- html5游戏开发教程实战:五子棋、四子棋、围棋、翻转棋四种对弈游戏,仅仅100行代码
- 在这里,北上深成为“社科之城”
- vue中.lazy 相当于change事件
- android 电视 vob格式转换,旭日Android视频格式转换器
- Python练手项目:计算机自动还原魔方(2)还原顶部
- Testin徐琨:颠覆测试行业的四个必杀技
- 飞迈阁带你了解网上赚钱
- b站百万Up主分享如何做内容