【发布时间】:2012-04-30 15:18:25
【问题描述】:
我的应用滚动速度非常快! 如何在我的 android 应用程序中限制滚动视图的滚动速度? 滚动可能非常快,以这种速度滚动毫无意义。
【问题讨论】:
我的应用滚动速度非常快! 如何在我的 android 应用程序中限制滚动视图的滚动速度? 滚动可能非常快,以这种速度滚动毫无意义。
【问题讨论】:
这个帖子很旧,但我会回复一个部分解决方案:限制投掷速度。请随时发表评论,以便我改进我的解决方案。
如开发人员培训指南中所述:
Flinging 是当用户快速拖动和抬起手指时发生的滚动类型。
这就是我需要速度限制的地方。所以,在 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);
}
我发现velocityY(在水平滚动视图中为velocityX)可能在-16000和16000之间。负数只是意味着向后滚动。我仍在测试这个值,而且我只在一台设备上测试过它。不确定在旧设备/API 版本中是否相同。我稍后会回来编辑。
(int) ((Math.min(Math.abs(velocityY), MAX_SCROLL_SPEED) ) * Math.signum(velocityY));
我正在做的是获得我的常数 MAX_SCROLL_SPEED 和原始速度 Y 之间的最小值,然后获得原始速度 Y 的符号。我们需要标志来回滚。
最后,发回修改后的velocityY。
这是一个部分解决方案,因为如果用户一直按下滚动视图,速度不会改变。
再次,请随时改进我的答案,我仍在学习。
【讨论】:
MAX_SCROLL_SPEED 的价值是多少?
ObjectAnimator anim = ObjectAnimator.ofInt(mScrollView, "scrollY", mScrollView.getBottom());
anim.setDuration(9000);
anim.start();
【讨论】:
我认为使用计时器可以限制滚动速度。看这个链接Android: HorizontalScrollView smoothScroll animation time
【讨论】:
这就是我实现平滑垂直滚动的方式(如电影学分)。这也允许用户上下移动滚动,并允许在他们放手时继续滚动。在我的 XML 中,我将 TextView 封装在一个名为“scrollView1”的 ScrollView 中。尽情享受吧!
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);
}
});
【讨论】: