如何检测某些东西是否触摸/未触摸onTouch()外的屏幕?

时间:2015-09-02 19:46:44

标签: android

我有一种不断调用的方法。

我希望方法具有以下内容:

if(screen is being touched) {
Do this
}
else {
Do this
}

另一种表达问题的方法是,只要屏幕被触摸,我想要发生某些事情,而不仅仅是在触摸屏幕后的某个时刻发生的事情。

我看了这个问题:detect if the touch stopped on an android device screen

但我对答案感到困惑。

4 个答案:

答案 0 :(得分:5)

您可以使用类似此代码的内容

view.setOnTouchListener(new OnTouchListener () {
    public boolean onTouch(View view, MotionEvent event) {
        switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                // The user just touched the screen

                break;
            case MotionEvent.ACTION_UP:
                // The touch just ended

                break;
        }

        return false;
    }
});

您应该将此侦听器分配给Fragment的根视图或Activity的装饰视图。你可以通过以下方式获得:

View view = getWindow().getDecorView();

如果您不想仅仅对触摸事件作出反应,而只是知道是否在另一种方法中触摸屏幕,只需在侦听器中指定布尔标志。

修改

由于您需要在定义的时间间隔内连续调用方法,我建议定义区间

final static long REFRESH_TIME = 100; // miliseconds

然后创建Handler

final Handler handler = new Handler();

并定义Runnable将被Handler调用并调用您的方法

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        // call your method

        handler.postDelayed(this, REFRESH_TIME);
    }
}

OnTouchListener中,您初始化并停止重复

case MotionEvent.ACTION_DOWN:
    handler.post(runnable);
    break;

case MotionEvent.ACTION_UP:
    handler.removeCallbacks(runnable);
    break;

答案 1 :(得分:1)

实现所需结果的一种可能方法:尝试在视图层次结构的顶部放置一个视图,将其设置为与屏幕大小相同,然后覆盖视图的setPressed()方法。如果按下,做一些事情,如果没有,做其他事情:

@Override
    public void setPressed(boolean pressed) {
            if (pressed) {
                do something;
            } else {
                do something else;
            }
        super.setPressed(pressed);
    }

答案 2 :(得分:0)

尝试使用onTouchListener()并实施onTouch(View v, MotionEvent e)来检查事件ACTION_UPACTION_DOWN

实施示例: Touch Release method in Android

编辑:

在阅读您与他人的一些讨论时,我建议您的班级中有AsyncTask不断运行更新循环,如下所示:

private static boolean doUpdate = false;

private class PaddleUpdater extends AsyncTask<String,Void,Void> {
  @Override
  protected Void doInBackground(String... strings) {
    while(true) {
      if(isCancelled()) { break; }
      if(doUpdate) {
        //update paddle
      }
    }
  }
}

//in the constructor, do this
PaddleUpdater pu = new PaddleUpdater();
pu.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

然后在类中设置BroadcastReceiver,如下所示:

public static final String TOUCH_UPDATE = "com.packagename.intent.action.TOUCH_UPDATE";

private class TouchStateReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context c, Intent i) {
    Bundle b = i.getExtras();
    if (b != null) {
      doUpdate = b.getBoolean("touch");
    }
  }
}

//in the constructor do this
registerReceiver(new UpdateReceiver(), new IntentFilter(TOUCH_UPDATE));

然后,在您的主要活动中,按@ Lamorack的帖子中所述设置您的听众,但添加意向广播:

view.setOnTouchListener(new OnTouchListener () {
  public boolean onTouch(View view, MotionEvent event) {
      Intent i = new Intent(<ClassName>.TOUCH_UPDATE);
      switch(event.getAction()) {
          case MotionEvent.ACTION_DOWN:
              // The user just touched the screen
              i.putExtra("touch", true);
              sendBroadcast(i);
              break;
          case MotionEvent.ACTION_UP:
              // The touch just ended
              i.putExtra("touch", false);
              sendBroadcast(i);
              break;
      }

      return false;
  }
});

说明:

所以,你需要做的是跟踪某个状态。 Android会在触摸屏幕时以及何时触发屏幕时告诉您,因此我们需要根据这些事件跟踪触摸状态。所以我们设置了一个布尔值来跟踪该状态。触摸触控案例后,我们会向您的班级发送Intent,并告知其将boolean跟踪的true更改为boolean。触发发布的案例后,我们会通知您的班级将其跟踪的false更改为AsyncTask

该类本身已经启动AsyncTask,它将基本上运行,直到您手动停止它为止。 boolean中的循环将不断检查true的值,当它为false时,它会进行更新,当它为BroadcastReceiver时,它会跳过更新

我们在您班级中设置的Intent实际上是您的触摸听众发送的myproject myproject __init__.py settings.py app1 app2

答案 3 :(得分:0)

在阅读了Lamorak的回答后,我做了一些非常相似的事情。 我有一个onTouch方法,其中包含以下内容:

printf("%s", llegada[i].id);

然后在更新方法中我有:

@Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            bool = true;
            break;
        case MotionEvent.ACTION_UP:
            bool = false;
            break;
    }

    return true;
}

每当调用onDraw()时,都会调用update方法。(