30

画像で水平スクロールビューを使用し、ボタンを使用してさまざまな画像の場所にスムーズにスクロールするという状況があります。今は問題なく動作します。滑らかなスクロール方法を遅くする方法、つまりアニメーション時間を長くする方法を誰かが知っているかどうか疑問に思っていましたか? 現在、スナップはかなり迅速に行われます。

おそらくスムーズスクロールをオーバーライドして、これ/例を検索しようとしましたが、うまくいきませんでした。

アイデアはありますか?

ありがとう、

4

7 に答える 7

61

いかがですか:

ObjectAnimator animator=ObjectAnimator.ofInt(yourHorizontalScrollView, "scrollX",targetXScroll );
animator.setDuration(800);
animator.start();
于 2013-07-22T12:37:24.387 に答える
15

これは1つの方法であり、私にとってはうまく機能します。

    new CountDownTimer(2000, 20) { 

        public void onTick(long millisUntilFinished) { 
            hv.scrollTo((int) (2000 - millisUntilFinished), 0); 
        } 

        public void onFinish() { 

        } 
     }.start();

したがって、ここでは、水平スクロールビュー(hv)が2秒で位置0から2000に移動するか、2000pxより小さい場合はビューの最後に移動します。調整が簡単...

于 2011-03-04T12:45:12.520 に答える
13

Horizo​​ntalScrollView をサブクラス化し、リフレクションを使用して Horizo​​ntalScrollView のプライベート フィールドにアクセスしますmScroller。もちろん、基礎となるクラスがフィールド名を変更すると、これは壊れます。デフォルトでは元のスクロール実装に戻ります。

呼び出しmyScroller.startScroll(scrollX, getScrollY(), dx, 0, 500);はスクロール速度を変更します。

private OverScroller myScroller;     

private void init()
{
    try
    {
        Class parent = this.getClass();
        do
        {
            parent = parent.getSuperclass();
        } while (!parent.getName().equals("android.widget.HorizontalScrollView"));

        Log.i("Scroller", "class: " + parent.getName());
        Field field = parent.getDeclaredField("mScroller");
        field.setAccessible(true);
        myScroller = (OverScroller) field.get(this);

    } catch (NoSuchFieldException e)
    {
        e.printStackTrace();
    } catch (IllegalArgumentException e)
    {
        e.printStackTrace();
    } catch (IllegalAccessException e)
    {
        e.printStackTrace();
    }
}

public void customSmoothScrollBy(int dx, int dy)
{
    if (myScroller == null)
    {
        smoothScrollBy(dx, dy);
        return;
    }

    if (getChildCount() == 0)
        return;

    final int width = getWidth() - getPaddingRight() - getPaddingLeft();
    final int right = getChildAt(0).getWidth();
    final int maxX = Math.max(0, right - width);
    final int scrollX = getScrollX();
    dx = Math.max(0, Math.min(scrollX + dx, maxX)) - scrollX;

    myScroller.startScroll(scrollX, getScrollY(), dx, 0, 500);
    invalidate();
}

public void customSmoothScrollTo(int x, int y)
{
    customSmoothScrollBy(x - getScrollX(), y - getScrollY());
}
于 2012-11-30T04:39:22.373 に答える
1

そのスクローラーは、自動的かつ継続的にスクロールします。画像のリストを連続してスクロールすると、クレジット画面が表示されるようにしました。これはあなたを助けるか、あなたにいくつかのアイデアを与えるかもしれません.

https://github.com/blessenm/SlideshowDemo

于 2012-03-11T08:06:48.383 に答える
0

.smoothScrollToPositionFromTop代わりに使用してください。例

listView.smoothScrollToPositionFromTop(scroll.pos(),0,scroll.delay());

wherescrollは、現在の画面位置を取得するクラスの単純な変数であり、スムーズ スクロールの新しい位置と時間を.get()返します... など.pos().delay

于 2017-01-28T10:33:28.427 に答える
-5

http://developer.android.com/reference/android/widget/Scroller.htmlをご覧ください。

スクロールの継続時間はコンストラクターで渡すことができ、スクロール アニメーションにかかる最大時間を指定します。

于 2011-03-04T12:33:56.600 に答える