精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

React Native觸摸事件處理詳解

移動(dòng)開發(fā) Android
觸控是移動(dòng)設(shè)備的核心功能,也移動(dòng)應(yīng)用交互的基礎(chǔ),Android 和 iOS 各自都有完善的觸摸事件處理機(jī)制。React Native(以下簡稱 RN)提供了一套統(tǒng)一的處理方式,能夠方便的處理界面中組件的觸摸事件、用戶手勢等。本文嘗試介紹 RN 中觸摸事件處理。

觸控是移動(dòng)設(shè)備的核心功能,也移動(dòng)應(yīng)用交互的基礎(chǔ),Android 和 iOS 各自都有完善的觸摸事件處理機(jī)制。React Native(以下簡稱 RN)提供了一套統(tǒng)一的處理方式,能夠方便的處理界面中組件的觸摸事件、用戶手勢等。本文嘗試介紹 RN 中觸摸事件處理。

1. RN 基本觸摸組件

RN 的組件除了 Text,其他組件默認(rèn)是不支持點(diǎn)擊事件,也不能響應(yīng)基本觸摸事件,所以 RN 中提供了幾個(gè)直接處理響應(yīng)事件的組件,基本上能夠滿大部分的點(diǎn)擊處理需求TouchableHighlight, TouchableNativeFeedback, TouchableOpacity 和 TouchableWithoutFeedback。因?yàn)檫@幾個(gè)組件的功能和使用方法基本類似,只是 Touch 的反饋效果不一樣,所以一般我們用 Touchable** 代替。Touchable** 有如下幾個(gè)回調(diào)方法:

  • onPressIn:點(diǎn)擊開始;
  • onPressOut:點(diǎn)擊結(jié)束或者離開;
  • onPress:單擊事件回調(diào);
  • onLongPress:長按事件回調(diào)。

它們的基本使用方法如下,這里以 TouchableHighlight 為例:

  1. <TouchableHighlight   
  2.   onPressIn={() => console.log("onPressIn")} 
  3.   onPressOut={() => console.log("onPressOut")} 
  4.   onPress={() => console.log("onPress")} 
  5.   onLongPress={() => console.log("onLongPress")} 
  6.   > 
  7.   <Image 
  8.     style={styles.button} 
  9.     source={require('./img/rn_logo.png')} /> 
  10. </TouchableHighlight>  

RN 中提供的觸摸組件使用非常簡單,可以參考 官方文檔,這里也不做詳細(xì)的介紹了。下面主要介紹用戶觸摸事件處理。

2. 單組件觸摸事件處理

我們知道,RN 的組件默認(rèn)不進(jìn)行處理觸摸事件。組件要處理觸摸事件,首先要“申請(qǐng)”成為摸事件的響應(yīng)者(Responder),完成事件處理以后,會(huì)釋放響應(yīng)者的角色。一個(gè)觸摸事件處理周期,是從用戶手指按下屏幕,到用戶抬起手指抬起結(jié)束,這是用戶的一次完整觸摸操作。

單個(gè)組件的單次操作交互處理的生命周期如下: 

 

 

單個(gè)組件的單次操作交互處理的生命周期 

我們來詳細(xì)分析一下事件處理的生命周期,在整個(gè)事件處理的過程中,組件有可能處于兩種身份中的一種,并且可以相互切換:非事件響應(yīng)者和事件響應(yīng)者。

非事件響應(yīng)者

默認(rèn)情況下,觸摸事件輸入不會(huì)直接傳遞給組件,不能進(jìn)行事件響應(yīng)處理,也就是非事件響應(yīng)者。如果組件要進(jìn)行觸摸事件處理,首先要申請(qǐng)成為事件響應(yīng)者,組件有如下兩個(gè)屬性可以做這樣的申請(qǐng):

  • View.props.onStartShouldSetResponder,這個(gè)屬性接收一個(gè)回調(diào)函數(shù),函數(shù)原型是 function(evt): bool,在觸摸事件開始(touchDown)的時(shí)候,RN 會(huì)回調(diào)此函數(shù),詢問組件是否需要成為事件響應(yīng)者,接收事件處理,如果返回 true,表示需要成為響應(yīng)者;
  • View.props.onMoveShouldSetResponder,它和前一個(gè)屬性類似,不過這是觸摸是進(jìn)行過程中(touchMove),RN 詢問組件是否要成為響應(yīng)者,返回 true 表示是。

