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 可任意位置移动的悬浮窗相关推荐

  1. Android M及以上版本系统 悬浮窗权限 的解决方案

    Android M及以上版本系统 悬浮窗权限 的解决方案 Android的窗口体系中,WindowManager占有非常重要的地位,平时我们使用悬浮窗会遇到一些权限的问题. 当 Android工程在 ...

  2. Android窗口Window的创建(悬浮窗)

    创建悬浮窗以及基于无障碍服务的窗口 关于悬浮窗的创建 启动悬浮窗 关于前台服务 启动服务 无障碍窗口 知识点 参考链接 关于悬浮窗的创建 首先需要获取WindowManager WindowManag ...

  3. Android仿优酷视频的悬浮窗播放

    Android仿优酷视频的悬浮窗播放 之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer 这个要求就代表不能 ...

  4. android浮窗播放器,Android仿优酷视频的悬浮窗播放效果

    之前接了需求要让视频播放时可以像优酷视频那样在悬浮窗里播放,并且悬浮窗和主播放页面之间要实现无缝切换,项目中使用的是自封装的ijkplayer 这个要求就代表不能在悬浮窗中新建视频控件,所以需要在悬浮 ...

  5. 【Android 学习】实现仿360悬浮窗

    本篇博客转自郭霖的博客http://blog.csdn.net/guolin_blog/article/details/8689140 360手机卫士我相信大家都知道,好多人手机上都会装这一款软件,那 ...

  6. Android实现仿360手机卫士悬浮窗效果

    大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多 ...

  7. Android各版本查询和开启悬浮窗权限

    Android 各版本查询和开启悬浮窗权限 如果你是从事Android开发的程序员,那么你肯定对于权限这个词不会陌生,Android的权限分为一般权限和危险权限,一般权限(只需在AndroidMani ...

  8. android仿照360壁纸照片显示特效,Android仿360桌面手机卫士悬浮窗效果

    大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我先说几句不相干的话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多 ...

  9. Android开发之仿手机卫士悬浮窗效果

    基本的实现原理,这种桌面悬浮窗的效果很类似与Widget,但是它比Widget要灵活的多.主要是通过WindowManager这个类来实现的,调用这个类的addView方法用于添加一个悬浮窗,upda ...

最新文章

  1. Spring AOP小记
  2. linux目录挂载到内存,Linux中内存挂载到目录下
  3. HttpClient发送Get请求(java)【从新浪云搬运】
  4. 试题导入mysql乱码_解决Mysql导入乱码问题
  5. elementui可编辑单元格_关于遥感解译点室内解译编号的读取编辑方法
  6. *PAT_B_1030_Java(22分)_C++(25分)
  7. 机器人的动力学和动力学联系_通过机器学习了解幸福动力学(第2部分)
  8. 【LeetCode笔记】剑指 Offer 57- II. 和为 s 的连续正数序列(Java、滑动窗口、二刷)
  9. 关于SVG的viewBox
  10. 【以太坊开发】发币指南--基础篇
  11. Android RecyclerView之PagerSnapHelper原理解析(二)
  12. AOP面向切面编程(1.6w字长文讲清AOP)
  13. html5游戏开发教程实战:五子棋、四子棋、围棋、翻转棋四种对弈游戏,仅仅100行代码
  14. 在这里,北上深成为“社科之城”
  15. vue中.lazy 相当于change事件
  16. android 电视 vob格式转换,旭日Android视频格式转换器
  17. Python练手项目:计算机自动还原魔方(2)还原顶部
  18. Testin徐琨:颠覆测试行业的四个必杀技
  19. 飞迈阁带你了解网上赚钱
  20. b站百万Up主分享如何做内容

热门文章

  1. Python机器学习算法入门教程(一)
  2. uni-app(微信小程序)编写小程序加载map地图总结
  3. “一城一亿人”,呼唤自动驾驶时代
  4. 如何给照片换背景?怎么用手机更换证件照背景颜色
  5. C-Free5重装后点击任何按钮都没有反应
  6. 第十章 阿布·坎迪
  7. 解决机械键盘进饮料回弹慢问题
  8. python用turtle画出给定图片的图像
  9. 苹果x怎么显示电量百分比_苹果数据线在充电时,显示不支持此配件该怎么办?...
  10. VI在各类型活动展示中的要点