几个月后回到这个问题,我现在采取了另一种方法:使用处理程序(如Android Snake示例中的示例)每隔125毫秒向应用发送一条消息,提示其检查Scroll是否已启动,以及自上次滚动事件以来是否已超过100毫秒。
这似乎工作得很好,但是如果有人能看到任何缺点或可能的改进,我将不胜感激。
相关的代码在MyView类中:
public class MyView extends android.view.View {
...
private long timeCheckInterval = 125;
private long scrollEndInterval = 100;
public long latestScrollEventTime;
public boolean scrollInProgress = false;
public MyView(Context context) {
super(context);
}
private timeCheckHandler mTimeCheckHandler = new timeCheckHandler();
class timeCheckHandler extends Handler{
@Override
public void handleMessage(Message msg) {
long now = System.currentTimeMillis();
if (scrollInProgress && (now>latestScrollEventTime+scrollEndInterval)) {
scrollInProgress = false;
//滚动已结束,因此请在此处插入代码
//调用doDrawing()方法
//重画位图,重新居中滚动结束的位置
[ layout or view ].invalidate();
}
this.sleep(timeCheckInterval);
}
public void sleep(long delayMillis) {
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
}
}
@Override protected void onDraw(Canvas canvas){
super.onDraw(canvas);
//将大缓冲区位图绘制到视图画布上的代码//定位为考虑到正在进行的任何滚动
}
public void doDrawing() {
//在大缓冲区位图上进行详细(且费时)绘制的代码//
//以下指令重设时间检查时钟// //当应用启动时主要活动调用此方法时,时钟首先启动
mTimeCheckHandler.sleep(timeCheckInterval);
}
// MyView类的其余部分
}
并在MyGestureDetector类中
public class MyGestureDetector extends SimpleOnGestureListener {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
[MyView].scrollInProgress = true;
long now = System.currentTimeMillis();
[MyView].latestScrollEventTime =now;
[MyView].scrollX += (int) distanceX;
[MyView].scrollY += (int) distanceY;
//下一条指令将导致调用View的onDraw方法//将缓冲区位图绘制到屏幕上//被转移以考虑滚动
[MyView].invalidate();
}
// MyGestureDetector类的其余部分
}
if (e2.getPressure() < 0.15)
到onScroll()方法。正如预期的那样,有时会检测到滚动的结束,但并非总是如此。当然,必须有更好的方法!