事故场景:在一个scrollview中放置了一录音按钮,用户按住开始录音,松开停止录音,按住并移出按钮放弃录音,代码工作很正常。
但是,需求发生变化,允许用户多次录音,并将录音内容用类似微信的方式出现在按钮上方,这很简单,很快就实现了,无非是调用scrollview的addView方法。
但是,测试说有bug了,很惊奇,看到bug更惊奇,就是当录音次数多到需要上滑scrollview才能点击录音按钮的时候,按住并移除按钮放弃录音不被执行
原因分析:当scrollview中的内容并不多时(scrollview不需要滑动),这个时候scrollview不中断事件的分发,但是当scrollview中的内容多到需要滚动时,用户按住按钮并移除按钮,scrollview认为用户是在滑动scrollview所以移动事件就不再分发了,但是按下事件还是分发的,所以我们需要在控件的按下事件中加上this.getParent().requestDisallowInterceptTouchEvent(true);, 请求父容器不要中断TouchEvent的分发。