为ViewPager投影

时间:2014-03-05 08:39:25

标签: android android-viewpager android-custom-view

背景:我的应用中有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内部有一个DropShadowFrameLayouthttps://github.com/castorflex/VerticalViewPager),问题是它加深了视图层次结构(已经很复杂),导致滚动故障。

我尝试了什么:我决定通过将阴影绘图代码直接移动到DropShadowFrameLayout的{​​{1}}来摆脱dispatchDraw(Canvas canvas)。这里的问题是ViewPager 仅在最初可见的孩子上绘制阴影,当我滚动它时,阴影会随之移动。当然这不是我期望的行为,因为在子视图移动时阴影必须保持不变。

此方法适用于ViewPager

问题是:如何将此方法应用于ListView?还是有另一种方法可以做到这一点,这在表现方面是否相同?或者,至少,为什么ViewPager会这样做?

1 个答案:

答案 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也会导致滚动延迟(部分)。