亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Android > 正文

Android Touch事件分發(fā)深入了解

2019-12-12 06:41:43
字體:
供稿:網(wǎng)友

本文帶著大家深入學(xué)習(xí)觸摸事件的分發(fā),具體內(nèi)容如下
1. 觸摸動作及事件序列

(1)觸摸事件的動作

    觸摸動作一共有三種:ACTION_DOWN、ACTION_MOVE、ACTION_UP。當(dāng)用戶手指接觸屏幕時,便產(chǎn)生一個動作為ACTION_DOWN的觸摸事件,此時若用戶的手指立即離開屏幕,會產(chǎn)生一個動作為ACTION_UP的觸摸事件;若用戶手指接觸屏幕后繼續(xù)滑動,當(dāng)滑動距離超過了系統(tǒng)中預(yù)定義的距離常數(shù),則產(chǎn)生一個動作為ACTION_MOVE的觸摸事件,系統(tǒng)中預(yù)定義的用來判斷用戶手指在屏幕上的滑動是否是一個ACTION_MOVE動作的這個距離常量叫做TouchSlop,可通過ViewConfiguration.get(getContext()).getScaledTouchSlop()獲取。

(2)事件序列

    當(dāng)用戶的手指接觸屏幕,在屏幕上滑動,又離開屏幕,這個過程會產(chǎn)生一系列觸摸事件:ACTION_DOWN-->若干個ACTION_MOVE-->ACTION_UP。這一系列觸摸事件即為一個事件序列。 

2. 觸摸事件的分發(fā)

(1)概述

    當(dāng)產(chǎn)生了一個觸摸時間后,系統(tǒng)要負責(zé)把這個觸摸事件給一個View(TargetView)來處理,touch事件傳遞到TargetView的過程即為touch事件的分發(fā)。

    觸摸事件的分發(fā)順序:Activity-->頂級View-->頂級View的子View-->. . .-->Target View

    觸摸事件的響應(yīng)順序:TargetView --> TargetView的父容器 --> . . . -->頂級View -->Activity

(2)toush事件分發(fā)的具體過程

  a. Activity對touch事件的分發(fā)

    當(dāng)用戶手指接觸屏幕時,便產(chǎn)生了一個touch事件,封裝了touch事件的MotionEvent最先被傳遞給當(dāng)前Activity,Activity的dispatchTouchEvent方法負責(zé)touch事件的分發(fā)。分發(fā)touch事件的實際工作由當(dāng)前Activity的Window完成,而Window會將touch事件傳遞給DecorView(當(dāng)前用戶界面頂級View)。Activity的dispatchTouchEvent方法代碼如下:

public boolean dispatchTouchEvent(MotionEvent ev) {  if (ev.getAction() == MotionEvent.ACTION_DOWN) {    onUserInteraction();  }  if (getWindow().superDispatchTouchEvent(ev)) {    return true;  }  return onTouchEvent(ev);}

    根據(jù)以上代碼可以知道,touch事件會交由Window的superDispatchTouchEvent進行分發(fā),若這個方法返回true,意味touch事件的分發(fā)過程結(jié)束,返回false則說明經(jīng)過層層分發(fā),沒有子View對這個事件進行處理,即所有子View的onTouchEvent方法都返回false(即這個touch事件沒有被“消耗”)。這時會調(diào)用Activity的onTouchEvent方法來處理這個touch事件。

    在Window的superDispatchTouchEvent方法中,首先會把touch事件分發(fā)給DecorView,因為它是當(dāng)前用戶界面的頂級View。Window的superDispatchTouchEvent方法如下:

public abstract boolean superDispatchTouchEvent(MotionEvent ev);
    是個抽象方法,這個方法由Window的實現(xiàn)類PhoneWindow實現(xiàn),PhoneWindow的superDispatchTouchEvent方法的代碼如下:

