背景
有一些不错的应用程序在用户打电话或接听电话时在顶部显示一些布局(比如"当前来电显示"(。
我需要创建一个应用程序,能够在通话过程中在顶部显示一些内容,并允许它进行交互。
问题
使用broadcastReceiver、前台服务和SYSTEM_ALERT权限,我成功地在调用过程中在屏幕上显示了一些内容。
只要显示的内容是静态的,我就没有问题。
然而,我注意到,当我试图使显示的内容具有互动性时,我会遇到一些问题:
-
一切都是跳跃的,这不仅包括动画,还包括将可见性设置为可见/消失。当我需要让事情变得拖拉时,我不愿意去想它会是什么样子。
-
不确定这是否是原因,但使用SlidingDrawer会使整个宽度都属于SlidingDrawer.你无法点击它。这意味着,如果它的位置在底部,当有人打电话给你时,你就无法触摸"接听"按钮。
问题
出现这些问题的原因是什么?
我该如何修复它们并能够正确地展示事物?
其他应用程序如何正确处理?
编辑:关于SlidingDrawer,它的位置、大小和内容区域似乎都有可怕的错误,即使它没有显示给用户,用户也可以看到,也不能触摸透。尽管如此,我不知道为什么,也不知道如何修复它,我也不知道为什么与普通应用程序相比,事情会如此紧张(可能是因为过度绘制,但它真的很慢(。
也许这个问题应该更普遍:如何制作一个像AirCalc一样的浮动窗口,它可以很容易地移动,但仍然很快。
对于拖动功能,我尝试获取我显示的根视图(类型为WindowManager.layoutParams(的layoutParams,更新它并再次设置它,但由于某种原因,它什么都没做。不知道我做错了什么。
EDIT:我似乎应该使用windowManager.updateViewLayout来更新layoutParams。使用这个帖子,我已经使它变得非常可拖动。
好吧,我对此得出了一些结论,首先回答我最初的问题:
-
这可能是因为透支和我使用过的视图。我想尝试一下可以取代滑动抽屉的库,但每个库都有不同的问题。使用简单的视图证明了这个想法在一般情况下是有效的。
在可见性更改的情况下,它是跳跃的,因为视图的大小无法使用当前的WindowManager.LayoutParams大小来适应。
-
slidingDrawaer确实存在问题,因为它使用了关闭或打开时的整个尺寸。
现在转到其他问题:
-
无法拖动?使用windowManager.updateViewLayout.而不是常规的setLayoutParams
-
无法触摸窗外?根据您的需要设置其最小尺寸。您还可以设置窗口标志,以便触摸事件通过。
-
想收听呼叫事件吗?你可以使用broadcastReceiver来触发应用程序的显示,但我怀疑挂断电话有时可能会导致稍后收到意向。我认为你可以使用telephonyManager并在那里收听事件,使用你在前台运行的服务(我创建的服务只是为了确保应用程序不会在中间关闭(。
如果其他人有问题,我可以帮忙。