11

我的课程扩展了 View,我需要在其上获得连续的触摸事件。

如果我使用:

public boolean onTouchEvent(MotionEvent me) {

    if(me.getAction()==MotionEvent.ACTION_DOWN) {
        myAction();
    }
    return true;
}

...触摸事件被捕获一次。

如果我需要在不移动手指的情况下进行连续触摸怎么办?请告诉我我不需要使用线程或计时器。我的应用程序已经太重了。

谢谢。

4

7 回答 7

15

使用if(me.getAction() == MotionEvent.ACTION_MOVE). 让手指 100% 完全静止在屏幕上是不可能的,因此每次手指移动时都会调用 Action_Move,即使它只有一两个像素。

您也可以监听me.getAction() == MotionEvent.ACTION_UP- 在此之前,用户必须仍然将手指放在屏幕上。

于 2010-03-29T16:56:44.517 回答
5

您需要为元素设置此属性 android:focusable="true" android:clickable="true" 如果没有,则只产生向下动作。

于 2013-08-06T15:06:41.857 回答
4

她是一个简单的代码片段,它显示了如何处理持续触摸事件。当您触摸设备并按住触摸并移动取景器时,将执行“触摸移动”操作。

@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;
}
于 2010-03-29T19:16:42.213 回答
1

尝试这个。它对我有用:

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

    }

请记住:您将设置的侦听器必须是容器布局(网格、相对、线性)。

LinearLayout layout = findViewById(R.id.yourlayoutid);
layout.setOnTouchListener(HelperClass.loadContainerOnTouchListener());
于 2011-06-20T19:46:04.603 回答
1

这可能会有所帮助,

requestDisallowInterceptTouchEvent(true);

在父视图上,像这样 -

        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            view.getParent().requestDisallowInterceptTouchEvent(true);
            switch(motionEvent.getAction()){
            }

            return false; 

         }
于 2018-01-11T11:15:05.293 回答
0

我正在使用用作拇指控件的自定义视图制作游戏。. . 这就是我所做的

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 上测试,硬件加速开启 **

于 2014-05-29T02:54:25.687 回答
0

所有这些答案都是部分正确的,但它们并没有以正确的方式解决问题。

首先,对于决定跟踪事件何时为 ACTION_MOVE 的每个人。好吧,这只能猜猜什么时候?当用户移动他的手指时,如果您决定实现自定义拇指控件也可以,但对于普通的自定义按钮,情况并非如此。

其次,在 ACTION_DOWN 中使用标志并在 ACTION_UP 中检查它似乎是执行此操作的逻辑方法,但是当 Clusterfux 发现您是否实现了某个while(!up_flag)逻辑时,您会陷入困境;)

所以这里提到了正确的方法:

Android中的连续“Action_DOWN”

请记住,如果您要在连续按下期间编写的逻辑必须以某种方式修改 UI,那么在所有其他情况下,您必须从主线程执行此操作,最好使用另一个线程。

于 2017-11-28T05:49:50.477 回答