几个月后回到这个问题,我现在采用了不同的策略:使用处理程序(如在 Android Snake 示例中)每 125 毫秒向应用程序发送一条消息,提示它检查是否已启动 Scroll 和自上次滚动事件以来是否已超过 100 毫秒。
这似乎工作得很好,但如果有人能看到任何缺点或可能的改进,我将不胜感激。
相关代码在 MyView 类中:
public class MyView extends android.view.View {
...
private long timeCheckInterval = 125; // milliseconds
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() {
// 用于在大缓冲区位图上进行详细(且耗时)绘图的代码
// 以下指令重置 Time Check 时钟 // 时钟首次启动时 // 主活动在应用程序启动时调用此方法
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 类的其余部分
}