android事件传递问答

android中的事件响应方式是冒泡的方式,最深层的元素先响应, 但是事件传递是先从最外层传到被点击view,然后再向上传递到最顶层。
点击某个view后,那个view先接收ActionDown事件,如果还想继续捕获move或者其他事件,需要return true, 不捕获就return false。

问答

事件传递相关问题:
    能不能不让最深层的元素不接收ActionDown事件?
可以,由于事件是先由顶层view向下传递的,所以可以阻止事件传递到被点击的view,只要在父类的onInterceptTouchEvent中进行捕获(return true)即可,捕获后的事件直接被父类处理,比如我们拦截了move事件,即使父view的onTouchView中返回的是false, 依然可以接收到move和up事件, 但是如果拦截的是down事件,那么onTouchMove中必须返回true才能继续接收move和up事件,看来最关键的事件还是这个down事件,绝对着你能不能继续接收后续事件。

    能不能只捕获ActionUP事件?
不能,如果父view捕获了ActionUP事件,那么孩子view会收到一个actionDown和actionMove事件,当ActionUP时候只会接收一个ACTION_CANCEL事件,但是注意父view也没有接收到actionup事件,难道是因为没有接收过down事件?但是我们拦截move事件的情况下,是可以接收到actionup事件的。

    能不能只捕获ActionMove事件?
不能,如果父view捕获了ActionMove事件,那么孩子view会接收到一个ActionCancel事件,从此所有的事件会被传递给父View,父View不管onTouchView中是返回true或者false,move和up事件都会继续传递给它。

    不通过父view拦截的方式,子view能否只拦截ActionDown事件或者只拦截ActionUP事件?
可以,让子view的onTouchEvent返回false,子view只会接收到down事件,其他后续事件并不会被接收到。

    可不可以让子view和父view同时接收到down事件?
可以,当子view中没有消费down事件,那么down事件会被退给父view,父view的onTouchEvent中会接收到,但是如果子view中已经消费了down事件,那么父view就接收不到了。

    可不可以同时在子view和父view中处理move事件?
不可以,同一个move事件要么出现在父view中,要么在子view中,但是我们可以控制到底由哪一个来响应,比如用户横向滑动时可以由父view响应处理,竖向滑动时由子view响应处理。

    可不可以先让父view拦截某个事件,然后动态的关闭拦截?
不可以,一旦父view拦截了某个事件,那么子view就会接收到一个cancel事件,子view就不会再响应事件了。

你可能感兴趣的:(Android)