背景:我的应用中有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)
在其子项上绘制阴影位图。
我在VerticalViewPager
内部有一个DropShadowFrameLayout
(https://github.com/castorflex/VerticalViewPager),问题是它加深了视图层次结构(已经很复杂),导致滚动故障。
我尝试了什么:我决定通过将阴影绘图代码直接移动到DropShadowFrameLayout
的{{1}}来摆脱dispatchDraw(Canvas canvas)
。这里的问题是ViewPager
仅在最初可见的孩子上绘制阴影,当我滚动它时,阴影会随之移动。当然这不是我期望的行为,因为在子视图移动时阴影必须保持不变。
此方法适用于ViewPager
。
问题是:如何将此方法应用于ListView
?还是有另一种方法可以做到这一点,这在表现方面是否相同?或者,至少,为什么ViewPager
会这样做?
答案 0 :(得分:0)
问题是DropShadowFrameLayout
中的阴影总是在固定位置绘制:
private Rect getDropShadowArea(Canvas canvas, Bitmap bm) {
return new Rect(0, 0, canvas.getWidth(), bm.getHeight());
}
ViewPager
原来使用了他的内部坐标,因此解决方法是调整此方法以了解ViewPager
的当前滚动位置(我使用Y代替X,因为我实际使用{{ 1}},但两者的原理相同:
VerticalViewPager
或者,您可以在绘图前将private Rect getDropShadowArea(Canvas canvas, Bitmap bm) {
return new Rect(0, getScrollY(), canvas.getWidth(),
getScrollY() + bm.getHeight());
}
翻译成canvas
,如果您愿意(感谢pskink)。
每次在getScrollY()
中获取Bitmap
也会导致滚动延迟(部分)。