私のアプリのスクロールは超高速です!Android アプリでスクロール ビューのスクロール速度を制限するにはどうすればよいですか? スクロールは非常に高速になる可能性があり、その速度でスクロールしても意味がありません。
4 に答える
このスレッドは古いですが、部分的な解決策で返信します: フリング速度を制限します。ソリューションを改善できるように、お気軽にコメントしてください。
開発者トレーニング ガイドで説明されているように:
フリンジは、ユーザーが指をドラッグしてすばやく離したときに発生するスクロールの一種です。
そこで速度制限が必要になりました。そのため、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 を送り返します。
ユーザーがスクロールビューを押し続けても速度が変わらないため、これは部分的な解決策です。
繰り返しますが、私の答えを自由に改善してください。私はまだ学んでいます。
ObjectAnimator anim = ObjectAnimator.ofInt(mScrollView, "scrollY", mScrollView.getBottom());
anim.setDuration(9000);
anim.start();
タイマーを使用すると、スクロールの速度を制限できると思います。このリンクを見て Android: HorizontalScrollView SmoothScroll アニメーション時間
これが、スムーズな縦スクロール (映画のクレジットのような) を実現した方法です。これにより、ユーザーはスクロールを上下に動かしたり、離したときにスクロールを続けることもできます。私の 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);
}
});