react native scrollview手勢沖突

背景
在使用scrollview或者listview時,一般有兩種情況會出現手勢沖突

  • scrollview在一個touch的內部
  • scrollview包裹一個touch
    上面我們只考慮了一個scrollview和一個touch的情況,而多個scrollview和多個touch的情況可以進行類比。

當一個scrollview包裹一個touch時,造成的沖突一般是touch響應時scrollview也會有響應,這時禁止scrollview的滾動即可,下面我們將說明一下如何解決scrollview在一個touch內部造成的手勢沖突

問題
當一個scrollview在一個touch內部時,scrollview將得不到任何事件(android上可能好一點兒),示例代碼如下:

export default class scrollPan extends Component {
    constructor(props){
        super(props);
        this.wrapperPanResponder = PanResponder.create({
            onStartShouldSetPanResponder: (e, g) => true,
            onPanResponderGrant: () => {
                console.log('GRANTED TO WRAPPER');
            },
            onPanResponderMove: (evt, gestureState) => {
                console.log('WRAPPER MOVED');
            }
        });

        this.scollerPanResponder = PanResponder.create({
            onStartShouldSetPanResponder: (e, g) => true,
            onPanResponderGrant: () => {
                console.log('GRANTED TO SCROLLER');
            },
            onPanResponderMove: (evt, gestureState) => {
                console.log('SCROLLER MOVED');
            }
        });
    }
    render() {
        return (
            <View style={styles.container} {...this.wrapperPanResponder.panHandlers}>
              <ScrollView onScroll={() => console.log('scrolled')} style={{maxHeight: 350}} {...this.scollerPanResponder.panHandlers}>
                <Text style={{fontSize:96}}>Scroll this</Text>
                <Text style={{fontSize:96}}>Scroll this</Text>
                <Text style={{fontSize:96}}>Scroll this</Text>
                <Text style={{fontSize:96}}>Scroll this</Text>
                <Text style={{fontSize:96}}>Scroll this</Text>
              </ScrollView>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
});

運行代碼后,點擊與滑動scrollview都沒有響應,為父touch加上手勢放行或者只攔截點擊事件,不攔截move事件也解決不了問題

解決辦法
將panResonder改為絕對布局,即可解決沖突

export default class scrollPan extends Component {
    constructor(props){
        super(props);
        this.wrapperPanResponder = PanResponder.create({
            onStartShouldSetPanResponder: (e, g) => true,
            onPanResponderGrant: () => {
                console.log('GRANTED TO WRAPPER');
            },
            onPanResponderMove: (evt, gestureState) => {
                console.log('WRAPPER MOVED');
            }
        });

        this.scollerPanResponder = PanResponder.create({
            onStartShouldSetPanResponder: (e, g) => true,
            onPanResponderGrant: () => {
                console.log('GRANTED TO SCROLLER');
            },
            onPanResponderMove: (evt, gestureState) => {
                console.log('SCROLLER MOVED');
            }
        });
    }
    render() {
        return (
            <View style={styles.container}>
              <View style={styles.pan_container} {...this.wrapperPanResponder.panHandlers} />
              <ScrollView onScroll={() => console.log('scrolled')} style={styles.scroll_view} {...this.scollerPanResponder.panHandlers}>
                <Text style={{fontSize:96}}>Scroll this</Text>
                <Text style={{fontSize:96}}>Scroll this</Text>
                <Text style={{fontSize:96}}>Scroll this</Text>
                <Text style={{fontSize:96}}>Scroll this</Text>
                <Text style={{fontSize:96}}>Scroll this</Text>
              </ScrollView>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },
    pan_container: {
        ...StyleSheet.absoluteFillObject,
        backgroundColor: 'blue'
    },
    scroll_view: {
        backgroundColor: 'teal',
        maxHeight: 350
    }
});
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,098評論 25 708
  • 在開發過程中,大家或多或少的都會碰到令人頭疼的手勢沖突問題,正好前兩天碰到一個類似的bug,于是借著這個機會了解了...
    閆仕偉閱讀 5,391評論 2 23
  • 好奇觸摸事件是如何從屏幕轉移到APP內的?困惑于Cell怎么突然不能點擊了?糾結于如何實現這個奇葩響應需求?亦或是...
    Lotheve閱讀 57,876評論 51 603
  • 在iOS開發中經常會涉及到觸摸事件。本想自己總結一下,但是遇到了這篇文章,感覺總結的已經很到位,特此轉載。作者:L...
    WQ_UESTC閱讀 6,102評論 4 26
  • 寫在前面:我本科財務管理專業,英語過了六級,日常交流沒有問題,并且最近有開始有目的的練習口語,所以自認為滿足招聘要...
    Minta翁閱讀 276評論 1 0