【问题标题】:How to migrate from Gallery to HorizontalScrollView & ViewPager?如何从 Gallery 迁移到 Horizo​​ntalScrollView & ViewPager?
【发布时间】:2012-08-27 17:17:06
【问题描述】:

我需要在 Android 2.2 及更高版本上对图标选择进行简单控制。
Gallery 对我来说是一个更好的解决方案,但它已被弃用,我必须改用 HorizontalScrollViewViewPager
但是如何轻松迁移?在这种情况下如何使用这些类和控件?我试图找到这个主题的完整示例,但我找不到它。

【问题讨论】:

标签: android gallery android-viewpager horizontalscrollview migrate


【解决方案1】:

在 CommonsWare 的链接解决方法中,触摸处理和硬件加速存在各种问题。在我看来,一个更简单、更优雅的解决方案是为 ViewPager 指定负边距:

ViewPager.setPageMargin(
    getResources().getDimensionPixelOffset(R.dimen.viewpager_margin));

然后我在 dimens.xml 中指定了这个维度:

<dimen name="viewpager_margin">-64dp</dimen>

为了补偿重叠页面,每个页面的内容视图都有相反的边距:

android:layout_marginLeft="@dimen/viewpager_margin_fix"
android:layout_marginRight="@dimen/viewpager_margin_fix"

再次在dimens.xml:

<dimen name="viewpager_margin_fix">32dp</dimen>

(注意viewpager_margin_fix 维度是绝对viewpager_margin 维度的一半。)

我们实现了这个in the Dutch newspaper app De Telegraaf Krant

【讨论】:

  • 你的方法看起来很不错,你能展示整个源代码吗?我看不出您是否通过特定处理来处理第一个元素。我无法完全重现该行为。无论如何感谢您的分享!
  • 是的,这种方法的主要问题是您必须手动将重叠指定为维度。这不适用于不同的设备类,因此在我自己的实现中,我将 ViewPager 子类化为在onLayout() 中动态计算它。我经常被要求开源它;当我有空的时候,我会的。同时,另见my answer to a related question的备注。
  • 我很欣赏重定向。我看看能不能解决。
  • 好的,我想我明白了。我需要做更多的工作,但看起来它是路径。
【解决方案2】:

This gist from Dave Smith 展示了一种使用ViewPager 获得与Gallery 非常相似的视觉结果的方法:

引用my blog post on the topicViewPager 中一次显示多个页面:

他的容器 (com.example.pagercontainer.PagerContainer) 包装了ViewPager 并在其自身上调用setClipChildren(false);,因此即使ViewPager 专注于一个选定页面,其他坐标超出ViewPager 边界的页面仍然存在可见,只要它们适合 PagerContainer。通过将ViewPager 的大小设置为小于PagerContainerViewPager 可以将其页面调整为该大小,从而为其他页面留出空间。不过,PagerContainer 需要在触摸事件方面有所帮助,因为ViewPager 只会在其可见边界上处理滑动事件,而忽略任何侧面可见的页面。

您可能还想筛选this android-developers thread,有人指出在较新的 Android 版本上存在此问题。您需要禁用硬件加速due to a bug in ViewPager

【讨论】:

  • 感谢您的回答!但是这个来自 Dave Smith 的示例需要 API 版本 11,而我需要 8...
  • @BArtWell:是什么让您说它需要 API 级别 11? ViewPager 可以追溯到 API 级别 4 AFAIK。
  • "调用需要 API 级别 11(当前最低为 8):android.widget.FrameLayout#setLayerType" in setLayerType(View.LAYER_TYPE_SOFTWARE, null);
  • @BArtWell:你不需要在旧版本的 Android 上调用它。只需在 API 级别 11 上调用它,使用 android.os.Build.VERSION.SDK_INT 检查版本即可。
  • 嗨@CommonsWare。我有几个问题。 1)这个解决方案是否包括任何回收机制? 2) 如何处理选择事件?它是否考虑了选择事件
猜你喜欢
  • 1970-01-01
  • 2011-10-18
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
相关资源
最近更新 更多