ViewPager的阴影效果

4
背景:我在我的应用程序中有一个DropShadowFrameLayout,它是一个容器,仅用于在其子视图上绘制阴影。就像ListView上下的阴影一样。

它基于这篇文章:http://proandroiddev.blogspot.ru/2012/01/android-design-tip-drop-shadows-on.html

Cyril Mottier也建议使用相同的方法:http://cyrilmottier.com/2012/06/08/the-making-of-prixing-3-polishing-the-sliding-app-menu/

它只是覆盖了dispatchDraw(Canvas canvas)来在它的子视图上绘制阴影位图。

我有一个VerticalViewPagerhttps://github.com/castorflex/VerticalViewPager),它位于DropShadowFrameLayout内部,问题是它加深了视图层次结构(已经很复杂了),导致滚动出现故障。 我尝试过:决定通过将阴影绘制代码直接移动到ViewPagerdispatchDraw(Canvas canvas)中来摆脱DropShadowFrameLayout。问题在于ViewPager只在最初可见的子元素上绘制阴影,当我滚动它时,阴影会随之移动。当然,这不是我期望的行为,因为阴影必须保持静止,而子视图则移动。
这种方法对ListView效果很好。 问题是:我如何将此方法应用于ViewPager?或者还有其他性能相等的做法吗?或者,至少,为什么ViewPager会表现出这种行为?

2
所以你的意思是ViewPager.dispatchDraw只被调用一次??? - pskink
不,它被调用了很多次,但是不知何故阴影总是绘制在同一个位置(就像它是在子元素中绘制的,而不是在其上方)。 - Vasily Sochinsky
1
通过 getScrollX/Y 来平移画布。 - pskink
是的,我已经明白了,你的第一条评论很有启发性,谢谢。 - Vasily Sochinsky
顺便说一句,似乎滚动卡顿是由于在dispatchDraw中每次创建位图而不是层次深度引起的。早该猜到了... - Vasily Sochinsky
1
下次您可以使用Traceview找出瓶颈。 - pskink
1个回答

0
问题在于 DropShadowFrameLayout 中的阴影总是绘制在固定的位置: private Rect getDropShadowArea(Canvas canvas, Bitmap bm) { return new Rect(0, 0, canvas.getWidth(), bm.getHeight()); } 结果发现 ViewPager 使用了其内部坐标,因此解决方案是调整此方法以了解当前ViewPager滚动位置(我使用Y而不是X,因为我实际上使用了VerticalViewPager,但原理对两者都适用): private Rect getDropShadowArea(Canvas canvas, Bitmap bm) { return new Rect(0, getScrollY(), canvas.getWidth(), getScrollY() + bm.getHeight()); } 或者如果你愿意,你可以在绘制之前通过getScrollY()来翻译canvas(感谢pskink)。
另外,滚动延迟部分是由于每次在dispatchDraw()中获取Bitmap导致的。

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