假如組件通過上面的方法返回了 true,表示發(fā)出了申請(qǐng)要成為事件響應(yīng)者請(qǐng)求,想要接收后續(xù)的事件輸入。因?yàn)橥粫r(shí)刻,只能有一個(gè)事件處理響應(yīng)者,RN 還需要協(xié)調(diào)所有組件的事件處理請(qǐng)求,所以不是每個(gè)組件申請(qǐng)都能成功,RN 通過如下兩個(gè)回調(diào)來通知告訴組件它的申請(qǐng)結(jié)果,:

  • View.props.onResponderGrant: (evt) => {}:表示申請(qǐng)成功,組件成為了事件處理響應(yīng)者,這時(shí)組件就開始接收后序的觸摸事件輸入。一般情況下,這時(shí)開始,組件進(jìn)入了激活狀態(tài),并進(jìn)行一些事件處理或者手勢識(shí)別的初始化。
  • View.props.onResponderReject: (evt) => {}:表示申請(qǐng)失敗了,這意味者其他組件正在進(jìn)行事件處理,并且它不想放棄事件處理,所以你的申請(qǐng)被拒絕了,后續(xù)輸入事件不會(huì)傳遞給本組件進(jìn)行處理。

事件響應(yīng)者

如果通過上面的步驟,組件申請(qǐng)成為了事件響應(yīng)者,后續(xù)的事件輸入都會(huì)通過回調(diào)函數(shù)通知到組件,如下:

  • View.props.onResponderStart: (evt) => {}:表示手指按下時(shí),成功申請(qǐng)為事件響應(yīng)者的回調(diào);
  • View.props.onResponderMove: (evt) => {}:表示觸摸手指移動(dòng)的事件,這個(gè)回調(diào)可能非常頻繁,所以這個(gè)回調(diào)函數(shù)的內(nèi)容需要盡量簡單;
  • View.props.onResponderRelease: (evt) => {}:表示觸摸完成(touchUp)的時(shí)候的回調(diào),表示用戶完成了本次的觸摸交互,這里應(yīng)該完成手勢識(shí)別的處理,這以后,組件不再是事件響應(yīng)者,組件取消激活。
  • View.props.onResponderEnd: (evt) => {}:表示組件結(jié)束事件響應(yīng)的回調(diào)。

從前面的圖中也看到,在組件成為事件響應(yīng)者期間,其他組件也可能會(huì)申請(qǐng)觸摸事件處理。此時(shí) RN 會(huì)通過回調(diào)詢問你是否可以釋放響應(yīng)者角色讓給其他組件?;卣{(diào)如下:

  1. View.props.onResponderTerminationRequest: (evt) => bool 

如果回調(diào)函數(shù)返回為 true,則表示同意釋放響應(yīng)者角色,同時(shí)會(huì)回調(diào)如下函數(shù),通知組件事件響應(yīng)處理被終止了:

  1. View.props.onResponderTerminate: (evt) => {} 

這個(gè)回調(diào)也會(huì)發(fā)生在系統(tǒng)直接終止組件的事件處理,例如用戶在觸摸操作過程中,突然來電話的情況。

事件數(shù)據(jù)結(jié)構(gòu)

從前面我們看到,觸摸事件處理的回調(diào)都有一個(gè) evt 參數(shù),包含一個(gè)觸摸事件數(shù)據(jù) nativeEvent。nativeEvent 的詳細(xì)內(nèi)容如下:

  • identifier:觸摸的 ID,一般對(duì)應(yīng)手指,在多點(diǎn)觸控的時(shí)候,用來區(qū)分是哪個(gè)手指的觸摸事件;
  • locationX 和 locationY:觸摸點(diǎn)相對(duì)組件的位置;
  • pageX 和 pageY:觸摸點(diǎn)相對(duì)于屏幕的位置;
  • timestamp:當(dāng)前觸摸的事件的時(shí)間戳,可以用來進(jìn)行滑動(dòng)計(jì)算;
  • target:接收當(dāng)前觸摸事件的組件 ID;
  • changedTouches:evt 數(shù)組,從上次回調(diào)上報(bào)的觸摸事件,到這次上報(bào)之間的所有事件數(shù)組。因?yàn)橛脩粲|摸過程中,會(huì)產(chǎn)生大量事件,有時(shí)候可能沒有及時(shí)上報(bào),系統(tǒng)用這種方式批量上報(bào);
  • touches:evt 數(shù)組,多點(diǎn)觸摸的時(shí)候,包含當(dāng)前所有觸摸點(diǎn)的事件。

