抱歉标题混乱,我不能非常简洁地表达这个问题......
我有一个带有 ListView 的 Android 应用程序,它使用圆形/“无限”适配器,这基本上意味着我可以根据需要向上或向下滚动它,并且当它到达顶部或底部时,这些项目会环绕,使它看起来对用户来说,就好像他正在旋转一个无限长的(~100)重复项目列表。
此设置的目的是让用户选择一个随机项目,只需旋转/翻转列表视图并等待查看它停止的位置。我减少了 Listview 的摩擦力,因此它的弹跳速度更快,时间更长,这似乎真的很好用。最后,我在 ListView 顶部放置了一个部分透明的图像,以遮挡顶部和底部的项目(从透明到黑色的过渡),使用户看起来好像正在“选择”中间的项目,就好像他们在他们通过投掷控制的旋转“轮子”上。
有一个明显的问题:在抛出 ListView 后不会停在特定项目上,但它可以停止在两个项目之间悬停(第一个可见项目然后只显示部分)。我想避免这种情况,因为在这种情况下,哪个项目被“随机选择”并不明显。
长话短说:在 ListView 完成滚动后,我希望它停止在“整个”行上,而不是在部分可见的行上。
现在我通过检查滚动何时停止来实现此行为,然后选择第一个可见项目,如下所示:
lv = this.getListView();
lv.setFriction(0.005f);
lv.setOnScrollListener(new OnScrollListener() {
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE)
{
if (isAutoScrolling) return;
isAutoScrolling = true;
int pos = lv.getFirstVisiblePosition();
lv.setSelection(pos);
isAutoScrolling = false;
}
}
});
这工作得相当好,除了一个明显的问题......第一个可见项目可能只对一两个像素可见。在这种情况下,我希望 ListView 为这两个像素“向上”跳转,以便选择第二个可见项。相反,当然,第一个可见项被选中,这意味着 ListView 几乎“向下”跳了一整行(减去这两个像素)。
简而言之,我不想跳到第一个可见项目,而是希望它跳到最可见的项目。如果第一个可见项目不到一半可见,我希望它跳到第二个可见项目。
这是一个插图,希望能传达我的观点。最左边的 ListView (每对)显示了投掷停止后的状态(停止的地方),右边的 ListView 显示了它通过选择第一个可见项目进行“跳跃”后的样子。在左侧,我显示了当前(错误)的情况:项目 B 几乎不可见,但它仍然是第一个可见项目,因此 listView 跳转以选择该项目 - 这是不合逻辑的,因为它必须滚动几乎整个项目高度到那里。滚动到项目 C(如右图所示)会更合乎逻辑,因为它“更接近”。
(来源:nickthissen.nl)
我怎样才能实现这种行为?我能想到的唯一方法是以某种方式测量第一个可见项目有多少是可见的。如果超过 50%,那么我跳到那个位置。如果它小于 50%,我跳到那个位置 + 1。但是我不知道如何测量它......
有任何想法吗?