public boolean superDispatchTouchEvent(MotionEvent ev) {  return mDecor.superDispatchTouchEvent(event);}

    由以上代碼可得,PhoneWindow的superDispatchTouchEvent方法實際上是通過DecorView的superDispatchTouchEvent方法來完成自己的工作,也就是說,當(dāng)前Activity的Window直接將這個touch事件傳遞給了DecorView。也就是說,目前touch事件已經(jīng)經(jīng)過了如下的分發(fā):Activity-->Window-->DecorView。

b. 頂級View對touch事件的分發(fā)

    經(jīng)過Activity與Window的分發(fā),現(xiàn)在touch事件已經(jīng)被傳遞到了DecorView的dispatchTouchEvent方法中。DecorView本質(zhì)上是一個ViewGroup(更具體的說是FrameLayout),ViewGroup的dispatchTouchEvent方法所做的工作可以分為如下幾個階段,第一個階段的主要代碼如下:

//Handle an initial down.if (actionMasked == MotionEvent.ACTION_DOWN) {  //Throw away all previous state when starting a new touch gesture.  //The framework may have dropped the up or cancel event for the previous gesture due to an app switch, ANR, or some other state change.  cancelAndClearTouchTargets(ev);  resetTouchState();}

    第一階段的主要工作有倆:一是在第6行的resetTouchState方法中完成了對FLAG_DISALLOW_INTERCEPT標(biāo)記的重置;二是第5行的cancelAndClearTouchTargets方法會清除當(dāng)前MotionEvent的touch target。關(guān)于FLAG_DISALLOW_INTERCEPT標(biāo)記和touch target,在下文會有相關(guān)說明。

    第二階段的主要工作是決定當(dāng)前ViewGroup是否攔截本次的touch事件,主要代碼如下:

//Check for interception.final boolean intercepted;if (actionMasked == MotionEvent.ACTION_DOWM || mFirstTouchTarget != null) {  final boolean disallowIntercept = (mGroupFlags & FLAG_DISALLOW_INTERCEPT) != 0;  if (!disallowIntercept) {    intercepted = onInterceptTouchEvent(ev);    ev.setAction(action); //restore action in case it was changed  } else {    intercepted = false;  }} else {  //There are no touch targets and this action is not an initial down so this view group continues to intercept touches.  intercept =true;}

    由以上代碼我們可以知道,當(dāng)一個touch事件被傳遞到ViewGroup時,會先判斷這個touch事件的動作是否是ACTION_DOWN,如果這個事件是ACTION_DOWN或者mFirstTouchTarget不為null,就會根據(jù)FLAG_DISALLOW_INTERCEPT標(biāo)記決定是否攔截這個touch事件。那么mFirstTouchTarget是什么呢?當(dāng)touch事件被ViewGroup的子View成功處理時,mFirstTouchTarget就會被賦值為成功處理touch事件的View,也就是上面提高的touch target。

    總結(jié)一下上述代碼的流程:在子View不干預(yù)ViewGroup的攔截的情況下(上述代碼中的disallowIntercept為false),若當(dāng)前事件為ACTION_DOWN或者mFirstTouchTarget不為空,則會調(diào)用ViewGroup的onInterceptTouchEvent方法來決定最終是否攔截此事件;否則(沒有TargetView并且此事件不是ACTION_DOWN),當(dāng)前ViewGroup就攔截下此事件。 一旦ViewGroup攔截了某次touch事件,那么mFirstTouchTarget就不會被賦值,因此當(dāng)再有ACTION_MOVE或是ACTION_UP傳遞到該ViewGroup時,mTouchTarget就為null,所以上述代碼第3行的條件就為false,ViewGroup會攔截下來。由此可得到的結(jié)論是:一旦ViewGroup攔截了某次事件,則同一事件序列中的剩余事件也會它默認被攔截而不會再詢問是否攔截(即不會再調(diào)用onInterceptTouchEvent)。

    這里存在一種特殊情形,就是子View通過requestDisallowInterceptTouchEvent方法設(shè)置父容器的FLAG_DISALLOW_INTERCEPT為true,這個標(biāo)記指示是否不允許父容器攔截,為true表示不允許。這樣做能夠禁止父容器攔截除ACTION_DOWN以外的所有touch事件。之所以不能夠攔截ACTION_DOWN事件,是因為每當(dāng)ACTION_DOWN事件到來時,都會重置FLAG_DISALLOW_INTERCEPT這個標(biāo)記位為默認值(false),所以每當(dāng)開始一個新touch事件序列(即到來一個ACTION_DOWN動作),都會通過調(diào)用onInterceptTouchEven詢問ViewGroup是否攔截此事件。當(dāng)ACTION_DOWN事件到來時,重置標(biāo)記位的工作是在上面的第一階段完成的。  

    接下來,會進入第三階段的工作:

