4

背景

有一些不错的应用程序在顶部显示一些布局,而用户正在拨打电话或接听电话(如“当前呼叫者 ID ”)。

我需要创建一个能够在通话期间在顶部显示某些内容并允许它进行交互的应用程序。

问题

使用 broadcastReceiver 、前台服务和 SYSTEM_ALERT 权限,我已成功在通话期间在屏幕上显示某些内容。

只要显示的内容是静态的,我就没有问题。

但是,我注意到当我尝试使内容显示为交互式时,我遇到了一些问题:

  1. 一切都是跳跃的,这不仅包括动画,还包括将可见性设置为可见/消失。当我需要让事情变得可拖动时,我讨厌思考它会如何工作。

  2. 不确定这是否是原因,但使用 SlidingDrawer 使整个宽度属于 SlidingDrawer 并且您无法单击它。这意味着如果它的位置在底部,当有人打电话给你时,你不能触摸“接听”按钮。

问题

这些问题的原因是什么?

我怎样才能修复它们并能够正确显示?

其他应用程序如何正确处理它?


编辑:关于 SlidingDrawer ,它的位置和大小以及内容区域似乎有可怕的错误,即使它没有向用户显示并且用户可以看穿,它也无法被触及。不过,我不知道为什么,以及如何解决它,我也不知道为什么与普通应用程序相比,事情如此跳跃(可能是因为过度绘制,但它真的很慢)。

也许这个问题应该更笼统:如何制作像AirCalc上的浮动窗口,可以轻松移动但仍然相当快。

对于拖动功能,我尝试获取我显示的根视图(类型为 WindowManager.LayoutParams )的 layoutParams,更新它并再次设置它,但由于某种原因它没有做任何事情。想知道我做错了什么。

编辑:看来我应该使用 windowManager.updateViewLayout 来更新 layoutParams。使用这篇文章,我使它完全可以拖动。

4

1 回答 1

0

好的,我对此得出了一些结论,首先回答我最初的问题:

  1. 这可能是因为过度绘制和我使用的视图。我想尝试一些可以替换 slipDrawer 的库,但每个库都有不同的问题。使用简单的视图证明了这个想法在一般情况下是有效的。

    在可见性变化的情况下,它是跳跃的,因为视图的大小无法适应当前的 WindowManager.LayoutParams 大小。

  2. slipDrawaer 确实存在问题,因为它使用关闭或打开时获得的整个尺寸。

现在讨论剩下的问题:

  1. 无法拖动?而不是常规的 setLayoutParams ,使用 windowManager.updateViewLayout 。

  2. 无法触摸视野之外?根据您的需要设置其最小尺寸。您还可以设置窗口标志,以便触摸事件通过。

  3. 想听电话事件吗?您可以使用广播接收器来触发应用程序的显示,但我怀疑挂断电话可能会导致稍后收到意图。我认为您可以使用 telephonyManager 并在那里收听事件,使用您在前台运行的服务(我创建该服务只是为了确保应用程序不会在中间关闭)。

如果其他人有问题,我可以提供帮助。

于 2013-04-29T12:01:48.297 回答