這些數(shù)據(jù)中,最常用的是 locationX 和 locationY 數(shù)據(jù),需要注意的是,因?yàn)檫@里是 Native 的數(shù)據(jù),所以他們的單位是實(shí)際像素。如果要轉(zhuǎn)換為 RN 中的邏輯單位,可以示使用如下方法:

  1. var pX = evt.nativeEvent.locationX / PixelRatio.get(); 

3. 嵌套組件事件處理

上一小節(jié)介紹的都是針對(duì)單個(gè)組件來說,事件處理的流程和機(jī)制。但是前面也提到了,當(dāng)組件需要作為事件處理響應(yīng)者時(shí),需要通過 onStartShouldSetResponder 或者 onMoveShouldSetResponder 回調(diào)返回值為 true 來申請(qǐng)。假如當(dāng)多個(gè)組件嵌套的時(shí)候,這兩個(gè)回調(diào)都返回了 true 的時(shí)候,但是同一個(gè)只能有一個(gè)事件處理響應(yīng)者,這種情況怎么處理呢?為了便于描述,假設(shè)我們的組件布局如下: 

 

 

 

在 RN 中,默認(rèn)情況下使用冒泡機(jī)制,響應(yīng)最深的組件***開始響應(yīng),所以前面描述的這種情況,如圖中,如果 A、B、C 三個(gè)組件的 on*ShouldSetResponder 都返回為 true,那么只有 C 組件會(huì)得到響應(yīng)成為響應(yīng)者。這種機(jī)制才能保證了界面所有的組件才能得到響應(yīng)。但是有些情況下,可能父組件可能需要處理事件,而禁止子組件響應(yīng)。RN 提供了一個(gè)劫持機(jī)制,也就是在觸摸事件往下傳遞的時(shí)候,先詢問父組件是否需要劫持,不給子組件傳遞事件,也就是如下兩個(gè)回調(diào):

  • View.props.onStartShouldSetResponderCapture:這個(gè)屬性接收一個(gè)回調(diào)函數(shù),函數(shù)原型是 function(evt): bool,在觸摸事件開始(touchDown)的時(shí)候,RN 容器組件會(huì)回調(diào)此函數(shù),詢問組件是否要劫持事件響應(yīng)者設(shè)置,自己接收事件處理,如果返回 true,表示需要劫持;
  • View.props.onMoveShouldSetResponderCapture:此函數(shù)類似,不過是在觸摸移動(dòng)事件(touchMove)詢問容器組件是否劫持。

可以把這種劫持機(jī)制看成是一種下沉機(jī)制,與上面的冒泡機(jī)制對(duì)應(yīng),我們可以總結(jié) RN 事件處理流程如下圖: 

 

 

RN 事件處理流程 

注,圖中的 * 表示可以為 Start 或者 Move,例如 on*ShouldSetResponderCapture 表示 onStartShouldSetResponderCapture 或者 onMoveShouldSetResponderCapture,其他的類似。

觸摸事件開始,首先調(diào)用 A 組件的 onStartShouldSetResponderCapture,若此回調(diào)返回 false,則按照?qǐng)D傳遞到 B 組件,然后調(diào)用 B 組件 onStartShouldSetResponderCapture,若返回 true,則事件不再傳遞給 C 組件,直接調(diào)用本組件的 onResponderStart,則 B 組件就成為事件響應(yīng)者,后續(xù)事件直接傳遞給它。其他的分析類似。

注意到,圖中還有 onTouchStart/onTouchStop 回調(diào),這個(gè)回調(diào)并不受響應(yīng)者的影響,在范圍內(nèi)的組件都會(huì)回調(diào)此函數(shù),而且調(diào)用順序是從最深層組件到最上層組件。

4. 手勢識(shí)別

前面只是介紹了簡單的觸摸事件處理機(jī)制及其使用方法,其實(shí)連續(xù)的觸摸事件,可以組成一些更高級(jí)手勢,例如我們最常見的滑動(dòng)屏幕內(nèi)容,雙指縮放(Pinch)或者旋轉(zhuǎn)圖片都是通過手勢識(shí)別完成的。

