我是Android开发的新手,我想对Scroller小部件(android.widget.Scroller)有所了解。如何为 View 设置动画?是否可以访问Animation对象(如果存在)?如果是这样,怎么办?我已经阅读了源代码,但是找不到任何线索,或者我太新了?
我只是想在Scroller完成滚动后进行一些操作,例如
m_scroller.getAnimation().setAnimationListener(...);
最佳答案
Scroller小部件实际上并没有为您做很多工作。它不触发任何回调,不设置任何动画,它仅响应各种方法调用。
那有什么好处呢?好吧,它完成了所有的计算,例如为您提供帮助,这很方便。因此,您通常要做的是创建一个Runnable,它反复询问Scroller:“我现在的滚动位置应该是什么?我们已经猛扑了吗?”然后,将可运行的对象重新发布到Handler(通常在View上),直到清除完成。
这是我现在正在处理的 fragment 的一个示例:
private class Flinger implements Runnable {
private final Scroller scroller;
private int lastX = 0;
Flinger() {
scroller = new Scroller(getActivity());
}
void start(int initialVelocity) {
int initialX = scrollingView.getScrollX();
int maxX = Integer.MAX_VALUE; // or some appropriate max value in your code
scroller.fling(initialX, 0, initialVelocity, 0, 0, maxX, 0, 10);
Log.i(TAG, "starting fling at " + initialX + ", velocity is " + initialVelocity + "");
lastX = initialX;
getView().post(this);
}
public void run() {
if (scroller.isFinished()) {
Log.i(TAG, "scroller is finished, done with fling");
return;
}
boolean more = scroller.computeScrollOffset();
int x = scroller.getCurrX();
int diff = lastX - x;
if (diff != 0) {
scrollingView.scrollBy(diff, 0);
lastX = x;
}
if (more) {
getView().post(this);
}
}
boolean isFlinging() {
return !scroller.isFinished();
}
void forceFinished() {
if (!scroller.isFinished()) {
scroller.forceFinished(true);
}
}
}
使用Scroller.startScroll的细节应该相似。