查找android中触摸事件之间的持续时间

时间:2014-05-21 20:39:26

标签: java android

我设置了onTouchListener,允许用户完全点击textView2 10次,如下所示。我的目标是测量触摸1和触摸2之间的时间,并将其存储为变量,例如time1。但是,我不太清楚如何做到这一点。我的一个想法是设置一个变量i,用于衡量TouchListener被点击的次数。我在考虑可能测量i包含特定值的时间(例如,如果i等于1持续1秒,这意味着触摸1和触摸2之间的时间为1秒) 。但是我不确定如何实现这个,我甚至不确定这是否是正确的方法。有谁知道如何解决这个问题?

.java档案

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

}

2 个答案:

答案 0 :(得分:3)

在你的班级

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

然后在你的onTouch方法

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;
}

现在您有触摸事件之间的持续时间:

  • 当您按下时的持续时间是您上次释放和当前按下之间的时间(如果您之前已按下并释放按钮)。
  • 释放时的持续时间是您上次按下时间与当前释放时间之间的时间。

- 编辑 -

如果您需要知道所有事件的时间差异,您可以执行类似

的操作
private long lastEvent = -1l;
private long duration = -1l;

然后在onTouch事件中

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

您还可以创建持续时间列表

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

并且在onTouch而不是duration = ... do

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

这对于检查所有顺序事件之间的所有持续时间非常有用。例如,如果您想知道按下,拖动,停止拖动,开始拖动,然后提升之间的时间,您可以在每次提起相关问题后检查列表,而不必经常检查单个持续时间。

答案 1 :(得分:0)

您可能希望在List中记录事件。存储在此列表中的对象将保留触摸事件的时间戳,并且由于UI事件由单个线程调度且时钟是单声道的,因此可以保证N + 1处的事件稍后(最多相等)时间戳比索引N处的事件。

但是,我不确定你如何清理这个清单。这取决于您阅读事件的方式和原因,而这又取决于您希望如何处理两次后续触摸之间的延迟。

例如,如果您只想显示自上次触摸以来的时间,那么这样的简单代码就足够了:

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++;
  }
}