代码之家  ›  专栏  ›  技术社区  ›  Vasily Sochinsky

删除ViewPager的阴影

  •  4
  • Vasily Sochinsky  · 技术社区  · 11 年前

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

    我尝试了什么: 我决定摆脱它 DropShadowFrameLayout 通过将阴影绘制代码直接移动到 dispatchDraw(画布画布) ViewPager 。这里的问题是 查看寻呼机 只在一个最初可见的子对象上绘制阴影,当我滚动它时,阴影会随之移动。 当然,这不是我所期望的行为,因为当子视图移动时,阴影必须是静止的。

    该方法与 列表视图 .

    问题是: 如何将此方法应用于 查看寻呼机 ? 或者,是否有另一种方法可以做到这一点,即同等绩效?或者,至少,为什么 查看寻呼机 这样做?

    1 回复  |  直到 11 年前
        1
  •  0
  •   Community CDub    8 年前

    问题是阴影 DropShadowFrameLayout 总是在固定位置绘制:

    private Rect getDropShadowArea(Canvas canvas, Bitmap bm) { return new Rect(0, 0, canvas.getWidth(), bm.getHeight()); }

    ViewPager 结果是使用了他的内部坐标,因此解决方案是调整此方法以了解当前的滚动位置 查看寻呼机 (我使用Y而不是X,因为我实际上使用 VerticalViewPager ,但两者的原理相同):

    private Rect getDropShadowArea(Canvas canvas, Bitmap bm) { return new Rect(0, getScrollY(), canvas.getWidth(), getScrollY() + bm.getHeight()); }

    或者你可以翻译 canvas 通过 getScrollY() 在画画之前,如果你喜欢的话(谢谢 pskink ).

    滚动延迟也是(部分)由获取 Bitmap 每次在 dispatchDraw() .