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; 

         }