Android中的ACTION_DOWN事件无法循环

时间:2017-02-21 10:11:13

标签: android events

只要拇指在我的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;
            }
        });

3 个答案:

答案 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;
            }
        });