我有一种不断调用的方法。
我希望方法具有以下内容:
if(screen is being touched) {
Do this
}
else {
Do this
}
另一种表达问题的方法是,只要屏幕被触摸,我想要发生某些事情,而不仅仅是在触摸屏幕后的某个时刻发生的事情。
我看了这个问题:detect if the touch stopped on an android device screen
但我对答案感到困惑。
答案 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_UP
和ACTION_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方法。(
)