1

私は子供としてカスタムを持っており、HorizontalScrollViewそのLinearLayout下に最初の 9 つのカスタム ビューがありLinearLayoutます。

右にスクロールすると、さらに 3 つの子ビューを に追加しLinearLayout、最初の 3 つの子を削除して、一度に 9 つの子ビューしか表示されないようにする必要があります。

ビュー ID に基づいて検出ポイントを追加しましcurrentViewId > lastChildId - 0.33f * viewSizeLimitviewSizeLimit = 9。これが有効な場合は、ビューを に追加/削除しますLinearLayout

私が遭遇した最初の問題は、からビューを削除するLinearLayoutと、子が左にシフトすることです。したがってcurrentViewId = 7、現在のビューが検出ゾーンにある場合、最後に 3 つのビューを追加し、前面から 3 つのビューを削除します。だから今currentViewId = 4シフトによる。

scrollByのメソッドを追加して、HorizontalScrollViewこのビュー シフトを補正し、スクロールがそれほど速くない場合にうまく機能します。

ログの例を次に示します。

07-01 17:01:34.304: INFO/GTA(2476): currentViewId: 6
07-01 17:01:34.304: INFO/GTA(2476): Scroll Distance: 8
07-01 17:01:34.373: INFO/GTA(2476): currentViewId: 6
07-01 17:01:34.383: INFO/GTA(2476): Scroll Distance: 41
07-01 17:01:34.463: INFO/GTA(2476): currentViewId: 7
07-01 17:01:34.463: INFO/GTA(2476): Scroll Distance: 25
07-01 17:01:34.633: INFO/GTA(2476): Added new views to the end
07-01 17:01:34.643: INFO/GTA(2476): currentViewId: 4
07-01 17:01:34.653: INFO/GTA(2476): Scroll Distance: -1440
07-01 17:01:34.653: INFO/GTA(2476): Head View ID: 4 | Tail View ID: 12
07-01 17:01:34.673: INFO/GTA(2476): currentViewId: 7
07-01 17:01:34.673: INFO/GTA(2476): Scroll Distance: 22
07-01 17:01:34.733: INFO/GTA(2476): currentViewId: 7

スクロールビューを高速でスクロール/フリングするときのログは次のとおりです。

07-01 17:03:48.633: INFO/GTA(2476): currentViewId: 6
07-01 17:03:48.643: INFO/GTA(2476): Scroll Distance: 158
07-01 17:03:48.693: INFO/GTA(2476): currentViewId: 6
07-01 17:03:48.704: INFO/GTA(2476): Scroll Distance: 124
07-01 17:03:48.753: INFO/GTA(2476): currentViewId: 7
07-01 17:03:48.753: INFO/GTA(2476): Scroll Distance: 114
07-01 17:03:48.914: INFO/GTA(2476): Added new views to the end
07-01 17:03:48.914: INFO/GTA(2476): currentViewId: 4
07-01 17:03:48.914: INFO/GTA(2476): Scroll Distance: -1440
07-01 17:03:48.914: INFO/GTA(2476): Head View ID: 4 | Tail View ID: 12
07-01 17:03:48.974: INFO/GTA(2476): currentViewId: 10
07-01 17:03:48.974: INFO/GTA(2476): Scroll Distance: 1843
07-01 17:03:49.194: INFO/GTA(2476): Added new views to the end
07-01 17:03:49.204: INFO/GTA(2476): currentViewId: 7
07-01 17:03:49.204: INFO/GTA(2476): Scroll Distance: -1440
07-01 17:03:49.204: INFO/GTA(2476): Head View ID: 7 | Tail View ID: 15
07-01 17:03:49.253: INFO/GTA(2476): currentViewId: 14
07-01 17:03:49.264: INFO/GTA(2476): Scroll Distance: 1866
07-01 17:03:49.403: INFO/GTA(2476): Added new views to the end
07-01 17:03:49.414: INFO/GTA(2476): currentViewId: 11
07-01 17:03:49.414: INFO/GTA(2476): Scroll Distance: -1440
07-01 17:03:49.414: INFO/GTA(2476): Head View ID: 10 | Tail View ID: 18
07-01 17:03:49.463: INFO/GTA(2476): currentViewId: 18
07-01 17:03:49.463: INFO/GTA(2476): Scroll Distance: 1551
07-01 17:03:49.703: INFO/GTA(2476): Added new views to the end
07-01 17:03:49.713: INFO/GTA(2476): currentViewId: 15
07-01 17:03:49.713: INFO/GTA(2476): Scroll Distance: -1440
07-01 17:03:49.713: INFO/GTA(2476): Head View ID: 13 | Tail View ID: 21

ログから、HorizontalScrollViewそれ自体が非常に大量にスクロールすることがわかります (つまり、1843 年、1866 年、1551 年)。表示されている-1440値はscrollBy、ビューポートに適切なビューを表示するために追加した補正です。

HorizontalScrollViewしたがって、問題は、スクロール自体が非常に長い距離を移動する理由がわからないことです。この発生の理由はありますか?

を使用する以外に、これを実装するより良い方法はありますHorizontalScrollViewか?

これにはゲーム エンジンの使用を検討する必要がありますか?

ありがとう。

4

1 に答える 1

0

基本的に水平の ListView である Gallery を使用することをお勧めします。

SpinnerAdapter の実装は、ギャラリーに領域の 1/9 の幅のビューを提供しますが、それ以外は標準的な実装です。これにより、無制限のスクロールが可能になり(要件を理解していると仮定して)、探している効果が得られると思います。また、所定の位置にスナップするという嬉しい副作用もあります。

お役に立てば幸いです。

于 2011-07-01T09:50:24.003 に答える