因?yàn)橛行┦謩菔呛艹S玫?,RN 也提供了內(nèi)置的手勢識(shí)別庫 PanResponder,它封裝了上面的事件回調(diào)函數(shù),對(duì)觸摸事件數(shù)據(jù)進(jìn)行加工,完成滑動(dòng)手勢識(shí)別,向我們提供更加高級(jí)有意義的接口,如下:

  • onMoveShouldSetPanResponder: (e, gestureState) => bool
  • onMoveShouldSetPanResponderCapture: (e, gestureState) => bool
  • onStartShouldSetPanResponder: (e, gestureState) => bool
  • onStartShouldSetPanResponderCapture: (e, gestureState) => bool
  • onPanResponderReject: (e, gestureState) => {…}
  • onPanResponderGrant: (e, gestureState) => {…}
  • onPanResponderStart: (e, gestureState) => {…}
  • onPanResponderEnd: (e, gestureState) => {…}
  • onPanResponderRelease: (e, gestureState) => {…}
  • onPanResponderMove: (e, gestureState) => {…}
  • onPanResponderTerminate: (e, gestureState) => {…}
  • onPanResponderTerminationRequest: (e, gestureState) => {…}
  • onShouldBlockNativeResponder: (e, gestureState) => bool

可以看到,這些接口與前面接收的基礎(chǔ)回調(diào)基本上是一一對(duì)應(yīng)的,其功能也是類似,這里就不再贅述。這里有一個(gè)特別的回調(diào) onShouldBlockNativeResponder 表示是否用 Native 平臺(tái)的事件處理,默認(rèn)是禁用的,全部使用 JS 中的事件處理,注意此函數(shù)目前只能在 Android 平臺(tái)上使用。不過這里回調(diào)函數(shù)都有一個(gè)新的參數(shù) gestureState,這是與滑動(dòng)相關(guān)的數(shù)據(jù),是對(duì)基本觸摸數(shù)據(jù)的分析處理,它的內(nèi)容如下:

  • stateID:滑動(dòng)手勢的 ID,在一次完整的交互中此 ID 保持不變;
  • moveX 和 moveY:自上次回調(diào),手勢移動(dòng)距離;
  • x0 和 y0:滑動(dòng)手勢識(shí)別開始的時(shí)候的在屏幕中的坐標(biāo);
  • dx 和 dy:從手勢開始時(shí),到當(dāng)前回調(diào)是移動(dòng)距離;
  • vx 和 vy:當(dāng)前手勢移動(dòng)的速度;
  • numberActiveTouches:當(dāng)期觸摸手指數(shù)量。

