user3616949
user3616949

Reputation: 53

Find duration between touch events in android

I have set up an onTouchListener which allows the user to click textView2 exactly 10 times, as shown below. My goal is to measure the time between touch 1 and touch 2, and store it as a variable, say time1. However, I'm not quite sure how to do this. One idea I had was setting up a variable, i, that measures the number of times the TouchListener was clicked. I was thinking of potentially measuring the time that i contained a particular value (for example, if i was equal to 1 for 1 second, this means the time between touch 1 and touch 2 was 1 second). However I'm not sure how to implement this, and I'm not even sure if this is the correct method. Does anyone know how to solve this problem?

.java file

public class MainActivity extends Activity {

int i;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final TextView textView2 = (TextView)findViewById(R.id.textView2);

    i=0;

    textView2.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN){
                i++;
                if (i==10) textView2.setOnTouchListener(null);

            }
            return false;
        }
    });         

}

Upvotes: 1

Views: 3259

Answers (2)

zgc7009
zgc7009

Reputation: 3389

In your class

private long pressTime = -1l;
private long releaseTime = 1l;
private long duration = -1l;

Then in your onTouch method

if(event.getAction() == MotionEvent.ACTION_DOWN){
     pressTime = System.currentTimeMillis();
     if(releaseTime != -1l) duration = pressTime - releaseTime;
}
else if(event.getAction() == MotionEvent.ACTION_UP){
     releaseTime = System.currentTimeMillis();
     duration = System.currentTimeMillis() - pressTime;
}

Now you have your duration between touch events:

  • Duration when you press down is the time between the last time you released and the current press (if you have previously pressed down and released the button).
  • Duration when you release is the time between the last time you pressed down and the current release time.

-Edit-

If you need to know the difference in time of all events you can just do something like

private long lastEvent = -1l;
private long duration = -1l;

Then in onTouch event

if(lastEvent != -1l) duration = System.currentTimeMillis() - lastEvent;
lastEvent = System.currentTimeMillis();

You can also create a list of durations

private List<Long> durations = new ArrayList<Long>();

and in onTouch instead of duration = ... do

durations.add(System.currentTimeMillis() - lastEvent); 

This could be useful for checking all durations between all sequential events. For example, if you want to know the time between pressing down, dragging, stopping dragging, starting dragging, and then lifting up you could check your list after you lift up for every time in question instead of having to constantly check a single duration.

Upvotes: 3

Raffaele
Raffaele

Reputation: 20885

You may want to keep a record of events in a List. The objects stored in this list would keep the timestamp of the touch event, and since UI events are dispatched by a single thread and the clock is monothonic, you are guaranteed that event at N + 1 has a later (at most equal) timestamp than event at index N.

I'm not sure about how you clean this list, however. It depends on how and why you read events, which in turn depends on what you want to do with the delay between two subsequent touch.

For example, if you just wanted to display the time since last touch, a simple code like this could be enough:

public class MyActivity {

  private int times = 0;
  private long lastTimestamp;

  private void onTouchEvent(Event evt) {
    if (times > 0) {
      long delay = evt.getTimestamp() - lastTimestamp;
      // do something with the delay
    }
    lastTimestamp = evt.getTimestamp();
    times++;
  }
}

Upvotes: 0

Related Questions