3

我已经开始开发一个使用覆盖服务在手机上显示实用工具侧边栏的应用程序。

我所做的是在屏幕右侧添加一个小箭头手柄,当用户在它上面滑动时,侧边栏就会出现。

这对果冻豆来说没有问题。从 JB 开始,显示侧边栏的整个过程开始变得动画化。如果它不是到处都动画的话,那将是非常酷的。

我为显示和隐藏侧边栏所做的是一个简单的 updateViewLayout 命令,如下所示。

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        handlesize, WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
        PixelFormat.TRANSLUCENT);
params.gravity = Gravity.RIGHT|Gravity.CENTER_VERTICAL;
wm.updateViewLayout(mOverlay, params);
handleButton.setImageResource(R.drawable.handle);
isCompact=true;

这段代码隐藏了侧边栏。handlesize 变量是句柄的宽度。wm 变量是窗口管理器。所以基本上,我所做的只是显示手柄的宽度,所以其他任何可能在手柄旁边的东西(侧边栏不可见)。我还使用 WRAP_CONTENT 作为高度,以确保吸收触摸事件的唯一部分是手柄使用的区域,以免遮挡屏幕的整个右侧来记录触摸。

WindowManager.LayoutParams params = new WindowManager.LayoutParams(
        WindowManager.LayoutParams.WRAP_CONTENT,
        WindowManager.LayoutParams.MATCH_PARENT,
        WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
        WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
        PixelFormat.TRANSLUCENT);
params.gravity = Gravity.RIGHT|Gravity.CENTER_VERTICAL;
wm.updateViewLayout(mOverlay, params);
handleButton.setImageResource(R.drawable.handle_back);
isCompact=false;

这是显示侧边栏的代码。整个视图的宽度设置为 WRAP_CONTENT,因此它显示所有内容,高度设置为 MATCH_PARENT,因为侧边栏可见时为全高。

现在通常,这段代码应该立即在一个宽度和高度设置之间切换到另一个宽度和高度设置,中间没有任何东西。但自从 Jelly Bean 之后,这已经开始通过一些奇怪的动画来做到这一点。我不确定,但它可能与 Project Butter 有关。

在下面的链接中,您可以看到动画的一些帧。

http://i.stack.imgur.com/QzZGO.png

如果我将视图的高度(即使在关闭时)设置为 MATCH_PARENT,那么动画就在水平面上,所以从右到左,看起来不错。问题是我不想挡住屏幕的整个右侧。在可能在该服务下运行的其他应用程序中,从右侧滑动有很多用途,例如在 Chrome 中切换标签。

所以我的问题是,你知道我应该做些什么来阻止这种行为,或者更好的是,利用它来使侧边栏做一些流畅的动画,但在 Android 2.2 上工作的方式以上?

非常感谢!

4

1 回答 1

6

由于 JB Android 已经为布局更改添加了窗口动画。如果您在开发人员设置中禁用窗口动画,则该行为将停止。此外,您不能以编程方式禁用/启用此功能(如果我没记错,需要系统权限),因此解决方案是完全删除视图并重新附加它。而不是wm.updateViewLayout(view,params)你必须wm.removeView(view)然后wm.addView(view,params)

于 2013-11-28T07:22:56.483 回答