Android 如何获得连续接触活动?
我的类扩展了视图,我需要在其上获得连续的接触事件 如果我使用:Android 如何获得连续接触活动?,android,events,touch,continuous,Android,Events,Touch,Continuous,我的类扩展了视图,我需要在其上获得连续的接触事件 如果我使用: public boolean onTouchEvent(MotionEvent me) { if(me.getAction()==MotionEvent.ACTION_DOWN) { myAction(); } return true; } 。。。触摸事件被捕捉一次 如果我需要在不移动手指的情况下连续触摸,该怎么办? 请告诉我,我不需要使用线程或计时器。我的应用程序已经太重了 谢谢。如果(
public boolean onTouchEvent(MotionEvent me) {
if(me.getAction()==MotionEvent.ACTION_DOWN) {
myAction();
}
return true;
}
。。。触摸事件被捕捉一次
如果我需要在不移动手指的情况下连续触摸,该怎么办?
请告诉我,我不需要使用线程或计时器。我的应用程序已经太重了
谢谢。如果(me.getAction()==MotionEvent.ACTION\u MOVE)使用。不可能让手指100%完全静止在屏幕上,因此每次手指移动时都会调用Action_Move,即使只有一两个像素
您还可以收听me.getAction()==MotionEvent.ACTION\u UP
——在这之前,用户的手指必须仍在屏幕上。她是一个简单的代码片段,显示了如何处理连续触摸事件。当您触摸设备并按住触摸键并移动取景器时,将执行触摸移动操作
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
if(isTsunami){
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// Write your code to perform an action on down
break;
case MotionEvent.ACTION_MOVE:
// Write your code to perform an action on contineus touch move
break;
case MotionEvent.ACTION_UP:
// Write your code to perform an action on touch up
break;
}
}
return true;
}
试试这个。这对我很有用:
public static OnTouchListener loadContainerOnTouchListener() {
OnTouchListener listener = new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
LinearLayout layout = (LinearLayout)v;
for(int i =0; i< layout.getChildCount(); i++)
{
View view = layout.getChildAt(i);
Rect outRect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
if(outRect.contains((int)event.getX(), (int)event.getY()))
{
Log.d(this.getClass().getName(), String.format("Over view.id[%d]", view.getId()));
}
}
}
您需要为元素设置此属性
android:focusable=“true”
android:clickable=“true”
如果没有,只需制作向下操作。我正在制作一个带有自定义视图的游戏,该视图用作拇指控件。这就是我所做的
float x = 0, y = 0;
@Override
public boolean onTouchEvent(MotionEvent event) {
x = event.getX();
y = event.getY();
// handle touch events with
switch( event.getActionMasked() ) {
case MotionEvent.ACTION_DOWN :
if(cont)
{
// remove any previous callbacks
removeCallbacks(contin);
// post new runnable
postDelayed(contin, 10);
}
invalidate();
return true;
case MotionEvent.ACTION_MOVE :
if(!cont && thumbing != null)
{
// do non-continuous operations here
}
invalidate();
return true;
case MotionEvent.ACTION_UP :
// set runnable condition to false
x = 0;
// remove the callbacks to the thread
removeCallbacks(contin);
invalidate();
return true;
default :
return super.onTouchEvent(event);
}
}
public boolean cont = false;
// sets input to continuous
public void set_continuous(boolean b) { cont = b; }
public Runnable contin = new Runnable()
{
@Override
public void run() {
if(x != 0)
{
// do continuous operations here
postDelayed(this, 10);
}
}
};
但是,请注意,在调用此视图的主要活动中,请确保通过onPause方法手动删除回调,如下所示
@Override
protected void onPause() {
if(left.cont) left.removeCallbacks(left.contin);
if(right.cont) right.removeCallbacks(left.contin);
super.onPause();
}
这样,如果您暂停并返回,则触摸事件不会被处理两次,并且视图不会受到线程开销的影响
**在三星Galaxy S3上测试,硬件加速在**上,所有这些答案都部分正确,但没有以正确的方式解决问题
首先,对于所有决定跟踪活动何时开始的人来说。好吧,这只适用于猜测什么时候?当用户移动手指时,如果您决定实现自定义拇指控件也可以,但对于普通的自定义按钮,情况并非如此
其次,在ACTION\u DOWN中使用一个标志并在ACTION\u UP中检查它似乎是一种逻辑方法,但是Clusterfux会发现,如果您在(!UP\u flag)
逻辑中实现了,那么您就会陷入麻烦;)
因此,这里提到了正确的方法:
请记住,如果要在连续按压过程中编写的逻辑必须以某种方式修改UI,则必须从主线程执行。在所有其他情况下,最好使用另一个线程。这可能会有所帮助
requestDisallowInterceptTouchEvent(true);
在父视图上,如下所示-
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
view.getParent().requestDisallowInterceptTouchEvent(true);
switch(motionEvent.getAction()){
}
return false;
}
正确,我更喜欢在ACTION_DOWN上设置一个标志并使用它,直到ACTION_Up上的标志设置为false为止。我看到到处都提到了这一点,但对我来说似乎不是这样。如果我触摸并保持静止,我就不会有动作。只有当我的手指向某个方向倾斜时,动作才会触发。是不是我手机上的设置让它变得不那么敏感?@clusterflux如果你依靠动作持续触发,即使手指保持静止,你也可能做错了什么。我回答的后半部分(非常古老!)是正确的方法,例如,在“向下”中设置一面旗帜,然后在“向上”中清除它。@SteveHaley感谢您的帮助。我有一个后续问题。我有一个函数,在ACTION_DOWN时调用。我希望它一直被调用,直到行动发生。我已尝试按照您的建议使用标志,但我遇到的问题是,我正在使用while(!up_flag)循环来在发生动作时重复调用该函数。但是,一旦进入while()循环,我就无法再感知触摸事件,因此永远不会感知到动作,因此标志不会更改。我陷入了一个连续的while循环。有其他方法的建议吗?很好但是。。。不在模拟器上工作。与手指不同,鼠标可以保持静止。
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
view.getParent().requestDisallowInterceptTouchEvent(true);
switch(motionEvent.getAction()){
}
return false;
}