3

私のアプリのスクロールは超高速です!Android アプリでスクロール ビューのスクロール速度を制限するにはどうすればよいですか? スクロールは非常に高速になる可能性があり、その速度でスクロールしても意味がありません。

4

4 に答える 4

12

このスレッドは古いですが、部分的な解決策で返信します: フリング速度を制限します。ソリューションを改善できるように、お気軽にコメントしてください。

開発者トレーニング ガイドで説明されているように:

フリンジは、ユーザーが指をドラッグしてすばやく離したときに発生するスクロールの一種です。

そこで速度制限が必要になりました。そのため、Custom ScrollView (水平または垂直のいずれか) で、このように fling メソッドをオーバーライドします。

@Override
public void fling(int velocityY) {
    int topVelocityY = (int) ((Math.min(Math.abs(velocityY), MAX_SCROLL_SPEED) ) * Math.signum(velocityY));
    super.fling(topVelocityY);
}

速度 Y (水平スクロールビューでは速度 X) が -16000 から 16000 の間であることがわかりました。負の値は、スクロールバックを意味します。この値はまだテスト中で、1 つのデバイスでのみテストしました。古いデバイス/API バージョンで同じかどうかはわかりません。これを編集するために後で戻ってきます。

(int) ((Math.min(Math.abs(velocityY), MAX_SCROLL_SPEED) ) * Math.signum(velocityY));

そこで行っているのは、定数 MAX_SCROLL_SPEED と元の速度 Y の間の最小値を取得してから、元の速度 Y の符号を取得することです。後ろにスクロールするには記号が必要です。

最後に、変更された速度 Y を送り返します。

ユーザーがスクロールビューを押し続けても速度が変わらないため、これは部分的な解決策です。

繰り返しますが、私の答えを自由に改善してください。私はまだ学んでいます。

于 2014-07-30T22:02:06.997 に答える
3
 ObjectAnimator anim = ObjectAnimator.ofInt(mScrollView, "scrollY", mScrollView.getBottom());                               
 anim.setDuration(9000);                     
 anim.start();
于 2014-12-18T08:48:46.970 に答える
0

タイマーを使用すると、スクロールの速度を制限できると思います。このリンクを見て Android: Horizo​​ntalScrollView SmoothScroll アニメーション時間

于 2012-04-30T15:41:53.320 に答える
0

これが、スムーズな縦スクロール (映画のクレジットのような) を実現した方法です。これにより、ユーザーはスクロールを上下に動かしたり、離したときにスクロールを続けることもできます。私の XML では、"scrollView1" という名前の ScrollView 内に TextView をカプセル化しました。楽しみ!

    final TextView tv=(TextView)findViewById(R.id.lyrics);
    final ScrollView scrollView = (ScrollView) findViewById(R.id.scrollView1);
    Button start = (Button) findViewById(R.id.button_start);
    Button stop = (Button) findViewById(R.id.button_stop);
    final Handler timerHandler = new Handler();
    final Runnable timerRunnable = new Runnable() {
        @Override
        public void run() {
            scrollView.smoothScrollBy(0,5);         // 5 is how many pixels you want it to scroll vertically by
            timerHandler.postDelayed(this, 10);     // 10 is how many milliseconds you want this thread to run
        }
    };

    start.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
           timerHandler.postDelayed(timerRunnable, 0);
        }
    });

    stop.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            timerHandler.removeCallbacks(timerRunnable);
        }
    });
于 2015-02-17T22:10:30.380 に答える