【问题标题】:How does one disable/ re-enable touch events in Android?如何在 Android 中禁用/重新启用触摸事件?
【发布时间】:2015-12-28 09:37:57
【问题描述】:

快速,可能很简单,问题。我有一个背景动画的视图,在此期间,我想禁止用户与视图交互。我的视图是 FrameLayout,我正在使用 onTouchEvent() 捕获触摸事件。我尝试过的解决方案:

1) 先 setOnTouchListener(null),然后 setOnTouchListener(this)。问题是,我的视图只调用 onTouchEvent(MotionEvent),而不是 onTouch(View, MotionEvent),所以我无法通过那里的事件。

2) 首先 setEnabled(false),然后 setEnabled(true)。源代码说:可点击的禁用视图仍然消耗触摸事件,它只是不响应它们。问题是,MotionEvents 仍然会在 onTouchEvent() 中通过。

3) requestDisallowInterceptTouchEvent(false),然后是(true)。这仅处理来自父级的触摸事件。

我正在使用的解决方案是使用布尔变量 isAnimating,并在 onTouchEvent() 中检查它的值。我宁愿不这样做,因为它对我来说看起来很丑,我宁愿使用 API 也不愿重新发明轮子,所以……有人有什么想法吗?谢谢。

【问题讨论】:

    标签: android touch android-view


    【解决方案1】:

    尝试: setFocusable()setFocusableInTouchMode()

    【讨论】:

    • 我会试试的,谢谢。编辑:不走运,我仍然可以在动画期间触摸视图并与之交互。
    • 能否请您 edit 解释为什么这段代码回答了这个问题?纯代码答案是 discouraged,因为它们不教授解决方案。
    【解决方案2】:

    试试:

     @Override
    public boolean onTouchEvent(MotionEvent event) {
        //Check if event is on your view
        if(event.getY()>view.getTop()&&event.getY()<view.getBottom()&&event.getX()>view.getLeft()&&event.getX()<view.getRight()){
            //event occured inside your view
    
        }
        //here return super or as your logic prefer
        return super.onTouchEvent(event);
    }
    

    【讨论】:

    • 我想你可能对我的问题有点困惑。我想知道是否有一种方法可以根据android API为您提供的某些方法来禁用onTouchEvent(),例如disallowTouchEvent()。
    • 你为什么不在你的条件语句中返回真,这表明你已经消费了事件
    • 这是我在 onTouchEvent() 中的内容,但我不喜欢它:if (isAnimating) { return true }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    相关资源
    最近更新 更多