让你的应用"飘"起来!Android悬浮窗+自动吸边效果实战
重要注意事项1 版本适配:Android 8 0+要用TYPE_APPLICATION_OVERLAY类型。2 内存管理:记得在onDestroy里移除视图!3 用户体验:拖动时可以考虑增加半
重要注意事项1. 版本适配:Android 8.0+要用TYPE_APPLICATION_OVERLAY类型。2. 内存管理:记得在onDestroy里移除视图!3. 用户体验:拖动时可以考虑增加半透明效果。4. 权限提示:优雅地引导用户开启权限
先搞张"通行证"(权限篇)
在AndroidManifest里挂个牌子
这就像在游乐园门口挂了个"VIP通道"的牌子~
向用户申请"特别通行证"
// 检查是不是Android 6.0以上的"高级游乐园"if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 看看通行证有没有过期 if (!Settings.canDrawOverlays(this)) { // 申请权限 Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, 1001); } else { showFloatingWindow(); // 亮出我们的悬浮窗! }}
图片
创建会"跑"的悬浮窗(核心实现)
悬浮窗基础配置
// 窗口管家(WindowManager)登场windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);// 给悬浮窗穿件"衣服"ImageView floatView = new ImageView(this);floatView.setImageResource(R.drawable.ic_float); // 悬浮窗的"身份证信息"WindowManager.LayoutParams params = new WindowManager.LayoutParams( ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : // Android 8.0+用这个 WindowManager.LayoutParams.TYPE_PHONE, // 老版本用这个 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, // 别抢焦点,做个安静的美窗 PixelFormat.TRANSLUCENT // 半透明效果更高级);// 初始位置:屏幕左上角+向下偏移100像素params.gravity = Gravity.START | Gravity.TOP;params.x = 0;params.y = 100;// 把悬浮窗"放"到屏幕上windowManager.addView(floatView, params);
图片
让悬浮窗"动"起来
floatView.setOnTouchListener(new View.OnTouchListener() { private int startX, startY; private float touchX, touchY; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: // 手指按下 startX = params.x; startY = params.y; touchX = event.getRawX(); // 记录触点X touchY = event.getRawY(); // 记录触点Y return true; case MotionEvent.ACTION_MOVE: // 手指滑动 // 计算新位置 params.x = startX + (int)(event.getRawX() - touchX); params.y = startY + (int)(event.getRawY() - touchY); windowManager.updateViewLayout(floatView, params); return true; case MotionEvent.ACTION_UP: // 手指松开 autoAttachToEdge(); // 触发吸边效果 return true; } return false; }});
磁吸边效果实现(魔法时刻)
private void autoAttachToEdge() { int screenWidth = getResources().getDisplayMetrics().widthPixels; int viewCenterX = params.x + floatView.getWidth()/2; // 判断离哪边近 if(viewCenterX < screenWidth/2) { params.x = 0; // 吸到左边缘 } else { params.x = screenWidth - floatView.getWidth(); // 吸到右边缘 } // 添加弹性动画 ValueAnimator animator = ValueAnimator.ofInt(params.x, targetX); animator.addUpdateListener(animation -> { params.x = (int) animation.getAnimatedValue(); windowManager.updateViewLayout(floatView, params); }); animator.setDuration(300).start();}
图片
重要注意事项
1. 版本适配:Android 8.0+要用TYPE_APPLICATION_OVERLAY类型
2. 内存管理:记得在onDestroy里移除视图!
3. 用户体验:拖动时可以考虑增加半透明效果
4. 权限提示:优雅地引导用户开启权限
快来打造属于你的"桌面小精灵"吧!代码在手,创意我有,让你的应用瞬间拥有灵魂~
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
vivo X Fold6和荣耀折叠屏参数对比:电池续航长焦影像AI办公四个维度谁更全面
vivo X Fold6和荣耀折叠屏参数对比:电池续航长焦影像AI办公四个维度谁更全面一、两款万元内折叠屏的正面较量据IDC《全球折叠屏手机市场季度跟踪报告(2026年Q1)》,2025年折叠屏市场中7,000-9,000元价位段的增速显著高于万元段,成为折叠屏规模扩张的主力区间。在这个价位段,vi
在他人恐惧时保持贪婪 SK海力士DRAM定价与盈利依旧强劲
最近,半导体与AI基础设施领域的一家顶级研究机构SemiAnalysis发布了一份题为《在他人恐惧时保持贪婪:SK海力士的DRAM定价与盈利依旧强劲》的报告,一下子就把市场的注意力拉回到了SK海力士身上。这份报告的核心结论相当明确:SK海力士在2026年第二季度乃至更远的未来,DRAM业务的盈利能力
创业板指重挫超4% 微盘股逆势涨2.5%
7月10日尾盘,A股极端分化:创业板指与科创50均跌超4%,深成指跌逾2%,沪指跌0 8%,而微盘股逆势大涨2 5%,风格分化显著,市场避险情绪升温。
试驾体验对购车决策的影响 动力操控舒适成关键
试驾体验直接影响购车决策,动力响应、操控精准度、座椅舒适性及NVH表现等细节决定长期用车幸福感。不同试驾感受对动力焦虑、驾驶信心和日常心情有显著差异,全面模拟真实场景的试驾有助于选到称心车辆。
比亚迪全球首个1700万辆新能源汽车下线里程碑
比亚迪成为全球首家新能源汽车累计下线突破1700万辆的车企,第1700万辆车型为海豹08。这一里程碑得益于技术攻坚、产品矩阵完善及海外市场渗透,从刀片电池到DM-i等系统化技术为规模化铺路,展现产业链掌控力与迭代速度。
- 热门数据榜
相关攻略
2026-07-14 17:25
2026-07-14 12:45
2026-07-14 12:45
2026-07-14 12:45
2026-07-14 12:44
2026-07-14 12:44
2026-07-14 12:44
2026-07-14 12:44
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

