onScrollStateChanged在Scroll_State_Idle时不会平滑滚动
问题描述:
我得到了一个listView,其中包含全屏中具有相同高度的多个项目。当我释放滚动时,我想自动滚动到该项目,这会占用屏幕上最多的空间。当我滚动到一个随机位置并点击一个按钮(例如,当firstVisible项目的60%可见并且以下项目的40%可见时,它会自动顺利滚动到第一个可见项目, OnClick)看代码:onScrollStateChanged在Scroll_State_Idle时不会平滑滚动
ListView mylistView= (ListView)findViewById(R.id.ListViewLayout);
int midScreen = mylistView.getMeasuredHeight()/2;
public void onClick(View v) {
View v = mylistView.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();
top =-top;
if (top <= midScreen) {
mylistView.smoothScrollBy(-top, 1000); // if first item takes more space, scroll up
} else {
mylistView.smoothScrollBy((midScreen*2)-top, 1000); // if second item takes more space, scroll down
}
现在我想要这个工作过程被调用,当列表停止滚动。我创建了一个onScrollListener和onScrollStateChanged我想这如果listScroll停止(所以状态0,空闲):
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState==OnScrollListener.SCROLL_STATE_IDLE) {
View vX = mylistView.getChildAt(0);
int top = (vX == null) ? 0 : vX.getTop();
top =-top;
if (top <= midScreen) {
mylistView.smoothScrollBy(-top, 1000);
} else mylistView.smoothScrollBy((midScreen*2)-top, 1000);
}
}
的问题:不是滚动平滑1秒到准确的位置,以显示全屏想要的项目,它跳得尽可能快。 smoothScrollBy在状态0中被调用时不再平滑。为什么是这样的,并且有没有解决方案?
答
好吧,我设法运行一个可处理的runnable中的smoothScroll,现在它的工作原理! 如果有人有同样的问题,这里来的代码
listViewAnlagen.setOnScrollListener(new OnScrollListener() {
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState==OnScrollListener.SCROLL_STATE_IDLE) {
View vX = listViewAnlagen.getChildAt(0);
int top = (vX == null) ? 0 : vX.getTop();
top =-top;
if (top <= mitteScreen) {
handler.post(obenRunnable);
} else {
handler.post(untenRunnable);
}
}
}
Handler handler = new Handler();
Runnable obenRunnable = new Runnable()
{
public void run()
{
View vX = listViewAnlagen.getChildAt(0);
int top = (vX == null) ? 0 : vX.getTop();
top =-top;
listViewAnlagen.smoothScrollBy(-top, 200);
}
};
Runnable untenRunnable = new Runnable()
{
public void run()
{
View vX = listViewAnlagen.getChildAt(0);
int top = (vX == null) ? 0 : vX.getTop();
top =-top;
listViewAnlagen.smoothScrollBy((mitteScreen*2)-top, 200);
}
};
});
答
我想你可以做一些这样的事情,让顺利滚动。
public void scrollSmoothTopAfterMiddle(final int top) {
final ValueAnimator anim = ValueAnimator.ofInt(top, 0);
anim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(final ValueAnimator animation) {
final int value = (Integer) animation.getAnimatedValue();
mListView.smoothScrollBy((midScreen * 2) - top, value);
}
});
anim.setDuration(250);
anim.setInterpolator(new DecelerateInterpolator());
anim.start();
}
public void scrollSmoothTopBeforeMiddle(final int top) {
final ValueAnimator anim = ValueAnimator.ofInt(top, 0);
anim.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(final ValueAnimator animation) {
final int value = (Integer) animation.getAnimatedValue();
mListView.smoothScrollBy(-top, value);
}
});
anim.setDuration(250);
anim.setInterpolator(new DecelerateInterpolator());
anim.start();
}
if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
final View vX = mListView.getChildAt(0);
int top = (vX == null) ? 0 : vX.getTop();
top = -top;
if (top <= midScreen) {
scrollSmoothTopBeforeMiddle(-top);
} else {
scrollSmoothTopAfterMiddle((midScreen * 2) - top);
}
}
谢谢@anderson_acs的帮助。我对代码进行了一些优化(只转发顶部:scrollSmoothTopAfterMiddle(顶部)),但现在它快速滚动而不像以前那样将动画移动到正确的位置,并且滚动所需的距离,但是SMOOTHLY。换句话说,我释放手指在滚动 - >右侧位置非平滑滚动 - >进一步滚动到右侧位置平滑滚动的距离。请问我是否表达自己的sl。。任何改进想法?再次感谢 – Simsala 2014-09-05 09:22:49
@Simsala,我很抱歉,但我无法真正理解你想说什么,你试图增加哪些部分? – 2014-09-05 15:18:21