几个月后回到这个问题,我现在采用了不同的策略:使用 Handler(如在 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 类的其余部分
}