react native scrollview手勢沖突

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

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

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

問題
當(dāng)一個scrollview在一個touch內(nèi)部時,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都沒有響應(yīng),為父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
    }
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容