Android Jelly Bean服务中使用updateViewLayout的奇怪行为

时间:2013-09-20 00:56:03

标签: android animation service android-4.2-jelly-bean

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

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

这对Jelly Bean没有任何影响。从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;

这段代码隐藏了侧边栏。 handleize变量是句柄的宽度。 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及更高版本上?

非常感谢!

1 个答案:

答案 0 :(得分:5)

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