在ScrollView中跨RecylerView拖拽数据的效果要不要?

112 阅读1分钟

效果是这样的

drag.gif

Demo 地址

github.com/woshiwzy/Mu…

开始打算用各种事件拦截器来实现,想着就头疼,后来经过阅读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();
        }

    }