紛らわしいタイトルで申し訳ありませんが、問題を非常に簡潔に表現することはできません...
循環/「無限」アダプターを使用するListViewを備えたAndroidアプリがあります。これは、基本的に、上下にスクロールできることを意味し、アイテムが上または下に達すると折り返され、ユーザーには、無限に長いリスト (~100) の繰り返しアイテムを回転させているかのように表示されます。
このセットアップのポイントは、リストビューをスピン/フリングして、どこで停止するかを待つだけで、ユーザーがランダムなアイテムを選択できるようにすることです。リストビューのフリクションを減らして、少し速く長く飛ばすようにしました。これは非常にうまく機能しているようです。最後に、ListView の上に部分的に透明な画像を配置して、上部と下部のアイテムをブロックし (透明から黒への移行)、ユーザーが真ん中のアイテムを「選択」しているように見せます。彼らは飛び回ることによって制御する回転する「ホイール」に乗っていました。
明らかな問題が 1 つあります。ListView をフリングした後、特定の項目で停止せず、2 つの項目の間でホバリングを停止する可能性があります (最初に表示された項目が部分的にしか表示されない場合)。その場合、どのアイテムが「ランダムに選択された」かが明らかではないため、これを避けたいと思います。
簡単に言えば、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;
}
}
});
これは、1 つの明白な問題を除けば、かなりうまく機能します... 最初に表示されるアイテムは、1 ピクセルまたは 2 ピクセルしか表示されない場合があります。その場合、 2 番目の表示項目が選択されるように、これらの 2 つのピクセルに対して ListView を「上に」ジャンプさせます。代わりに、もちろん、最初に表示されている項目が選択されます。つまり、ListView はほぼ行全体 (これらの 2 ピクセルを差し引いたもの) を "下に" ジャンプします。
つまり、最初に表示されているアイテムにジャンプするのではなく、最も表示されているアイテムにジャンプしたいのです。最初に表示されているアイテムが半分未満しか表示されていない場合は、2 番目に表示されているアイテムにジャンプしたいと考えています。
これが私の要点をうまく伝えている図です。(各ペアの) 左端の ListView は、フリングが停止した後の状態 (停止する場所) を示し、右側の ListView は、最初の表示項目を選択して「ジャンプ」した後の状態を示します。左側に現在の (間違った) 状況を示します。アイテム B はほとんど見えませんが、まだ最初に表示されているアイテムであるため、listView がジャンプしてそのアイテムを選択します。これは、アイテムの高さのほぼ全体をスクロールする必要があるため、論理的ではありません。そこに着くために。アイテム C (右側に示されている) にスクロールする方がはるかに論理的です。
(出典: nickthissen.nl )
どうすればこの動作を実現できますか? 私が考えることができる唯一の方法は、最初に表示されているアイテムがどれだけ表示されているかを何らかの方法で測定することです。それが 50% を超える場合は、その位置にジャンプします。50% 未満の場合は、その位置 + 1 にジャンプします。ただし、それを測定する方法がわかりません...
何か案は?