下面介紹一個(gè)簡單的實(shí)例,本例實(shí)現(xiàn)可以使用手指拖動(dòng)界面的圓形控件,使用實(shí)例如下:

  1. import React from 'react';   
  2. import {   
  3.   AppRegistry, 
  4.   PanResponder, 
  5.   StyleSheet, 
  6.   View
  7.   processColor, 
  8. from 'react-native'
  9.   
  10. var CIRCLE_SIZE = 80;   
  11. var CIRCLE_COLOR = 'blue';   
  12. var CIRCLE_HIGHLIGHT_COLOR = 'green'
  13.   
  14. var PanResponderExample = React.createClass({ 
  15.   
  16.   statics: { 
  17.     title: 'PanResponder Sample'
  18.     description: 'Shows the use of PanResponder to provide basic gesture handling.'
  19.   }, 
  20.   
  21.   _panResponder: {}, 
  22.   _previousLeft: 0, 
  23.   _previousTop: 0, 
  24.   _circleStyles: {}, 
  25.   circle: (null : ?{ setNativeProps(props: Object): void }), 
  26.   
  27.   componentWillMount: function() { 
  28.     this._panResponder = PanResponder.create({ 
  29.       onStartShouldSetPanResponder: (evt, gestureState) => true
  30.       onMoveShouldSetPanResponder: (evt, gestureState) => true
  31.       onPanResponderGrant: this._handlePanResponderGrant, 
  32.       onPanResponderMove: this._handlePanResponderMove, 
  33.       onPanResponderRelease: this._handlePanResponderEnd, 
  34.       onPanResponderTerminate: this._handlePanResponderEnd, 
  35.     }); 
  36.     this._previousLeft = 20; 
  37.     this._previousTop = 84; 
  38.     this._circleStyles = { 
  39.       style: { 
  40.         left: this._previousLeft, 
  41.         top: this._previousTop 
  42.       } 
  43.     }; 
  44.   }, 
  45.   
  46.   componentDidMount: function() { 
  47.     this._updatePosition(); 
  48.   }, 
  49.   
  50.   render: function() { 
  51.     return ( 
  52.       <View style={styles.container}> 
  53.         <View 
  54.           ref={(circle) => { 
  55.             this.circle = circle; 
  56.           }} 
  57.           style={styles.circle} 
  58.           {...this._panResponder.panHandlers} 
  59.         /> 
  60.       </View
  61.     ); 
  62.   }, 
  63.   
  64.   _highlight: function() { 
  65.     const circle = this.circle; 
  66.     circle && circle.setNativeProps({ 
  67.       style: { 
  68.         backgroundColor: processColor(CIRCLE_HIGHLIGHT_COLOR) 
  69.       } 
  70.     }); 
  71.   }, 
  72.   
  73.   _unHighlight: function() { 
  74.     const circle = this.circle; 
  75.     circle && circle.setNativeProps({ 
  76.       style: { 
  77.         backgroundColor: processColor(CIRCLE_COLOR) 
  78.       } 
  79.     }); 
  80.   }, 
  81.   
  82.   _updatePosition: function() { 
  83.     this.circle && this.circle.setNativeProps(this._circleStyles); 
  84.   }, 
  85.   
  86.   _handlePanResponderGrant: function(e: Object, gestureState: Object) { 
  87.     this._highlight(); 
  88.   }, 
  89.   _handlePanResponderMove: function(e: Object, gestureState: Object) { 
  90.     this._circleStyles.style.left = this._previousLeft + gestureState.dx; 
  91.     this._circleStyles.style.top = this._previousTop + gestureState.dy; 
  92.     this._updatePosition(); 
  93.   }, 
  94.   _handlePanResponderEnd: function(e: Object, gestureState: Object) { 
  95.     this._unHighlight(); 
  96.     this._previousLeft += gestureState.dx; 
  97.     this._previousTop += gestureState.dy; 
  98.   }, 
  99. }); 
  100.   
  101. var styles = StyleSheet.create({   
  102.   circle: { 
  103.     width: CIRCLE_SIZE, 
  104.     height: CIRCLE_SIZE, 
  105.     borderRadius: CIRCLE_SIZE / 2, 
  106.     backgroundColor: CIRCLE_COLOR, 
  107.     position: 'absolute'
  108.     left: 0, 
  109.     top: 0, 
  110.   }, 
  111.   container: { 
  112.     flex: 1, 
  113.     paddingTop: 64, 
  114.   }, 
  115. });  

可見,在 componentWillMount 中創(chuàng)建一個(gè) PanResponder 實(shí)例,并設(shè)置想好相關(guān)的屬性,然后把這個(gè)對(duì)象設(shè)置給 View 的屬性,如下:

  1. <View   
  2.   {...this._panResponder.panHandlers} 
  3. />  

其余的代碼也比較簡單,這里就不詳述了。

5. 總結(jié)

通過上面的介紹,可以看到 RN 中提供了類似 Native 平臺(tái)的事件處理機(jī)制,所以也可以實(shí)現(xiàn)各種的觸摸事件處理,甚至也可以實(shí)現(xiàn)復(fù)雜的手勢識(shí)別。

在嵌套組件的事件處理中,RN 中提供了“冒泡”和“下沉”兩個(gè)方向的事件處理,這有點(diǎn)類似于 Android Native 上不久前才支持的 NestedScrolling,這就提供更加強(qiáng)大的事件處理機(jī)制。

另外需要注意,因?yàn)?RN 的異步通信和執(zhí)行機(jī)制,前面描述的所有回調(diào)函數(shù)都是在 JS 線程中,并不是 Native 的 UI 線程,而 Native 平臺(tái)的 Touch 事件都是在 UI 線程中。所以在 JS 中通過 Touch 或者手勢實(shí)現(xiàn)動(dòng)畫,可能會(huì)延遲的問題。

責(zé)任編輯:龐桂玉 來源: 安卓開發(fā)精選
相關(guān)推薦

2011-08-02 16:28:40

iPhone Web開發(fā) 事件

2023-01-04 10:01:21

ReactTypeScript元素

2023-07-03 13:50:13

ReactonResize事件

2022-04-19 09:00:52

ReactTypeScript

2015-11-06 13:59:01

JavaScript事件處理

2016-10-13 19:01:59

React NativUbuntu

2016-12-08 22:59:47

觸摸事件android

2024-07-08 00:00:07

2023-06-24 17:09:06

React前端

2016-08-12 13:55:06

2016-08-12 08:49:46

React NativFacebookNative