final boolean canceled = resetCancelNextUpFlag(this) || actionMasked == MotionEvent.ACTION_CANCEL;final boolean split = (mGroupFlags & FLAG_SPLIT_MOTION_EVENTS) != 0;TouchTarget newTouchTarget = null;boolean alreadyDispatchedToNewTouchTarget = false;if (!canceled && !intercepted) {  // 不是ACTION_CANCEL并且不攔截  if (actionMasked == MotionEvent.ACTION_DOWN) {     // 若當(dāng)前事件為ACTION_DOWN則去尋找這次事件新出現(xiàn)的touch target     final int actionIndex = ev.getActionIndex(); // always 0 for down     ...     final int childrenCount = mChildrenCount;     if (newTouchTarget == null && childrenCount != 0) {       // 根據(jù)觸摸的坐標(biāo)尋找能夠接收這個事件的touch target       final float x = ev.getX(actionIndex);       final float y = ev.getY(actionIndex);       final View[] children = mChildren;       // 遍歷所有子View       for (int i = childrenCount - 1; i >= 0; i--) {         final int childIndex = i;         final View child = children[childIndex];         // 尋找可接收這個事件并且touch事件坐標(biāo)在其區(qū)域內(nèi)的子View         if (!canViewReceivePointerEvents(child) || !isTransformedTouchPointInView(x, y, child, null)) {           continue;         }         newTouchTarget = getTouchTarget(child); // 找到了符合條件的子View,賦值給newTouchTarget         if (newTouchTarget != null) {           //Child is already receiving touch within its bounds.           //Give it the new pointer in addition to ones it is handling.           newTouchTarget.pointerIdBits |= idBitsToAssign;           break;         }         resetCancelNextUpFlag(child);         // 把ACTION_DOWN事件傳遞給子組件進行處理         if (dispatchTransformedTouchEvent(ev, false, child, idBitsToAssign)) {           //Child wants to receive touch within its bounds.           mLastTouchDownTime = ev.getDownTime();           if (preorderedList != null) {             //childIndex points into presorted list, find original index             for (int j=0;j<childrenCount;j++) {               if (children[childIndex]==mChildren[j]) {                 mLastTouchDownIndex=j;                 break;               }             }           } else {             mLastTouchDownIndex = childIndex;           }           mLastTouchDownX = ev.getX();           mLastTouchDownY = ev.getY();           //把mFirstTouchTarget賦值為newTouchTarget,此子View成為新的touch事件的起點           newTouchTarget = addTouchTarget(child, idBitsToAssign);           alreadyDispatchedToNewTouchTarget = true;           break;         }                  }     }  }}

    當(dāng)ViewGroup不攔截本次事件,則touch事件會分發(fā)給它的子View進行處理,相關(guān)代碼從第21行開始:遍歷所有ViewGroup的子View,尋找能夠處理此touch事件的子View,若一個子View不在播放動畫并且touch事件坐標(biāo)位于其區(qū)域內(nèi),則該子View能夠處理此touch事件,并且會把該子View賦值給newTouchTarget。

    若當(dāng)前遍歷到的子View能夠處理此touch事件,就會進入第38行的dispatchTransformedTouchEvent方法,該方法實際上調(diào)用了子View的dispatchTouchEvent方法。dispatchTransformedTouchEvent方法中相關(guān)的代碼如下:

if (child == null) {  handled = super.dispatchTouchEvent(event);} else {  handled = child.dispatchTouchEvent(event);}

    若dispatchTransformedTouchEvent方法傳入的child參數(shù)不為null,則會調(diào)用child(即處理touch事件的子View)的dispatchTouchEvent方法。若該子View的dispatchTouchEvent方法返回true,則dispatchTransformedTouchEvent方法也會返回true,則表示成功找到了一個處理該事件的touch target,會在第55行把newTouchTarget賦值給mFirstTouchTarget(這一賦值過程是在addTouchTarget方法內(nèi)部完成的),并跳出對子View遍歷的循環(huán)。若子View的dispatchTouchEvent方法返回false,ViewGroup就會把事件分發(fā)給下一個子View。

    若遍歷了所有子View后,touch事件都沒被處理(該ViewGroup沒有子View或是所有子View的dispatchTouchEvent返回false),ViewGroup會自己處理touch事件,相關(guān)代碼如下:

 if (mFirstTouchTarget == null) {   handled = dispatchTransformedTouchEvent(ev, canceled, null, TouchTarget.ALL_POINTER_IDS); }

    由以上代碼可知,ViewGroup自己處理touch事件時,會調(diào)用dispatchTransformedTouchEvent方法,傳入的child參數(shù)為null。根據(jù)上文的分析,傳入的chid為null時,會調(diào)用super.dispatchTouchEvent方法,即調(diào)用View類的dispatchTouchEvent方法。 

c. View對touch事件的處理

    View的dispatchTouchEvent方法的主要代碼如下:

public boolean dispatchTouchEvent(MotionEvent event) {  boolean result = false;  . . .    if (onFilterTouchEventForSecurity(event)) {    //noinspection SimplifiableIfStatement    ListenerInfo li = mListenerInfo;    if (li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED        && li.mOnTouchListener.onTouch(this, event)) {      result = true;    }        if (!result && onTouchEvent(event)) {      result = true;    }    . . .    return result;}

    由上述代碼可知,View對touch事件的處理過程如下:由于View不包含子元素,所以它只能自己處理事件。它首先會判斷是否設(shè)置了OnTouchListener,若設(shè)置了,會調(diào)用onTouch方法,若onTouch方法返回true(表示該touch事件已經(jīng)被消耗),則不會再調(diào)用onTouchEvent方法;若onTouch方法返回false或沒有設(shè)置OnTouchListener,則會調(diào)用onTouchEvent方法,onTouchEvent對touch事件進行具體處理的相關(guān)代碼如下:

if (((viewFlags & CLICKABLE) == CLICKABLE || (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)) {  switch (event.getAction()) {    case MotionEvent.ACTION_UP:      boolean prepressed = (mPrivateFlags & PFLAG_PREPRESSED) != 0;      if ((mPrivateFlags & PFLAG_PRESSED) != 0 || prepressed) {        . . .        if (!mHasPerformedLongPress) {          //This is a tap, so remove the longpress check           removeLongPressCallback();                    //Only perform take click actions if we were in the pressed state          if (!focusTaken) {            //Use a Runnable and post this rather than calling performClick directly.            //This lets other visual state of the view update before click actions start.            if (mPerformClick == null) {              mPerformClck = new PeformClick();            }            if (!post(mPerformClick)) {              performClick();            }          }        }        . . .      }      break;  }  . . .  return true;}


    由以上代碼可知,只要View的CLICKABLE屬性和LONG_CLICKABLE屬性有一個為true(View的CLICKABLE屬性和具體View有關(guān),LONG_CLICKABLE屬性默認為false,setOnClikListener和setOnLongClickListener會分別自動將以上倆屬性設(shè)為true),那么這個View就會消耗這個touch事件,即使這個View處于DISABLED狀態(tài)。若當(dāng)前事件是ACTION_UP,還會調(diào)用performClick方法,該View若設(shè)置了OnClickListener,則performClick方法會在其內(nèi)部調(diào)用onClick方法。performClick方法代碼如下:

public boolean performClick() {  final boolean result;  final ListenerInfo li = mListenerInfo;  if (li != null && li.mOnClickListener != null) {    playSoundEffect(SoundEffectConstants.CLICK);    li.mOnClickListener.onClick(this);    result = true;  } else {    result = false;  }  sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);  return result;}


 

以上是我學(xué)習(xí)Android中觸摸事件分發(fā)后的簡單總結(jié),很多地方敘述的還不夠清晰準(zhǔn)確

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
免费在线观看你懂的| 免费偷拍视频网站| 奇米影视888狠狠狠777不卡| 天堂中文а√在线| 国产亚洲成aⅴ人片在线观看| 日本中文字幕精品—区二区| 精品国产电影一区二区| 午夜在线视频观看| 欧洲日本亚洲国产区| 四虎4545www精品视频| 国产美女在线看| 久久精品亚洲精品| 91禁在线看| 欧美男女性生活在线直播观看| 亚洲免费在线视频一区 二区| 无码精品a∨在线观看中文| 2014亚洲天堂| 欧美熟妇精品黑人巨大一二三区| 亚洲精品wwwww| 在线看的你懂得| 日日躁夜夜躁aaaabbbb| 亚洲国产高清福利视频| 先锋影音亚洲资源| av网站手机在线观看| 九九热国产在线| xvideos国产在线视频| 国产精品白丝av| 亚洲色图网友自拍| 91高清免费看| 亚洲电影二区| 亚洲一区二区三区高清视频| 久久精品国产亚洲aⅴ| 亚洲国产精品一区制服丝袜| 老司机精品视频在线| 91手机在线播放| 国产ts人妖调教重口男| 精品9999| 五月天久久综合网| 色呦呦中文字幕| 北条麻妃国产九九九精品小说| 国产成人手机在线| 欧美黄色片视频| 色综合91久久精品中文字幕| 国产欧美 在线欧美| 日本一区二区三区四区| 亚洲永久激情精品| 欧美大成色www永久网站婷| 亚洲成人1234| 蜜臀av免费在线观看| av官网在线观看| 欧美bbb人妖| 精品人妻少妇AV无码专区| 欧美日韩在线网站| 一路向西2在线观看| 国产精品黄色| 国产福利精品一区| 桃乃木かなav在线播放| 中文岛国精品亚洲一区| 在线观看一区欧美| 久久精品一区二区三区四区| 亚洲影视资源网| 精品999日本| 亚洲一级av毛片| 亚洲日本免费电影| 黑人巨大猛交丰满少妇| 翡翠波斯猫1977年美国| av成人在线网站| 国产精品久线观看视频| 在线观看岛国av| 伊人亚洲综合网| 日本视频一区二区在线观看| 亚洲欧美另类久久久精品| 男人添女荫道口图片| 免费毛片在线播放| 韩国三级电影久久久久久| 国产老女人乱淫免费| 国产内射老熟女aaaa∵| 男女av一区三区二区色多| 劲爆欧美第一页| 韩国v欧美v亚洲v日本v| 国产精品蜜芽在线观看| 日韩欧美国产免费| 国产毛片毛片毛片毛片| 人九九综合九九宗合| 精品一区二区三区视频日产| 欧美视频在线第一页| 欧美一区二区三区免费视| 高h视频在线| 日韩国产欧美视频| 一二三四日本中文字幕| 三级网站在线| 亚洲一区二区三区四区五区黄| 亚洲 欧美 日韩 综合| 亚洲一区免费视频| 国产精品密蕾丝视频下载| 久久久久九九视频| 成人精品久久一区二区三区| 麻豆电影传媒二区| 一区二区三区四区日韩| 色综合色综合久久综合频道88| 精品91免费| 亚洲国产日韩在线| 中文在线8资源库| 噜噜噜狠狠夜夜躁精品仙踪林| luxu259在线中文字幕| 黄色片免费在线观看视频| 国产超碰在线播放| 国产一区二区女| 91麻豆桃色免费看| 中文字幕av观看| 丰满人妻中伦妇伦精品app| 91高清国产| 伊人久久大香线蕉精品| 中文字幕av一区二区三区人| 亚洲精品久久区二区三区蜜桃臀| 日日噜噜夜夜狠狠| 天天爽夜夜爽夜夜爽精品| 日本大片在线观看| 久久久久久久久久久影视| 青青草原国产在线| 狠狠色噜噜狠狠狠888奇米| 国产精区一区二区| 中文字幕人妻一区二区在线视频| 好吊一区二区三区| 日av在线播放中文不卡| 国产一区二区三区视频| 日韩aaaaa| 国产精品亚洲二区在线观看| 中文在线字幕免费观看| 18视频在线观看网站| 日本在线视频www鲁啊鲁| 精品视频在线免费看| 日韩视频在线观看国产| 日韩亚洲综合在线| 免费在线观看av片| avtt久久| 色综合久久久久综合| 国产一卡2卡3卡免费网站| 91精品免费看| 无套内谢大学处破女www小说| 天堂√在线观看一区二区| 一级全黄裸体免费视频| 岛国在线视频免费看| 拍拍拍在线观看视频免费| 青草青在线视频| 91精品国产91久久久久久三级| 久久久精品蜜桃| 欧美亚洲激情视频| 亚洲天堂精品在线观看| 国产欧美精品一区二区色综合朱莉| 久久综合国产精品台湾中文娱乐网| 国产精品变态另类虐交| 日韩欧美视频一区二区三区四区| 男女午夜视频在线观看| 午夜精品一区二区三区三上悠亚| 在线播放日韩欧美| 亚洲精美色品网站| 91精品国产经典在线观看| 国产一区二区三区免费不卡| 99www免费人成精品| 久久久久久久网站| 在线看av网址| 99久久久无码国产精品免费| 亚洲色图21p| 久久中文资源| 色天使在线观看| 亚洲精品欧美极品| 97精品超碰一区二区三区| 亚洲人成电影在线播放| 黄色另类av| 热久久这里只有精品| 国产女人高潮的av毛片| 国产亚洲精品久久久久久打不开| 白虎精品一区| 成人在线免费观看91| 精品视频久久久久久| 人成福利视频在线观看| 国产高清av在线| 久久蜜桃香蕉精品一区二区三区| 亚洲二区在线视频| 草莓污污视频在线观看| 爽爽影院免费观看视频| 亚洲精品成人自拍| 日韩在线不卡av| 成人禁用看黄a在线| av电影天堂一区二区在线观看| 在线免费观看黄| 国产亚洲一区二区三区啪| 中文字幕第3页| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 成年人网站国产| 搞黄视频在线观看| 色老头在线视频| 中文字幕在线精品| 亚洲精品成人在线播放| 韩日欧美一区二区三区| 久久成人羞羞网站| 亚洲三区欧美一区国产二区| 性欧美精品xxxx| 国产精品男人的天堂| 欧美日韩在线精品| 成人免费网站入口| 伊人色**天天综合婷婷| 成人女人免费毛片| 欧美人与性动交| 综合久久国产九一剧情麻豆| 免费看a在线观看| www视频在线免费观看| 亚洲精品aⅴ中文字幕乱码| 天堂精品在线视频| 成人黄色在线网站| 一区av在线播放| 在线综合视频网站| 国产视频久久网| 国产美女搞久久| 91九色02白丝porn| 精品人妻少妇AV无码专区| 黄色小说在线观看视频| 精品亚洲国产成av人片传媒| 三级男人添奶爽爽爽视频| 色综合久久天天综线观看| 国产精品亚洲欧美导航| 蜜桃麻豆www久久国产精品| 国产精品一区在线| 国产盗摄x88av| 二区三区在线播放| 国产日韩欧美中文在线| 欧美变态另类刺激| 在线亚洲一区观看| 欧洲大片精品免费永久看nba| 免费一级淫片| 污视频网站在线| 涩涩视频免费网站| 狠狠色丁香久久综合频道| 亚洲另类在线观看| 日韩精品视频一二三| 放荡的美妇在线播放| 亚洲男人av电影| 精品中文字幕视频| 欧美亚一区二区三区| 欧美美女一级片| 91亚洲国产| 精品人妻一区二区三区四区| 亚洲黄色免费在线观看| 182在线视频观看| av在线不卡观看免费观看| 亚洲精品欧美综合四区| 国产欧美日韩麻豆91| 折磨小男生性器羞耻的故事| 亚洲精品永久www嫩草| 欧美日韩免费视频| 老子影院午夜伦不卡大全| 国产精品一品视频| 秋霞欧美视频| 91免费视频污| 99在线视频精品| 国产成人99久久亚洲综合精品| 玖玖在线播放| 三上悠亚一区二区三区| 欧美a级成人淫片免费看| 国产欧美一区二区三区在线| 亚洲精品一区二区三区av| 日本不卡影院| 国产老肥熟xxxx在线观看| 成人午夜一级二级三级| 美女一区2区| 天堂资源在线中文精品| 欧美日韩中字一区| 777xxx欧美| 亚洲综合爱爱久久网| 日本一区二区三区四区在线视频| 国产成人精品久久一区二区小说| 午夜精品蜜臀一区二区三区免费| 成年无码av片在线| 成人av在线看| 欧美黄色免费看| 插吧插吧综合网| 欧美日精品一区视频| 免费无码毛片一区二区app| 久久九九久久九九| 免费在线观看污网站| 日韩亚洲综合在线| av中文在线资源| 性欧美videos粗暴| jizzjizz.con| 精品一区二区三区三区| 欧美不卡一二三| 国产一区二区三区不卡在线| 亚洲二区av| 日日噜噜噜夜夜爽爽狠狠视频| 国产艳妇疯狂做爰视频| 久久艳妇乳肉豪妇荡乳av| 精品久久久久久综合日本| 美女视频黄免费| 成人av手机在线| 国产精品免费无遮挡无码永久视频| 午夜精品福利一区二区三区蜜桃| 欧美成人免费高清视频| 蜜臀av国产精品久久久久| 老司机成人免费视频| 亚洲精品亚洲人成在线| 国产精品亚洲一区二区三区在线观看| 三级资源在线| 伊人成人在线观看| 狠狠躁夜夜躁久久躁别揉| 日韩欧美大片在线观看| 成人做爰69片免费看网站| 琪琪第一精品导航| 中文久久乱码一区二区| 国产精品一区二区三区99| 97在线看免费观看视频在线观看| 欧美极品美女视频网站在线观看免费| 亚洲综合第一页| 四虎影院一区二区| 超薄肉色丝袜足j调教99| 欧美日韩aaa| 上原亚衣加勒比在线播放| 亚洲精品一区中文| 小视频在线播放| 美脚丝袜脚交一区二区| 亚洲一二三四区不卡| 成人黄色图片网站| 精品乱子伦一区二区三区| 一区二区三区不卡在线观看| √资源天堂中文在线| 青青久久av| 成人影视亚洲图片在线| a美女胸又www黄视频久久|