Question

Well I have made a custom Android UI, and I need my UI view to handle this control.

a) While my mouse button is pressed (onDown / Key pressed) , the view should keep doing a thing (For example : Key is down)

b) As soon as i release my mouse key , the view should say (example: Key is up).

The Sample Flow should be something like when I press the view.

Output: (I press mouse button on the view and hold it)

Key is down

Key is down

Key is down

Key is down

Key is down

Key is down

(I now release mouse button)

Key is up.

To more explain my problem . I am posting a code snippet where the logic should go

@Override

public boolean onTouchEvent(MotionEvent event) {
    Log.d(TAG, event.getAction());
}

When I press my mouse button , it prints "0" (meaning mouse is down), while if i leave it , it prints on the log "1", meaning mouse is up. That should help with the logic.

Thanks for helping.


Well I have tried something like

private static int checkValue = 0;

@Override

public boolean onTouchEvent(MotionEvent event) {

    checkValue = event.getAction();

    while (checkValue == 0 ){

    Log.d(TAG, "Pressed");
    checkValue = checkMethod(event.getAction);


}

    private int checkMethod(int test){

    if (checkValue == 0){

      checkValue = 0;
      }

    else checkValue = 1;
}
Was it helpful?

Solution

Just define an OnTouchEventListener...

private OnTouchListener onTouchListener = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (v.getId() == R.id.button) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                //start loop or background task
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                //do something different
            }
        } 
        return true;
    }
} 

...and assign it to your button.

button.setOnTouchListener(onTouchListener);

When the user touches the button the ACTION_DOWN event is fired. When the user releases the button, the ACTION_UP event is fired. If you want you can start a loop in a thread which can check against a boolean variable. I didn't check if it is correct but it should look like this:

private OnTouchListener onTouchListener = new OnTouchListener() {

        private boolean flag = false;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (v.getId() == R.id.button) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    flag = true;
                    Thread thread = new Thread(new Runnable() {

                        @Override
                        public void run() {
                            while(flag) {
                                //do something
                            }
                        }
                    });
                    thread.start();
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    flag = false;
                }
            } 
            return true;
        }
    }

OTHER TIPS

Maybe you could create and start a thread when the touch occurs that has a volatile boolean stop = false field and that checks for this value in every loop after sleeping for a while. When the touch ends, you can set the boolean variable to false.

Edit: added an example

private MyHandler h;

public void handleDown() {
  System.out.println("touch began");
  h = new MyHandler();
  h.start();
}

public void handleUp() {
  h.pleaseStop = true;
  System.out.println("touch ended");
}

class MyHandler extends Thread {
  volatile boolean pleaseStop = false;

  public void run() {
    while (!pleaseStop) {
      System.out.println("touch is active...");
      Thread.sleep(500);
    }
  }
}
checkValue = event.getAction();
while (checkValue == 0 ){

You should never ever be using magical integers. Use the constants as defined by the API:

http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_DOWN

In fact your code isn't even accounting for move events; it seems to assume that if it isn't a down event it is an up... which is completely wrong.

Look at the documentation to see what action values you can expect, and do the right thing for the specific actions you are interested in. For example up:

http://developer.android.com/reference/android/view/MotionEvent.html#ACTION_UP

Create a thread which is initiated by the touch and have boolean flag to keep it alive. When the touch is released, set the flag to false so the thread joins (terminates).

Because the thread is independent from the main logic, the process is faster.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top