2015-09-22 09:50:36

FacebookAndroid

2017-09-11 14:35:34

編輯器開發(fā)環(huán)境React

2013-04-22 15:40:00

Android開發(fā)觸摸事件與點(diǎn)擊事件區(qū)別

2010-01-05 10:29:43

.NET Framew

2013-04-15 15:22:06

2013-05-14 11:08:23

AIR Android觸摸事件鼠標(biāo)事件

2017-03-21 21:37:06

組件UI測試架構(gòu)

2017-03-09 13:29:04

ReactNative JSPatch

2024-02-20 01:53:01

ReactFlutter開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

手机av在线网| 另类小说综合网| 911国产在线| 欧美日韩国产一区二区在线观看| 亚洲特级片在线| 97伦理在线四区| 成人免费看片98欧美| 国产精品一区高清| 91精品婷婷国产综合久久性色| 午夜在线视频免费观看| 人人妻人人玩人人澡人人爽| 免费在线欧美黄色| 日韩在线播放av| 性欧美18—19sex性高清| 午夜欧美巨大性欧美巨大| 亚洲视频在线一区| 久久精品国产一区二区三区日韩 | 欧美成人精品3d动漫h| 人妻少妇被粗大爽9797pw| 免费网站免费进入在线| 国产乱一区二区| 国产成人精品综合久久久| xxxx日本少妇| 青草国产精品| 日韩精品在线视频观看| 中文字幕 欧美 日韩| 日本精品另类| 狠狠色香婷婷久久亚洲精品| 久久av喷吹av高潮av| 黄色电影免费在线看| 成人性生交大片免费| 国产精品旅馆在线| 中文字幕一区在线播放| 国产精品v亚洲精品v日韩精品 | 久久久久久色| 久久久伊人日本| 网站永久看片免费| 国产成人影院| 亚洲国产精品久久91精品| 岛国av在线免费| 户外露出一区二区三区| 欧美日韩免费看| 色哟哟免费网站| 国产一二区在线| av色综合久久天堂av综合| 国产精品美腿一区在线看| 国产亚洲成人精品| 中文字幕一区二区三三| 在线观看国产成人av片| 少妇久久久久久久久久| 久久丝袜视频| 免费看日本一区二区| 国产欧美大片| 色综合久久88色综合天天看泰| 天堂av网手机版| 成人国产精品一级毛片视频| 国产一区二区三区视频| 一级黄色片大全| 国产传媒欧美日韩成人精品大片| 亚洲精品日韩丝袜精品| 亚洲av无码成人精品国产| 亚洲国产精品嫩草影院久久av| 日韩二区三区在线| 六月婷婷七月丁香| 一个色免费成人影院| 亚洲色图综合网| 日韩一级av毛片| 日韩欧美一区二区三区在线视频| 中文一区二区视频| 国精产品久拍自产在线网站| 性xxxx欧美老肥妇牲乱| 久热精品视频在线观看| 朝桐光av在线| 亚洲国产精品第一区二区| 国语自产精品视频在线看| 四虎永久在线精品| 久久福利影视| 国产美女被下药99| 国产a级免费视频| 成人激情免费网站| 麻豆精品蜜桃一区二区三区| 国产高清视频在线观看| 亚洲婷婷在线视频| 丝袜人妻一区二区三区| 不卡福利视频| 欧美高清性hdvideosex| 特黄特色免费视频| 欧美18免费视频| 国产亚洲精品久久久优势| 国产精品精品软件男同| 在线观看日韩av电影| 日韩69视频在线观看| 一级黄色片在线| 成人sese在线| 亚洲欧洲精品在线| 青草在线视频| 日本丰满少妇一区二区三区| aaaaaaaa毛片| 美女少妇全过程你懂的久久| 久久综合国产精品台湾中文娱乐网| 国产小视频在线观看免费| 丝袜诱惑制服诱惑色一区在线观看| 国产在线精品自拍| 天天干,天天操,天天射| 国产精品免费视频观看| 免费超爽大片黄| aaaa欧美| 日韩成人av一区| 黄色a级片在线观看| 久久动漫亚洲| 国产九色91| 老司机午夜在线视频| 日韩欧美在线播放| 熟妇女人妻丰满少妇中文字幕| 国产成人一区二区三区影院| 国内成人精品视频| 91精品中文字幕| 久久综合九色综合97婷婷 | 日韩系列欧美系列| 91精品国产一区| 国产按摩一区二区三区| 国产欧美日韩麻豆91| 青青青在线视频播放| 99久久999| 国产亚洲精品久久久久动| 久久夜靖品2区| 国产成人自拍在线| 中文字幕一区二区三区最新| 黑人巨大精品欧美一区二区桃花岛| 日韩一区二区三区电影| 99久久精品久久亚洲精品| 母乳一区在线观看| 国产一区二区无遮挡| 国产不卡在线| 欧美片在线播放| 91视频免费在观看| 母乳一区在线观看| 精品国产一区二区三区麻豆免费观看完整版 | 亚洲熟女乱综合一区二区| 日本一区二区高清不卡| 国产精品99久久久久久www| 十九岁完整版在线观看好看云免费| 一区二区三区在线观看视频 | 青青青国产精品| 中文字幕欧美精品在线| 欧美一级黄视频| 欧美经典一区二区| 亚洲成人av免费看| 欧州一区二区| 国产精品第1页| 99精品老司机免费视频| 欧美中文字幕亚洲一区二区va在线| 欧美色图亚洲激情| 久久久精品五月天| 日韩一区免费观看| 成人久久网站| 精品国产一区二区三区在线观看| 中文字幕av免费观看| 中文字幕国产一区| 色啦啦av综合| 911精品美国片911久久久| 亚洲自拍小视频免费观看| 中文在线字幕免费观看| 欧美va在线播放| 国产91av视频| 国产拍欧美日韩视频二区| 特级丰满少妇一级| 香港欧美日韩三级黄色一级电影网站| 3d动漫啪啪精品一区二区免费 | 一级女性全黄久久生活片免费| 一个人看的视频www| 亚洲国产片色| 欧美日韩在线一二三| 成人a在线观看高清电影| 啊v视频在线一区二区三区| 国产高清不卡视频| 香蕉成人啪国产精品视频综合网| 国产交换配乱淫视频免费| 青青青爽久久午夜综合久久午夜| 偷拍盗摄高潮叫床对白清晰| 成人盗摄视频| 国产成人精品日本亚洲专区61| 尤物网在线观看| 欧美成人精品福利| 亚洲 欧美 日韩 在线| 综合av第一页| av2014天堂网| 极品少妇xxxx精品少妇| 成人毛片一区二区| 日本激情一区| 国产一区二区精品在线| 精品无人乱码一区二区三区| 美女久久久久久久久久久| 无码国产精品96久久久久| 在线观看三级视频欧美| 久久久久久久极品内射| 久久久精品黄色| 毛毛毛毛毛毛毛片123| 国产婷婷精品| 国产成人精品免费看在线播放| 牛牛精品成人免费视频| 成人免费黄色网| 一区二区精品伦理...| 美女黄色丝袜一区| 国产小视频免费在线网址| 日韩欧美一区电影| 黄色网址中文字幕| 亚洲一区二三区| 日韩av片在线| 91视频一区二区三区| 色婷婷综合在线观看| 全国精品久久少妇| 欧美在线观看成人| 欧美阿v一级看视频| 日韩免费一区二区三区| 美腿丝袜亚洲图片| 97中文在线观看| 国产精品99精品一区二区三区∴| 久久国产精品影片| 91se在线| 伊人久久久久久久久久| 色猫av在线| 亚洲国产高清高潮精品美女| 精品国产18久久久久久| 欧美喷潮久久久xxxxx| 性高潮视频在线观看| 欧美丝袜第一区| 日本亚洲欧美在线| 亚洲一级片在线观看| 丁香花五月激情| 亚洲色图视频免费播放| 日韩av片在线免费观看| 国产片一区二区三区| 亚洲av无码国产精品麻豆天美| 99久久国产综合色|国产精品| 欧美xxxx黑人| 国产a精品视频| 国产黄色一区二区三区| 国产做a爰片久久毛片| 亚洲另类第一页| 美洲天堂一区二卡三卡四卡视频 | 影视一区二区三区| 欧美在线视频观看| 成人欧美magnet| 欧美在线不卡区| 欧美极品影院| 国产精品都在这里| 亚洲综合在线电影| 国产精品 欧美在线| 国产一区一一区高清不卡| 国产成人免费av电影| 在线看欧美视频| 国产精品欧美日韩久久| 欧美在线se| 97超级在线观看免费高清完整版电视剧| 伊人亚洲精品| 福利视频久久| 全国精品免费看| 欧美日韩精品免费看| 国产a久久精品一区二区三区| 日本一区二区三区www| 成人直播大秀| 国产欧美综合一区| 国产精品hd| 欧美三级一级片| 日韩电影网1区2区| 日韩va在线观看| 国产精品888| 大乳护士喂奶hd| 国产欧美一区视频| 国精产品久拍自产在线网站| 亚洲一区二区中文在线| 亚洲 欧美 日韩 综合| 欧美午夜精品免费| h狠狠躁死你h高h| 亚洲国产欧美一区二区三区同亚洲| 神马精品久久| 精品国内亚洲在观看18黄| 欧美v亚洲v| 国产精品久久久久久av福利| 精品中文字幕一区二区三区| 九色91在线视频| 久久亚洲国产| 免费观看国产精品视频| 秋霞午夜鲁丝一区二区老狼| а 天堂 在线| 91小视频免费看| 三级黄色片在线观看| 亚洲午夜久久久久久久久电影院 | 亚洲精品在线免费观看视频| 免费人成在线观看网站| 久久在线精品视频| 午夜影院在线播放| 91探花福利精品国产自产在线| 欧美日韩一区二区三区四区不卡| 一本色道久久99精品综合| 红桃视频亚洲| 亚洲国产成人va在线观看麻豆| 成人av免费在线播放| 成人18视频免费69| 精品欧美国产一区二区三区| 91尤物国产福利在线观看| 日韩激情视频在线| 二区三区在线观看| 国产成人综合一区二区三区| 91午夜精品| 伊人久久大香线蕉午夜av| 国产精品美女| 久久出品必属精品| 91麻豆精品秘密| 久久久久久久蜜桃| 欧美猛男男办公室激情| 久草福利在线| 91精品国产色综合久久不卡98口| 久久免费福利| 一区二区三区在线视频看| 亚洲欧美日韩一区在线观看| 99国产精品免费视频| 国产精品理伦片| 亚洲男人天堂网址| 日韩av在线资源| 欧美人与性动交α欧美精品济南到| 国产精品久久久久久av福利软件| 欧美偷窥清纯综合图区| 久青草视频在线播放| 国产在线看一区| 成人无码精品1区2区3区免费看| 日本久久一区二区三区| 深夜福利在线视频| 97国产真实伦对白精彩视频8| 一区二区三区视频免费视频观看网站| 一本一本久久a久久精品综合妖精| 视频一区二区欧美| 无码人妻精品一区二区三区温州| 亚洲成在人线免费| www.超碰在线.com| 免费av一区二区| 国产精品va视频| 男人天堂成人网| 国产美女av一区二区三区| 国产高清视频免费在线观看| 欧美日韩综合在线| 777电影在线观看| 国产欧美日韩亚洲精品| 国产一区二区三区电影在线观看 | 中文字幕一区二区三区5566| 日本视频一区二区| 五月婷婷婷婷婷| 欧美精品久久99| 麻豆传媒免费在线观看| 91牛牛免费视频| 欧美视频在线观看| 亚洲视频 中文字幕| 午夜国产不卡在线观看视频| 午夜黄色小视频| 青青草成人在线| 精品在线播放| 另类小说第一页| 日韩毛片精品高清免费| 99久久精品国产色欲| 久久69精品久久久久久国产越南| 深夜激情久久| 怡红院av亚洲一区二区三区h| www日韩大片| 伊人网综合在线| 美女av一区二区| 日韩欧美中文字幕电影| 成人亚洲视频在线观看| 国产精品视频你懂的| 国产三级伦理片| 91sa在线看| 欧美在线观看视频一区| 亚洲欧美日本一区二区三区| 亚洲男同1069视频| 熟妇人妻av无码一区二区三区| 国产成人a亚洲精品| 999久久久精品国产| 国产原创剧情av| 在线观看亚洲精品视频| 欧美高清视频| 国产一区二区在线网站| 免费在线一区观看| 久久久精品视频在线| 亚洲男人天堂2019| av在线精品| 日本福利视频在线| 国产精品毛片久久久久久| 不卡av中文字幕| 国产精品成人在线| 亚洲午夜激情在线| 微拍福利一区二区| 日韩欧美一级特黄在线播放| 日韩欧美精品电影| 国产视频在线观看网站| 国产午夜三级一区二区三| 国产黄色片免费观看| 庆余年2免费日韩剧观看大牛| 亚州av乱码久久精品蜜桃| 日本黄色特级片| 日韩欧美一区二区不卡|