iPhoneのようなAndroidの水平scrollview振る舞う(ページング)

? Davide Vosti @ | Original: StackOverFlow

私はHorizontalScrollView内部のLinearLayoutを持っている。コンテンツは単なるイメージです。スクロールしながら、私は(移動を継続しない、リスト上のすべてのページで停止する必要があり、リストをスクロールする) HSWのiPhoneと同等上のページングオプションを設定するときに取得、同じ動作を実現する必要があります。

これはどのようにアンドロイドで行われます?私は、これは自分で機能の有効化または設定するには、特定のプロパティまたは実装するために、HSVのサブクラスがある実装する必要がありますか?

Top 5 答え

1Davide Vosti @

だから、私の解決策は、次のとおりです。

Intercept the onTouch event and calculate whether the page should change to the next or keep on the current Inherit from HorizontalScrollView and override the method computeScroll

この方法は、リストを移動するために呼び出さcomputeScroll 。デフォルトでは、私はそれが一定の割合で減速するように実装さだとします... 私はこの運動をしたくないので、私はちょうど身体をspecifingせずにそれを上書きします。

イベントハンドラのコードは次のとおりです。

_scrollView.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_UP)
            {
                float currentPosition = _scrollView.getScrollX();
                float pagesCount = _horizontalBar.getChildCount();
                float pageLengthInPx = _horizontalBar.getMeasuredWidth()/pagesCount;
                float currentPage = currentPosition/pageLengthInPx;

                Boolean isBehindHalfScreen =  currentPage-(int)currentPage > 0.5;

                float edgePosition = 0;
                if(isBehindHalfScreen)
                {
                    edgePosition = (int)(currentPage+1)*pageLengthInPx;
                }
                else
                {
                    edgePosition = (int)currentPage*pageLengthInPx;
                }

                _scrollView.scrollTo((int)edgePosition, 0);
            }

            return false;
        }
    });

そして、私の継承されたHorizontalScrollViewで

@Override
    public void  computeScroll  (){
        return;
    }
2aveyD @

私はここで素敵なソリューションに出くわした:

[横ポケットベル] [1]

これはここにコードのクリーンアップGitHubのバージョンです:

[リアルビュースイッチャ] [2]

それはちょうど画像にそれを使用するためのやり過ぎのように思えるかもしれませんが、このソリューションは少しトリックを使用して無限のページングが可能に(すなわち、次の場合、最後のページの最初のページにあなたが最後のページへと戻ってスクロールすることができたときには、最初のページを楽しみにスクロールできます) 。また、あなたがページの未知の数を持っているし、動的に別の小さなトリックを使用してコンテンツを生成することができます。第二リンクで私のコメントを参照してくださいhttp://marcreichelt.blogspot.com/2010/09/android-use-realviewswitcher-to-switch.html?showComment=1300309034192#c6685928714729240104

私はこれを達成する方法の詳細については。

この情報がお役に立てば幸い。

[1]: https://github.com/ysamlan/horizontalpager

[2]: http://marcreichelt.blogspot.com/2010/09/android-use-realviewswitcher-to-switch.html

3Patrick Boos @

アンドロイドの新しい互換パッケージ(リビジョン3)はそれを行うViewPagerを追加しました。

http://developer.android.com/sdk/compatibility-library.html

4David Hernandez @

私は、同じ効果を得るために別の方法を見つけたと私はより読みやすいと思います。ここに方法は以下のとおりです。

@Override
        public boolean onTouch(View v, MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_UP)
            {
                float currentPosition = hsv.getScrollX();
                float pagesCount = hsv.getChildCount();
                float pageLengthInPx = hsv.getMeasuredWidth()/pagesCount;

                int page = (int) (Math.floor((currentPosition - pageLengthInPx / 2) / pageLengthInPx) + 1);
                hsv.scrollTo((int) (page * pageLengthInPx), 0);
            }

            return false;
        }