游乐游手机版
首页/科技数码/文章详情

让你的应用"飘"起来!Android悬浮窗+自动吸边效果实战

时间:2025-12-15 20:35
重要注意事项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. 权限提示:优雅地引导用户开启权限

快来打造属于你的"桌面小精灵"吧!代码在手,创意我有,让你的应用瞬间拥有灵魂~

来源:https://www.51cto.com/article/817808.html
上一篇毁灭战士:黑暗时代完整剧情影片意外发布,引发玩家热议 下一篇神州数码:覆盖服务器、PC、算力与私有化解决方案
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
年国家能源局充换电服务业用电量增速48.8%
科技数码 · 2026-06-29

年国家能源局充换电服务业用电量增速48.8%

2025年全社会用电量达103682亿千瓦时,同比增长5 0%。充换电服务业用电增速高达48 8%,信息传输与软件服务业增速17 0%。第三产业和居民用电对增长贡献率合计占一半。中国成为全球首个年度用电量超10 4万亿千瓦时的国家。

追风者 GLACIER ONE 360 S25 液冷散热器新品上市 联体风扇售价429元
科技数码 · 2026-06-29

追风者 GLACIER ONE 360 S25 液冷散热器新品上市 联体风扇售价429元

追风者冰川360S25液冷散热器售价429元,三联一体风扇便捷安装,冷头小体积纯铜底座噪音18dB,风扇转速300-2000RPM、风量75CFM、静压2 96mmAq,五年质保漏液包赔。

三星Galaxy Watch8用户反馈谷歌后台组件异常
科技数码 · 2026-06-29

三星Galaxy Watch8用户反馈谷歌后台组件异常

三星GalaxyWatch8、Watch5Pro、Watch6及Watch7用户反映,GooglePlayServices后台耗电异常,电量占比最高达99 97%,远超正常水平,严重影响续航。目前故障原因不明,谷歌尚未发布官方声明。

罗永浩批苹果iOS 27创新不足 盼新CEO改进
科技数码 · 2026-06-29

罗永浩批苹果iOS 27创新不足 盼新CEO改进

罗永浩批评苹果iOS27创新不足,称仅有双iPhone同号、音量分离等数十项细节改进,认为库克时代缺乏突破性创新,股市虽好但消费者只能被迫接受挤牙膏式升级。

年国产车出口710万辆,两家车企销量破百万
科技数码 · 2026-06-29

年国产车出口710万辆,两家车企销量破百万

2025年国产汽车出口总量达710万辆,同比增长21%。奇瑞以134万辆居首,比亚迪105万辆次之,上汽乘用车出口占比60%最高,长城出口51万辆。吉利、长安等主流品牌同步增长,小鹏、零跑等新兴品牌海外拓展加速。