Skip to content

v1.2.1 · 可拖动悬浮球

Choose a tag to compare

@jilin0105 jilin0105 released this 14 Sep 15:29
· 10 commits to main since this release

悬浮窗改为可拖动球形

原来是一个矩形小窗,显示难看且遮挡内容。现在改成圆形悬浮球。

交互

操作 行为
按住拖动 可拖到屏幕任意位置,边界自动夹紧(不会拖丢)
松手 自动吸附到最近的屏幕边缘
3 秒不碰 缩成一道半透明细弧躲到边上,不碍事
点击球体 立即展开,重置倒计时
状态指示 绿点=运行中,红点=已停止

一个关键的实现选择

收起时只偏移绘制内容(canvas.translate),窗口本身仍留在屏内。

为什么不直接把窗口移出屏幕:那样露出的 14dp 就是全部触摸区域,用户几乎点不中,
只能看到球却摸不到。保持窗口在屏内,触摸热区就是完整的 52dp 球体 ——
视觉上躲起来了,操作上依然好点。

顺带修复的问题

  • Paint 复用污染 alpha:状态点用同一个 Paint 画描边和实心,导致其越画越透明
  • 动画并发写同一份 LayoutParams:快速连点会让位置互相覆盖、球在抖。
    改为单个 ValueAnimator 统一驱动「位置 + 缩放 + 透明度 + 偏移」四项,开新动画前先 cancel 旧的
  • 拖动与动画互相覆盖:确认拖动后立即终止缩放动画,否则球跟不上手指
  • 废弃 API:defaultDisplay 换成 WindowMetrics,修正折叠屏/分屏下球定位偏移

能力边界(未改变)

悬浮球提升进程到 VISIBLE,能降低内存不足被回收的概率,
但挡不住系统的一键清理/强力清理(走白名单机制)。默认关闭。

安装包为 debug 签名版,仅供测试。