效果是这样的
Demo 地址
开始打算用各种事件拦截器来实现,想着就头疼,后来经过阅读ViewGroup的源码,通过反射修改ViewGroup的mFirstTouchTarget 属性控制ViewGroup的事件的接受者(你想要谁接收事件就把接受者设置为谁),用这个思路处理触摸事件和事件事件传递感觉比传统方式(内外拦截器)简单太多了。核心代码如下,希望这种思路能带给各位看官一定的启发。
/**
* 把group的首个事件接受者修改为target,达到按需设置事件的接受者
* (因為需要反射,所以需要先解決反射问题:https://github.com/OBaKai/JJReflection)
* @param target
* @param group
*/
public static void giveFistTargetForViewGroup(View target, ViewGroup group) {
try {
Field firstTarget = ViewGroup.class.getDeclaredField("mFirstTouchTarget");
firstTarget.setAccessible(true);
// Object firstTouchtarget=firstTarget.get(group);
Class innerClass = Class.forName("android.view.ViewGroup$TouchTarget");
//obtain(@NonNull View child, int pointerIdBits)
Method obtainMethod = innerClass.getMethod("obtain", View.class, int.class);
obtainMethod.setAccessible(true);
Object newTart=obtainMethod.invoke(null,target,1);
firstTarget.set(group,newTart);
} catch (Exception e) {
e.printStackTrace();
}
}