有一个 ListView,当 Activity 开始时,我希望它从底部滚动到顶部。我可以通过在 onCreate
中设置 myListView.setStackFromBottom(true)
来实现此功能,以便在 Activity 加载时列表位于底部。
然后我重写onWindowFocusChanged
并使用smoothScrollToPosition(0)
将列表滚动到顶部。但是,我需要滚动速度在到达顶部时逐渐减慢,类似于快速滑动的情况。有没有办法通过动画或其他方式来做到这一点?
谢谢。
最佳答案
您可以使用CountDownTimer
编写自己的滚动条。
import android.content.Context;
import android.os.CountDownTimer;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.animation.AnticipateOvershootInterpolator;
import android.view.animation.Interpolator;
import android.widget.ScrollView;
public class SmoothScrollView extends ScrollView {
private static final long SCROLL_DURATION = 1500; //milliseconds
//interpolator for scroller
private static final Interpolator INTERPOLATOR = new AnticipateOvershootInterpolator(1);
private SmoothScroller smoothScroller;
public SmoothScrollView(Context context) {
this(context, null, 0);
}
public SmoothScrollView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public SmoothScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setSmoothScrollingEnabled(true);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (smoothScroller != null)//we are scrolling
return true;
else return super.onTouchEvent(ev);
}
@Override
public boolean executeKeyEvent(KeyEvent ev) {
if (smoothScroller != null)//we are scrolling
return true;
else return super.executeKeyEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (smoothScroller != null)//we are scrolling
return true;
else return super.onInterceptTouchEvent(ev);
}
public void smoothScrollTo(int scrollX, int scrollY) {
if (smoothScroller != null) {
smoothScroller.cancel();
}
int deltaY = scrollY - getScrollY();
int deltaX = scrollX - getScrollX();
smoothScroller = new SmoothScroller(SCROLL_DURATION, getScrollX(), getScrollY(), deltaX, deltaY);
smoothScroller.start();
}
private class SmoothScroller extends CountDownTimer {
private int fromX;
private int fromY;
private int deltaX;
private int deltaY;
private float scrollTime;
public SmoothScroller(long scrollTime, int fromX, int fromY, int deltaX, int deltaY) {
super(scrollTime, 1);
this.scrollTime = scrollTime;
this.fromX = fromX;
this.fromY = fromY;
this.deltaX = deltaX;
this.deltaY = deltaY;
}
@Override
public void onTick(long millisUntilFinished) {
float delta = (scrollTime - millisUntilFinished) / scrollTime;
delta = INTERPOLATOR.getInterpolation(delta);
int x = fromX + ((int) (delta * deltaX));
int y = fromY + ((int) (delta * deltaY));
smoothScrollTo(x, y);
}
@Override
public void onFinish() {
float delta = 1f;
int x = fromX + ((int) (delta * deltaX));
int y = fromY + ((int) (delta * deltaY));
smoothScroller = null;
scrollTo(x, y);
}
}
}
我用的就是这个。只需根据您的需要更改 INTERPOLATOR
和 SCROLL_DURATION
并调用 smoothScrollTo
而不是 scrollTo
。
我非常确定将 ScrollView
更改为 ListView
不会导致任何问题。
关于android - 从下到上滚动 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23746144/