【问题标题】:Android (list)view overscroll like Sense UIAndroid (list)view 像 Sense UI 一样滚动
【发布时间】:2011-08-12 15:15:49
【问题描述】:

我在 google 和 stackoverflow 上搜索了一段时间,但找不到解决方案。 是否有可能像 sense ui 那样在 Android 2.2 或 2.1 上获得列表视图过度滚动?! 就像在我的警报视图中一样:AlarmView Sense UI

【问题讨论】:

  • 我认为 Overscroll 是在 Android 操作系统中实现的,用户无法配置。我知道 CyanogenMod 已经实现了这个
  • 你能详细说明一下sense ui的作用吗?
  • @Ted Hopp 当然,感觉 UI 过度滚动有点像 iPhone。您可以将视图向下拉,使其平稳下降,然后释放,然后视图再次滑回顶部。这是我的 HTC Desire 警报视图中的图像:AlarmView Sense UI 也许有任何现有的视图?
  • 不幸的是,用于过度滚动的 API 直到 2.3 或更高版本才发布。但是,如果您愿意根据需要将 AOSP 源复制和修改到您的工作区中,这显然是可能的。 UberMusic 和 ADW EX 都为 2.1+ 提供过度滚动。

标签: android listview android-overscoll


【解决方案1】:

看到 Chirag 的回答得到如此高的评价,我感到很震惊。它对任何人都没有帮助,因为它不完整且无法构建。它也没有引用其来源。

原始代码在这里:http://code.google.com/p/scroll-pager/

另请注意,滚动页面代码是在 GPL 许可下发布的。

更新: 我和 scroll-pager 的作者谈过,他现在已经切换到 MIT 许可证。

【讨论】:

  • 是否可以让它为listView(或任何其他adapterView)工作?
【解决方案2】:

Listview 内置了对过度滚动的支持。查看setOverscrollMode 和相关方法setOverscrollHeadersetOverscrollFooter。 ListView 通过覆盖AbsListView.onOverscrolled 来使用过度滚动的页眉/页脚;如果你想要不同的行为,你可以自己重写来实现它。

【讨论】:

  • 这些方法是从 Android API Level 9 (2.3) 开始实现的,但不是在 2.1 或 2.2 中实现的
【解决方案3】:

http://developer.android.com/reference/android/widget/ScrollView.html

您永远不应该将 ScrollView 与 ListView 一起使用,因为 ListView 负责自己的垂直滚动。最重要的是,这样做会破坏 ListView 中处理大型列表的所有重要优化,因为它有效地强制 ListView 显示其整个项目列表以填充 ScrollView 提供的无限容器。

【讨论】:

    【解决方案4】:

    我可以看到这篇文章很老了,但我最近发布了this open-source project on GitHub,它解决了这个问题,并且可以帮助其他人在未来解决类似的过度滚动问题。

    它基本上为许多核心 Android 可滚动视图提供了类似 iOS 的过度滚动效果 - ListView 就是其中之一,并且非常易于应用。

    特别是对于列表视图,您所要做的就是启用它:

    ListView listView = ... // For example: (ListView) findViewById(R.id.list_view);
    OverScrollDecoratorHelper.setUpOverScroll(listView);
    

    要将项目包含在您的项目中,请将其添加到您的 build.gradle:

    dependencies {
        // ...
    
        compile 'me.everything:overscroll-decor-android:1.0.0'
    }
    

    【讨论】:

      【解决方案5】:

      在您的 xml 文件中定义滚动视图。

      然后在你的 java 文件中写下这个:

      scrollView = (ScrollView) findViewById(R.id.scr);
          contentView = (ViewGroup) findViewById(R.id.r2);
          scrollView.setOnTouchListener(new ScrollPager(scrollView, contentView));
          scrollView.post(new Runnable() {
              public void run() {
                  scrollView.scrollTo(0, contentView.getPaddingTop());
              }
          });
      

      并在上面的java文件中添加一个类:

      public class ScrollPager implements OnTouchListener
      public ScrollPager(ScrollView aScrollView, ViewGroup aContentView)
          {
              mScrollView = aScrollView;
              mContentView = aContentView;
              scroller = new Scroller(mScrollView.getContext(), new OvershootInterpolator());
              task = new Runnable()
              {
                  public void run()
                  {
                      scroller.computeScrollOffset();
                      mScrollView.scrollTo(0, scroller.getCurrY());
      
                      if (!scroller.isFinished())
                      {
                          mScrollView.post(this);
                      }
                  }
              };
          }
      

      【讨论】:

      • 这是不完整的,甚至没有编译,这里引用源代码是诚实的事情......
      • 我确实做到了,它甚至没有编译,它只是代码块,完整的项目可以在@Jozua 的答案中找到。
      • @Rotemmiz 所以继续他的回答。我不建议你使用我的代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 2018-02-11
      • 2013-10-06
      相关资源
      最近更新 更多