CountDownTimer 在 ACTION_DOWN 启动后未在 MotionEvent.ACTION_UP 取消
CountDownTimer not cancelled on MotionEvent.ACTION_UP after starting it in ACTION_DOWN
我知道不存在 onLongTouchListener,所以我正在尝试做我自己的版本,但我不能使用 onLongClickListener,因为我确实需要触摸坐标。我的代码如下:
touchImageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, final MotionEvent motionEvent) {
CountDownTimer counter = new CountDownTimer(500, 1) {
public void onTick(long millisUntilFinished) {
System.out.println("REMAINING: "+(millisUntilFinished));
}
public void onFinish() {
System.out.println("IT'S OVER");
}
};
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN){
counter.start();
} else if( motionEvent.getAction() == MotionEvent.ACTION_UP){
counter.cancel();
}
return true;
}
});
问题:当我将手指放在屏幕上时计数器开始计时,但当我抬起手指时它没有取消,正如我所期望的那样:
else if( motionEvent.getAction() == MotionEvent.ACTION_UP){
counter.cancel();
}
你们能帮帮我吗?
编辑:
按照评论和答案进行操作后,现在可以使用了:
final CountDownTimer counter;
counter = new CountDownTimer(500,1) {
@Override
public void onTick(long l) {
System.out.println("REMAINING "+l);
}
@Override
public void onFinish() {
System.out.println("IT'S OVER");
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
v.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE));
}
}
};
touchImageView.setOnTouchListener(new View.OnTouchListener() {
CountDownTimer c = counter;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN){
c.start();
}
if (motionEvent.getAction() == MotionEvent.ACTION_UP){
c.cancel();
}
return true;
}
});
发生这种情况是因为您没有取消同一个计数器。当onTouch
第一次被触发时(ACTION_DOWN
),你构造一个计数器并启动它。当onTouch
第二次被触发时(ACTION_UP
),你构造一个new计数器并取消它。您正在启动一个计数器并取消一个完全不同的计数器。
您需要在 onTouch
侦听器 外部 维护一个计数器,或者确保您确实以其他方式取消了正确的计数器。
我知道不存在 onLongTouchListener,所以我正在尝试做我自己的版本,但我不能使用 onLongClickListener,因为我确实需要触摸坐标。我的代码如下:
touchImageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, final MotionEvent motionEvent) {
CountDownTimer counter = new CountDownTimer(500, 1) {
public void onTick(long millisUntilFinished) {
System.out.println("REMAINING: "+(millisUntilFinished));
}
public void onFinish() {
System.out.println("IT'S OVER");
}
};
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN){
counter.start();
} else if( motionEvent.getAction() == MotionEvent.ACTION_UP){
counter.cancel();
}
return true;
}
});
问题:当我将手指放在屏幕上时计数器开始计时,但当我抬起手指时它没有取消,正如我所期望的那样:
else if( motionEvent.getAction() == MotionEvent.ACTION_UP){
counter.cancel();
}
你们能帮帮我吗?
编辑:
按照评论和答案进行操作后,现在可以使用了:
final CountDownTimer counter;
counter = new CountDownTimer(500,1) {
@Override
public void onTick(long l) {
System.out.println("REMAINING "+l);
}
@Override
public void onFinish() {
System.out.println("IT'S OVER");
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
v.vibrate(VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE));
}
}
};
touchImageView.setOnTouchListener(new View.OnTouchListener() {
CountDownTimer c = counter;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN){
c.start();
}
if (motionEvent.getAction() == MotionEvent.ACTION_UP){
c.cancel();
}
return true;
}
});
发生这种情况是因为您没有取消同一个计数器。当onTouch
第一次被触发时(ACTION_DOWN
),你构造一个计数器并启动它。当onTouch
第二次被触发时(ACTION_UP
),你构造一个new计数器并取消它。您正在启动一个计数器并取消一个完全不同的计数器。
您需要在 onTouch
侦听器 外部 维护一个计数器,或者确保您确实以其他方式取消了正确的计数器。