背景:我的应用程序中有一个 DropShadowFrameLayout
,它是一个仅用于在其 subview 上绘制阴影的容器。就像 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)
以在其子项上绘制阴影位图。
我在 DropShadowFrameLayout
中有一个 VerticalViewPager
( https://github.com/castorflex/VerticalViewPager ),问题是它加深了 View 层次结构(已经很复杂),导致滚动故障。
我的尝试:我决定通过将阴影绘制代码直接移动到 dispatchDraw(Canvas canvas)
来摆脱 DropShadowFrameLayout
一个 ViewPager
。这里的问题是 ViewPager
只在最初可见的 child 上绘制阴影,当我滚动它时,阴影会随之移动。当然这不是我期望的行为,因为在 subview 移动时阴影必须静止。
此方法适用于 ListView
。
问题是如何将此方法应用于ViewPager
?还是有另一种方法可以做到这一点,这在性能方面是平等的?或者,至少,为什么 ViewPager
会这样?
最佳答案
问题是 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) {
返回新的 Rect(0, getScrollY(), canvas.getWidth(),
getScrollY() + bm.getHeight());
}
或者如果您愿意,您可以在绘制之前通过 getScrollY()
翻译 canvas
(感谢 pskink)。
此外,滚动延迟(部分)是由于每次在 dispatchDraw()
中获取 Bitmap
造成的。
关于android - 为 ViewPager 放置阴影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22192506/