Avtar Singh
Avtar Singh

Reputation: 59

Continuous "Action_DOWN" in Android

@Override
public boolean onTouchEvent(MotionEvent event) {

if(event.getAction()==MotionEvent.ACTION_DOWN){
Log.d(VIEW_LOG_TAG, "Touching Down");
}
    if(event.getAction()==MotionEvent.ACTION_UP){
Log.d(VIEW_LOG_TAG, "Not Touching");
}
}

I want Log-->"Touching Down" should be displayed in Log continuously until finger is released.

Please Help

Its Really Important...I cant Proceed further in ma Project without this.

Upvotes: 2

Views: 3281

Answers (2)

ben75
ben75

Reputation: 28746

You cannot do that in the UI-Thread. Code running in UI-Thread must be short to keep UI responsive.

So you need to create a thread.

  • start the thread when ACTION_DOWN
  • In the thread : write a loop with your log (use a flag to stop the loop)
  • when ACTION_UP : change the flag (this will cause the end of the loop in your thread.

Sample code :

AtomicBoolean actionDownFlag = new AtomicBoolean(true);

Thread loggingThread = new Thread(new Runnable(){
     public void run(){
         while(actionDownFlag.get()){
             Log.d(VIEW_LOG_TAG, "Touching Down");
             //maybe sleep some times to not polute your logcat
         }
         Log.d(VIEW_LOG_TAG, "Not Touching");
     }
});

@Override
public boolean onTouchEvent(MotionEvent event) {

    if(event.getAction()==MotionEvent.ACTION_DOWN){
        loggingThread.start();
    }
    if(event.getAction()==MotionEvent.ACTION_UP){
        actionDownFlag.set(false);
    }
}

Upvotes: 6

Heinrisch
Heinrisch

Reputation: 5935

You will only get one event for each touch update. So you will get ACTION_DOWN, then probably ACTION_MOVE, and ACTION_UP when the user releases.

You can either do something that is repeating until you vet ACTION_UP, or you also trigger on ACTION_MOVE depending on your requirements.

Something like this:

Handler handler = new Handler();
boolean pushingDown = false;
Runnable repeater = new Runnable() {
    @Override
    public void run() {
        Log.e("pressing down", "pressing down");
        if (pushingDown) {
            handler.postDelayed(this, 10);
        }
    }
};

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        pushingDown = true;
        handler.post(repeater);
    }
    if (event.getAction() == MotionEvent.ACTION_UP) {
        pushingDown = false;
    }

    return super.onTouchEvent(event);
}

Upvotes: 2

Related Questions