安卓中的列表视图超出滚动效果类似于Sense UI

5

我在Google和StackOverflow上搜索了一段时间,但是我找不到解决方案。 是否有可能在Android 2.2或2.1上像sense ui那样获得listview overscroll? 就像在我的闹钟视图中这样:AlarmView Sense UI


我认为Overscroll是在Android操作系统上实现的,用户无法配置。不过我知道CyanogenMod已经实现了这一功能。 - Joe Simpson
1
你能详细说明一下 Sense UI 的作用吗? - Ted Hopp
@Ted Hopp 当然,感觉的UI过度滚动有点像iPhone。你可以向下拉视图,它会平稳地向下滑动,然后释放后视图会回到顶部。 这是我从闹钟视图中拍摄的HTC Desire图片: AlarmView Sense UI 也许有现成的视图可以实现这个效果? - Fabian
不幸的是,超滚动的API直到2.3或更高版本才发布。然而,如果您愿意将AOSP源代码复制并根据需要进行修改,则显然是可能的。UberMusic和ADW EX都为2.1+提供了超滚动功能。 - Tom
5个回答

14

看到Chirag的答案得到如此高的评价,我感到震惊。它并没有帮助任何人,因为它是不完整的且没有进一步建设。它也没有引用来源。

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

另外请注意,scroll-pager代码是根据GPL许可证发布的。

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


能否将其适用于listView(或任何其他adapterView)? - android developer

1
我可以看到这篇文章相当古老,但我最近在GitHub上发布了这个开源项目,它解决了这个问题,并且可以帮助其他人在未来解决类似的over-scroll问题。
基本上,它为许多核心Android可滚动视图提供了类似于iOS的over-scrolling效果 - 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'
}

1

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

在使用 ListView 时,不应该再使用 ScrollView,因为 ListView 已经自己处理了垂直滚动。更重要的是,这样做会破坏 ListView 针对大型列表进行优化的所有重要措施,因为它实际上强制 ListView 显示其整个项目列表以填充 ScrollView 提供的无限容器。


1

这些方法是自Android API Level 9(2.3)开始实现的,但在2.1或2.2中没有。 - Fabian

-5
在您的 XML 文件中定义 ScrollView。
然后在您的 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);
                }
            }
        };
    }

6
这段内容不完整,甚至无法编译,诚实的做法是引用出处... - Rotemmiz
1
我确实这样做了,但它甚至无法编译,它只是代码块,完整的项目可以在@Jozua的答案中找到。 - Rotemmiz
@Rotemmiz继续回答吧。我并没有建议你使用我的代码。 - Chirag Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接