只要拇指在我的imageview上,我想在循环中做一些连续的任务。一旦拇指上升,我想停止这项工作。为此,我在ACTION_DOWN和ACTION_UP上设置一个标志,我取消该标志,以便循环可以停止。但我的循环变得无限。此外,Toasts在循环时不会显示出来。任何帮助将不胜感激。谢谢!
ivThumb.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
Toast.makeText(c, "action down", Toast.LENGTH_SHORT).show();
ivCharger.setVisibility(View.VISIBLE);
tvCharging.setVisibility(View.VISIBLE);
flag = true;
// while (flag){
// Toast.makeText(c, "hello", Toast.LENGTH_SHORT).show();
//
// }
}
else if (event.getAction() == MotionEvent.ACTION_MOVE){
Toast.makeText(c, "move", Toast.LENGTH_SHORT).show();
}
else if (event.getAction() == MotionEvent.ACTION_UP) {
Toast.makeText(c, "aCTION UP", Toast.LENGTH_SHORT).show();
flag = false;
ivCharger.setVisibility(View.GONE);
tvCharging.setVisibility(View.GONE);
//ivBattery.setImageResource(R.drawable.orange);
}
return true;
}
});
答案 0 :(得分:2)
使用switch
并添加setPressed
参数
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
ivThumb.setPressed(true);
//Your Function
break;
case MotionEvent.ACTION_MOVE:
//Your Function
break;
case MotionEvent.ACTION_UP:
//Your Function
ivThumb.setPressed(false);
invalidate();
break;
这应该可以解决问题。我建议调用一个函数并在那里处理吐司。
编辑:
至于,@ Chetan指出你应该true
返回onTouch
。
答案 1 :(得分:1)
使用以下代码解决您的问题:
您已从false
返回OnTouchListener
,这就是为什么其他事件不起作用我更改了返回值true
。
public static boolean flag = false;
ivThumb.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Toast.makeText(getBaseContext(), "ACTION_DOWN", Toast.LENGTH_SHORT).show();
flag = true;
new Thread(new Runnable() {
@Override
public void run() {
while (flag) {
Log.i(getClass().getSimpleName(), "ACTION_DOWN");
Log.i(getClass().getSimpleName(), "flag=" + flag);
}
}
}).start();
break;
case MotionEvent.ACTION_MOVE:
Toast.makeText(getBaseContext(), "ACTION_MOVE", Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
flag = false;
Toast.makeText(getBaseContext(), "ACTION_UP", Toast.LENGTH_SHORT).show();
break;
}
return true;
}
});
答案 2 :(得分:0)
我做错了是我让我的程序在同一个线程中无限循环。它被困在循环中,因此无法为其他事件返回true。 解决方案是将该循环提供给另一个线程,并在同一线程中为其他事件返回true。希望它也能帮助别人。 感谢那些表达他们担忧的人。
ivThumb.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
ivThumb.setPressed(true);
Toast.makeText(getBaseContext(), "ACTION_DOWN", Toast.LENGTH_SHORT).show();
chargingFlag = true;
Thread thread = new Thread() {
@Override
public void run() {
while (chargingFlag){
}
}
};
thread.start();
// while (chargingFlag){
//
// }
break;
case MotionEvent.ACTION_MOVE:
Toast.makeText(getBaseContext(), "ACTION_MOVE", Toast.LENGTH_SHORT).show();
break;
case MotionEvent.ACTION_UP:
ivThumb.setPressed(false);
Toast.makeText(getBaseContext(), "ACTION_UP", Toast.LENGTH_SHORT).show();
chargingFlag = false;
break;
}
return true;
}
});