Android Jelly Bean服务中updateViewLayout的行为异常

3
我开始开发一个应用程序,使用叠加服务在手机上显示实用侧边栏。我的做法是在屏幕右侧添加一个小箭头,当用户滑过它时,侧边栏出现。这个方法在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;

这段代码可以隐藏侧边栏。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及以上的方式?
非常感谢!

我在我的服务中遇到了完全相同的问题。你找到解决方案了吗?如果你能分享任何见解,我会非常感激。 - RufusInZen
很遗憾,还没有。我已经问过周围的人,但是没有得到任何答案。你在这段时间里有找到什么吗? - user2797447
是的,我找到了解决方案。请看下面的答案。 - RufusInZen
1个回答

6

自从JB Android添加了窗口动画以更改布局后,如果您在开发者设置中禁用窗口动画,则该行为将停止。此外,您无法通过编程方式禁用/启用此功能(如果我记得正确,则需要系统权限),因此解决方案是完全删除视图并重新附加它。与wm.updateViewLayout(view,params)不同,您必须使用wm.removeView(view),然后再使用wm.addView(view,params)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接