android - 为 ViewPager 放置阴影

标签 android android-viewpager android-custom-view

背景:我的应用程序中有一个 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/

相关文章:

android - 如何在 android 中将 Path (android.graphics.Path) 与 Canvas 一起使用?

java - 如何在android sdk上使用PowerMock

android - 找不到我的 apk 的重新编译版本

从 textview 分享文本的 Android 按钮

android - 如何在 Android 中为每个 ViewPager 显示一个 JSON 对象?

android - 具有约束布局的自定义类,Android Studio 挂起

android - 发送 Android Intent Telegram 聊天机器人

android - 由于未在ViewPager Fragment中的播放器顶部进行未经授权的覆盖,YouTube视频播放停止了

android - FloatingActionButton 在 ViewPager 中不可见

android - 计算位图平铺高度,以便不裁剪最后一项