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

Android View繪制的三大流程

移動開發 Android
View的工作流程主要是指measure、layout、draw這三大流程,即測量、布局和繪制,其中measure確定View的測量寬高,layout根據測量的寬高確定View在其父View中的四個頂點的位置,而draw則將View繪制到屏幕上,這樣通過ViewGroup的遞歸遍歷,一個View樹就展現在屏幕上了。

介紹

View的工作流程主要是指measure、layout、draw這三大流程,即測量、布局和繪制,其中measure確定View的測量寬高,layout根據測量的寬高確定View在其父View中的四個頂點的位置,而draw則將View繪制到屏幕上,這樣通過ViewGroup的遞歸遍歷,一個View樹就展現在屏幕上了。說的簡單,下面帶大家一步一步從源碼中分析:

Android的View是樹形結構的:

 

基本概念

在介紹View的三大流程之前,我們必須先介紹一些基本的概念,才能更好地理解這整個過程。

Window的概念

Window表示的是一個窗口的概念,它是站在WindowManagerService角度上的一個抽象的概念,Android中所有的視圖都是通過Window來呈現的,不管是Activity、Dialog還是Toast,只要有View的地方就一定有Window。

這里需要注意的是,這個抽象的Window概念和PhoneWindow這個類并不是同一個東西,PhoneWindow表示的是手機屏幕的抽象,它充當Activity和DecorView之間的媒介,就算沒有PhoneWindow也是可以展示View的。

拋開一切,僅站在WindowManagerService的角度上,Android的界面就是由一個個Window層疊展現的,而Window又是一個抽象的概念,它并不是實際存在的,它是以View的形式存在,這個View就是DecorView。

關于Window這方面的內容,我們這里先了解一個大概

DecorView的概念

DecorView是整個Window界面的最頂層View,View的測量、布局、繪制、事件分發都是由DecorView往下遍歷這個View樹。DecorView作為***View,一般情況下它內部會包含一個豎直方向的LinearLayout,在這個LinearLayout里面有上下兩個部分(具體情況和Android的版本及主題有關),上面是【標題欄】,下面是【內容欄】。在Activity中我們通過setContentView所設置的布局文件其實就是被加載到【內容欄】中的,而內容欄的id是content,因此指定布局的方法叫setContent().

 

ViewRoot的概念

ViewRoot對應于ViewRootImpl類,它是連接WindowManager和DecorView的紐帶,View的三大流程均是通過ViewRoot來完成的。在ActivityThread中,當Activity對象被創建完之后,會講DecorView添加到Window中,同時會創建對應的ViewRootImpl,并將ViewRootImpl和DecorView建立關聯,并保存到WindowManagerGlobal對象中。

  1. WindowManagerGlobal.java 
  2.  
  3. root = new ViewRootImpl(view.getContext(), display);   
  4. root.setView(view, wparams, panelParentView);  

Java

View的繪制流程是從ViewRoot的performTraversals方法開始的,它經過measure、layout和draw三個過程才能最終將一個View繪制出來,大致流程如下圖:

 

Measure測量

為了更好地理解View的測量過程,我們還需要理解MeasureSpec,它是View的一個內部類,它表示對View的測量規格。MeasureSpec代表一個32位int值,高2位代表SpecMode(測量模式),低30位代表SpecSize(測量大小),我們可以看看它的具體實現: 

  1. MeasureSpec.java 
  2.  
  3. public static class MeasureSpec {   
  4.         private static final int MODE_SHIFT = 30; 
  5.         private static final int MODE_MASK  = 0x3 << MODE_SHIFT; 
  6.  
  7.         /** 
  8.           * UNSPECIFIED 模式: 
  9.           * 父View不對子View有任何限制,子View需要多大就多大 
  10.           */  
  11.         public static final int UNSPECIFIED = 0 << MODE_SHIFT; 
  12.  
  13.         /** 
  14.           * EXACTYLY 模式: 
  15.           * 父View已經測量出子Viwe所需要的精確大小,這時候View的最終大小 
  16.           * 就是SpecSize所指定的值。對應于match_parent和精確數值這兩種模式 
  17.           */  
  18.         public static final int EXACTLY     = 1 << MODE_SHIFT; 
  19.  
  20.         /** 
  21.           * AT_MOST 模式: 
  22.           * 子View的最終大小是父View指定的SpecSize值,并且子View的大小不能大于這個值, 
  23.           * 即對應wrap_content這種模式 
  24.           */  
  25.         public static final int AT_MOST     = 2 << MODE_SHIFT; 
  26.  
  27.         //將size和mode打包成一個32位的int型數值 
  28.         //高2位表示SpecMode,測量模式,低30位表示SpecSize,某種測量模式下的規格大小 
  29.         public static int makeMeasureSpec(int sizeint mode) { 
  30.             if (sUseBrokenMakeMeasureSpec) { 
  31.                 return size + mode; 
  32.             } else { 
  33.                 return (size & ~MODE_MASK) | (mode & MODE_MASK); 
  34.             } 
  35.         } 
  36.  
  37.         //將32位的MeasureSpec解包,返回SpecMode,測量模式 
  38.         public static int getMode(int measureSpec) { 
  39.             return (measureSpec & MODE_MASK); 
  40.         } 
  41.  
  42.         //將32位的MeasureSpec解包,返回SpecSize,某種測量模式下的規格大小 
  43.         public static int getSize(int measureSpec) { 
  44.             return (measureSpec & ~MODE_MASK); 
  45.         } 
  46.         //... 
  47.     }  

Java

MeasureSpec通過將SpecMode和SpecSize打包成一個int值來避免過多的對象內存分配,并提供了打包和解包的方法。

SpecMode有三種類型,每一類都表示特殊的含義:

UNSPECIFIED

父容器不對View有任何限制,要多大就給多大,這種情況一般用于系統內部,表示一種測量的狀態;

EXACTLY

父容器已經檢測出View所需的精確大小,這個時候View的最終打消就是SpecSize所指定的值。它對應于LayoutParams中的match_parent和具體數值這兩種模式。

AT_MOST

父容器指定了一個可用大小即SpecSize,View的大小不能大于這個值,具體是什么值要看不同View的具體實現。它對應于LayoutParams中wrap_content。

View的MeasureSpec是由父容器的MeasureSpec和自己的LayoutParams決定的,但是對于DecorView來說有點不同,因為它沒有父類。在ViewRootImpl中的measureHierarchy方法中有如下一段代碼展示了DecorView的MeasureSpec的創建過程,其中desiredWindowWidth和desireWindowHeight是屏幕的尺寸大小:

ViewGroup的measure

  1. childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width); 
  2.  
  3. childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); 
  4.  
  5. performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);  

Java

再看看getRootMeasureSpec方法:

  1. private static int getRootMeasureSpec(int windowSize, int rootDimension) { 
  2.         int measureSpec; 
  3.         switch (rootDimension) { 
  4.  
  5.         case ViewGroup.LayoutParams.MATCH_PARENT: 
  6.             // Window can't resize. Force root view to be windowSize. 
  7.             measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.EXACTLY); 
  8.             break; 
  9.         case ViewGroup.LayoutParams.WRAP_CONTENT: 
  10.             // Window can resize. Set max size for root view
  11.             measureSpec = MeasureSpec.makeMeasureSpec(windowSize, MeasureSpec.AT_MOST); 
  12.             break; 
  13.         default
  14.             // Window wants to be an exact sizeForce root view to be that size
  15.             measureSpec = MeasureSpec.makeMeasureSpec(rootDimension, MeasureSpec.EXACTLY); 
  16.             break; 
  17.         } 
  18.         return measureSpec; 
  19.     }  

Java

通過以上代碼,DecorView的MeasureSpec的產生過程就很明確了,因為DecorView是FrameLyaout的子類,屬于ViewGroup,對于ViewGroup來說,除了完成自己的measure過程外,還會遍歷去調用所有子元素的measure方法,各個子元素再遞歸去執行這個過程。和View不同的是,ViewGroup是一個抽象類,他沒有重寫View的onMeasure方法,這里很好理解,因為每個具體的ViewGroup實現類的功能是不同的,如何測量應該讓它自己決定,比如LinearLayout和RelativeLayout。

因此在具體的ViewGroup中需要遍歷去測量子View,這里我們看看ViewGroup中提供的測量子View的measureChildWithMargins方法:

  1. protected void measureChildWithMargins(View child, 
  2.             int parentWidthMeasureSpec, int widthUsed, 
  3.             int parentHeightMeasureSpec, int heightUsed) { 
  4.         final MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); 
  5.  
  6.         final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, 
  7.                 mPaddingLeft + mPaddingRight + lp.leftMargin + lp.rightMargin 
  8.                         + widthUsed, lp.width); 
  9.         final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec, 
  10.                 mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin 
  11.                         + heightUsed, lp.height); 
  12.  
  13.         child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 
  14.     }  

Java

上述方法會對子元素進行measure,在調用子元素的measure方法之前會先通過getChildMeasureSpec方法來得到子元素的MeasureSpec。從代碼上看,子元素的MeasureSpec的創建與父容器的MeasureSpec和本身的LayoutParams有關,此外和View的margin和父類的padding有關,現在看看getChildMeasureSpec的具體實現:

  1. ViewGroup.java 
  2.  
  3. public static int getChildMeasureSpec(int spec, int padding, int childDimension) {   
  4.     int specMode = MeasureSpec.getMode(spec); 
  5.     int specSize = MeasureSpec.getSize(spec); 
  6.  
  7.     int size = Math.max(0, specSize - padding); 
  8.  
  9.     int resultSize = 0; 
  10.     int resultMode = 0; 
  11.  
  12.     switch (specMode) { 
  13.     // Parent has imposed an exact size on us 
  14.     case MeasureSpec.EXACTLY: 
  15.         if (childDimension >= 0) { 
  16.             resultSize = childDimension; 
  17.             resultMode = MeasureSpec.EXACTLY; 
  18.         } else if (childDimension == LayoutParams.MATCH_PARENT) { 
  19.             // Child wants to be our size. So be it. 
  20.             resultSize = size
  21.             resultMode = MeasureSpec.EXACTLY; 
  22.         } else if (childDimension == LayoutParams.WRAP_CONTENT) { 
  23.             // Child wants to determine its own size. It can't be 
  24.             // bigger than us. 
  25.             resultSize = size
  26.             resultMode = MeasureSpec.AT_MOST; 
  27.         } 
  28.         break; 
  29.  
  30.     // Parent has imposed a maximum size on us 
  31.     case MeasureSpec.AT_MOST: 
  32.         if (childDimension >= 0) { 
  33.             // Child wants a specific size... so be it 
  34.             resultSize = childDimension; 
  35.             resultMode = MeasureSpec.EXACTLY; 
  36.         } else if (childDimension == LayoutParams.MATCH_PARENT) { 
  37.             // Child wants to be our size, but our size is not fixed. 
  38.             // Constrain child to not be bigger than us. 
  39.             resultSize = size
  40.             resultMode = MeasureSpec.AT_MOST; 
  41.         } else if (childDimension == LayoutParams.WRAP_CONTENT) { 
  42.             // Child wants to determine its own size. It can't be 
  43.             // bigger than us. 
  44.             resultSize = size
  45.             resultMode = MeasureSpec.AT_MOST; 
  46.         } 
  47.         break; 
  48.  
  49.     // Parent asked to see how big we want to be 
  50.     case MeasureSpec.UNSPECIFIED: 
  51.         if (childDimension >= 0) { 
  52.             // Child wants a specific size... let him have it 
  53.             resultSize = childDimension; 
  54.             resultMode = MeasureSpec.EXACTLY; 
  55.         } else if (childDimension == LayoutParams.MATCH_PARENT) { 
  56.             // Child wants to be our size... find out how big it should 
  57.             // be 
  58.             resultSize = View.sUseZeroUnspecifiedMeasureSpec ? 0 : size
  59.             resultMode = MeasureSpec.UNSPECIFIED; 
  60.         } else if (childDimension == LayoutParams.WRAP_CONTENT) { 
  61.             // Child wants to determine its own size.... find out how 
  62.             // big it should be 
  63.             resultSize = View.sUseZeroUnspecifiedMeasureSpec ? 0 : size
  64.             resultMode = MeasureSpec.UNSPECIFIED; 
  65.         } 
  66.         break; 
  67.     } 
  68.     //noinspection ResourceType 
  69.     return MeasureSpec.makeMeasureSpec(resultSize, resultMode); 
  70.  

Java

上述代碼根據父類的MeasureSpec和自身的LayoutParams創建子元素的MeasureSpec,具體過程同學們自行分析,最終的創建規則如下表:

 

ViewGroup在遍歷完子View后,需要根據子元素的測量結果來決定自己最終的測量大小,并調用setMeasuredDimension方法保存測量寬高值。

  1. setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),heightSizeAndState); 

Java

這里調用了resolveSizeAndState來確定最終的大小,主要是保證測量的大小不能超過父容器的***剩余空間maxWidth,這里我們看看它里面的實現:

  1. public static int resolveSizeAndState(int sizeint measureSpec, int childMeasuredState) { 
  2.         final int specMode = MeasureSpec.getMode(measureSpec); 
  3.         final int specSize = MeasureSpec.getSize(measureSpec); 
  4.         final int result; 
  5.         switch (specMode) { 
  6.             case MeasureSpec.AT_MOST: 
  7.                 if (specSize < size) { 
  8.                     result = specSize | MEASURED_STATE_TOO_SMALL; 
  9.                 } else { 
  10.                     result = size
  11.                 } 
  12.                 break; 
  13.             case MeasureSpec.EXACTLY: 
  14.                 result = specSize; 
  15.                 break; 
  16.             case MeasureSpec.UNSPECIFIED: 
  17.             default
  18.                 result = size
  19.         } 
  20.         return result | (childMeasuredState & MEASURED_STATE_MASK); 
  21.     }  

Java

關于具體ViewGroup的onMeasure過程這里不做分析,由于每種布局的測量方式不一樣,不可能逐個分析,但在它們的onMeasure里面的步驟是有一定規律的:

1.根據各自的測量規則遍歷Children元素,調用getChildMeasureSpec方法得到Child的measureSpec;

2.調用Child的measure方法;

3.調用setMeasuredDimension確定最終的大小。

View的measure

View的measure過程由其measure方法來完成,measure方法是一個final類型的方法,這意味著子類不能重寫此方法,在View的measure方法里面會去調用onMeasure方法,我們這里只要看onMeasure的實現即可,如下:

  1. View.java 
  2.  
  3.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
  4.         setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec), 
  5.                 getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec)); 
  6.     }  

Java

代碼很簡單,我們繼續看看getDefaultSize方法的實現:

  1. View.java 
  2.  
  3.     public static int getDefaultSize(int sizeint measureSpec) { 
  4.         int result = size
  5.         int specMode = MeasureSpec.getMode(measureSpec); 
  6.         int specSize = MeasureSpec.getSize(measureSpec); 
  7.  
  8.         switch (specMode) { 
  9.         case MeasureSpec.UNSPECIFIED: 
  10.             result = size
  11.             break; 
  12.         case MeasureSpec.AT_MOST: 
  13.         case MeasureSpec.EXACTLY: 
  14.             result = specSize; 
  15.             break; 
  16.         } 
  17.         return result; 
  18.     } 

 

Java

從上述代碼可以得出,View的寬/高由specSize決定,直接繼承View的自定義控件需要重寫onMeasure方法并設置wrap_content時的自身大小,否則在布局中使用wrap_content就相當于使用match_parent。

上述就是View的measure大致過程,在measure完成之后,通過getMeasuredWidth/Height方法就可以獲得測量后的寬高,這個寬高一般情況下就等于View的最終寬高了,因為View的layout布局的時候就是根據measureWidth/Height來設置寬高的,除非在layout中修改了measure值。

Layout布局

Layout的作用是ViewGroup用來確定子元素的位置,當ViewGroup的位置被確定后,它在onLayout中會遍歷所有的子元素并調用其layout方法。簡單的來說就是,layout方法確定View本身的位置,而onLayout方法則會確定所有子元素的位置。

先看看View的layout方法:

  1. public void layout(int l, int t, int r, int b) { 
  2.         if ((mPrivateFlags3 & PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT) != 0) { 
  3.             onMeasure(mOldWidthMeasureSpec, mOldHeightMeasureSpec); 
  4.             mPrivateFlags3 &= ~PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT; 
  5.         } 
  6.  
  7.         int oldL = mLeft; 
  8.         int oldT = mTop; 
  9.         int oldB = mBottom; 
  10.         int oldR = mRight; 
  11.  
  12.         boolean changed = isLayoutModeOptical(mParent) ? 
  13.                 setOpticalFrame(l, t, r, b) : setFrame(l, t, r, b); 
  14.  
  15.         if (changed || (mPrivateFlags & PFLAG_LAYOUT_REQUIRED) == PFLAG_LAYOUT_REQUIRED) { 
  16.             onLayout(changed, l, t, r, b); 
  17.  
  18.             if (shouldDrawRoundScrollbar()) { 
  19.                 if(mRoundScrollbarRenderer == null) { 
  20.                     mRoundScrollbarRenderer = new RoundScrollbarRenderer(this); 
  21.                 } 
  22.             } else { 
  23.                 mRoundScrollbarRenderer = null
  24.             } 
  25.  
  26.             mPrivateFlags &= ~PFLAG_LAYOUT_REQUIRED; 
  27.  
  28.             ListenerInfo li = mListenerInfo; 
  29.             if (li != null && li.mOnLayoutChangeListeners != null) { 
  30.                 ArrayList<OnLayoutChangeListener> listenersCopy = 
  31.                         (ArrayList<OnLayoutChangeListener>)li.mOnLayoutChangeListeners.clone(); 
  32.                 int numListeners = listenersCopy.size(); 
  33.                 for (int i = 0; i < numListeners; ++i) { 
  34.                     listenersCopy.get(i).onLayoutChange(this, l, t, r, b, oldL, oldT, oldR, oldB); 
  35.                 } 
  36.             } 
  37.         } 
  38.  
  39.         mPrivateFlags &= ~PFLAG_FORCE_LAYOUT; 
  40.         mPrivateFlags3 |= PFLAG3_IS_LAID_OUT; 
  41.     }  

因微信字數限制,請點擊原文鏈接查看完整內容

總結

到這里,View的measure、layout、draw三大流程就說完了,這里做一下總結:

  • 如果是自定義ViewGroup的話,需要重寫onMeasure方法,在onMeasure方法里面遍歷測量子元素,同理onLayout方法也是一樣,***實現onDraw方法繪制自己;
  • 如果自定義View的話,則需要從寫onMeasure方法,處理wrap_content的情況,不需要處理onLayout,***實現onDraw方法繪制自己; 

 

責任編輯:龐桂玉 來源: Android開發中文站
相關推薦

2020-07-16 08:33:38

ViewGroupView

2024-09-05 08:28:25

2021-09-30 07:36:51

AndroidViewDraw

2009-07-20 16:52:18

運維管理流程北塔

2013-11-06 14:16:23

流程

2019-04-01 14:40:24

智慧城市百度阿里

2021-04-26 07:53:04

繪制流程任務

2013-10-15 09:56:54

大數據

2021-09-17 06:55:50

AndroidLayoutView

2021-09-16 06:44:04

Android進階流程

2022-07-14 23:32:25

元宇宙虛擬分身Web3.0

2019-11-11 09:00:00

測試方案自動化測試軟件開發

2022-08-16 12:03:40

網絡安全硬件的安全

2013-05-20 17:07:26

2020-12-19 10:51:16

勒索軟件即服務RaaS網絡攻擊w

2020-12-18 09:00:00

數據庫MongoDBPostgreSQL

2021-09-22 09:00:00

Python框架開發

2021-08-12 09:00:00

開發測試工具

2020-12-20 18:10:32

物聯網傳感器物聯網傳感器

2021-12-07 12:15:07

PythonAPI框架
點贊
收藏

51CTO技術棧公眾號

国产成人在线免费视频| 99免费观看视频| 9色在线视频| 狠狠色综合色综合网络| 久久久久久久色| 中文字幕丰满乱子伦无码专区| 亚洲一区二区三区四区| 亚洲视频在线观看三级| 久久久神马电影| 97人妻精品一区二区三区| 亚洲黑丝一区二区| 中文字幕一区二区三区电影| 超碰caoprom| 美女视频一区| 欧美日韩精品在线观看| 亚洲黄色网址在线观看| 国产在线色视频| 成人小视频在线| 国产精品一区二区性色av | 电影一区二区在线观看| 在线免费不卡电影| 黄色一级视频在线播放| 免费在线看a| 久久久久久亚洲综合| 亚洲最大成人网色| 中文字幕在线观看第二页| 日韩一级不卡| 欧美男插女视频| 国产调教在线观看| 偷拍亚洲精品| 精品精品国产高清a毛片牛牛| 九九热精品在线播放| 日韩免费电影| 精品女厕一区二区三区| 青青草视频在线视频| 日韩大片在线永久免费观看网站| 91啦中文在线观看| 精品毛片久久久久久| 亚洲国产成人一区二区| 国产精品一区三区| 91精品久久久久久久久久久久久久| 国产又黄又猛又粗又爽| 91久久亚洲| 久久久久久久久久久91| 久久亚洲av午夜福利精品一区| 99热国内精品| 色黄久久久久久| 我不卡一区二区| 美女毛片一区二区三区四区| 日韩精品一二三四区| 一级欧美一级日韩片| 成人动态视频| 亚洲国产91色在线| 亚洲熟女一区二区| 欧美午夜寂寞| 亚洲美女喷白浆| 先锋影音av在线| 精品精品久久| 日韩在线小视频| 91视频青青草| 欧美视频二区| 午夜精品久久久久久99热| 日本免费在线播放| 一本色道久久综合| 欧美又大又粗又长| 中文字幕一区二区人妻视频| 日韩在线播放一区二区| 国产精品自产拍在线观| 国产美女自慰在线观看| 国产高清无密码一区二区三区| 懂色中文一区二区三区在线视频| 丰满肥臀噗嗤啊x99av| av在线播放成人| 日本免费高清一区| 欧美午夜电影一区二区三区| 亚洲免费在线播放| 日韩伦理在线免费观看| 成人性生活视频| 欧美日韩dvd在线观看| 性生交大片免费看l| 国产精品99久久免费观看| 日韩精品中文字| 国产不卡在线观看视频| 欧美成人tv| 78色国产精品| 在线观看视频二区| 国产精品一区二区在线播放| 好吊色欧美一区二区三区四区 | 久久久久成人黄色影片| 午夜一区二区三区| 欧美人与性动交α欧美精品图片| 精品国产电影一区| 亚洲色图久久久| 日韩高清二区| 亚洲视频axxx| 黑人巨大精品一区二区在线| 国产精品亚洲欧美| 91精品国产综合久久香蕉最新版 | 中文字幕第四页| 久久精品国产在热久久| 国产日韩一区二区| 性开放的欧美大片| 午夜亚洲国产au精品一区二区| 中文字幕欧美人妻精品一区| 精品亚洲a∨一区二区三区18| 亚洲国产黄色片| 久久久久久久久久97| 99国产精品自拍| 91久久中文字幕| 日本在线视频1区| 一区二区久久久久| 欧美大尺度做爰床戏| 久久国产精品免费精品3p| 中文字幕在线观看日韩| 亚洲黄色一区二区| 国产美女精品在线| 视频一区二区三| av资源一区| 91精品国产麻豆国产自产在线 | 手机在线精品视频| 亚洲色图视频免费播放| 国产一区视频免费观看| 九九热hot精品视频在线播放| 精品国产一区二区三区在线观看| 日韩免费不卡视频| 高清国产午夜精品久久久久久| 亚洲成色www久久网站| 亚洲美女久久精品| 亚洲精品福利视频| 久久免费少妇高潮99精品| 久久超碰97中文字幕| 秋霞在线观看一区二区三区| 九色porny自拍视频在线观看| 日韩欧美一区二区免费| 日本 欧美 国产| 蜜桃精品视频在线| 日本中文不卡| 国产精品久久久久av电视剧| 日韩高清有码在线| 国产精品一区二区6| 国产jizzjizz一区二区| 天天在线免费视频| 精品视频在线播放一区二区三区| 久久手机精品视频| 国产理论视频在线观看| 中文字幕一区二区三区在线不卡| 手机看片一级片| 日本一二区不卡| 国产精品永久在线| 欧美r级在线| 欧美日韩情趣电影| 操她视频在线观看| 狠狠色丁香九九婷婷综合五月| 亚洲精品中文字幕乱码三区不卡| 国产精品99久久久久久董美香| 中文字幕亚洲无线码a| 亚洲最大成人av| 亚洲欧美日韩国产手机在线| 亚洲五月激情网| 狠久久av成人天堂| 久久偷窥视频| 欧美福利在线播放| 最新亚洲国产精品| 国产99久一区二区三区a片| 一区二区三区日韩| 欧美深性狂猛ⅹxxx深喉| 国产一区成人| 深田咏美在线x99av| www.久久久.com| 国内精品中文字幕| 精品电影在线| 欧美一区日韩一区| xxxx 国产| 国产三级一区二区| 在线播放黄色av| 亚洲人体偷拍| 日韩视频精品| 亚洲高清999| 91po在线观看91精品国产性色| 国模精品一区二区| 91精品国产福利| 99热在线观看免费精品| 国产日韩欧美精品综合| 深夜做爰性大片蜜桃| 亚洲福利专区| 亚洲高清123| h视频久久久| 国产精品免费电影| 久久99亚洲网美利坚合众国| 亚洲情综合五月天| 国产欧美久久久| 一本久久精品一区二区| 午夜激情福利网| 久久只精品国产| 亚洲综合伊人久久| 香蕉av777xxx色综合一区| 中文字幕一区二区中文字幕| 日韩成人动漫在线观看| 国产热re99久久6国产精品| av3级在线| 中文字幕日韩av电影| 五月婷婷丁香花| 91精品国产综合久久久蜜臀图片| 天堂网av手机版| 亚洲美女免费视频| 国产馆在线观看| 99re这里只有精品首页| 黄色a级三级三级三级| 老司机午夜免费精品视频| 国产尤物av一区二区三区| 不卡中文字幕| 久久伦理网站| 97se亚洲国产一区二区三区| 国产精品一区久久| 视频在线日韩| 45www国产精品网站| 色yeye免费人成网站在线观看| 在线观看中文字幕亚洲| 天堂91在线| 精品国产一区二区三区av性色| 中文字幕在线观看1| 一本一本大道香蕉久在线精品 | 美女又爽又黄视频毛茸茸| 国产精品自拍毛片| 色婷婷.com| 免费在线观看不卡| 欧美黄网站在线观看| 精品999网站| 日本a级片在线播放| 99久久婷婷| 亚洲欧美日韩在线综合 | 日本男女交配视频| 亚洲深深色噜噜狠狠爱网站| 亚洲精品不卡| 欧美久久综合网| 日本在线观看一区二区| 最新国产一区| 乱一区二区三区在线播放| 欧美爱爱网站| 精品卡一卡二| 日韩精品免费一区二区三区竹菊 | 6080国产精品| 激情综合一区二区三区| 中文字幕亚洲影院| 国产老妇另类xxxxx| 精品国产鲁一鲁一区二区三区| 精品一区二区三区香蕉蜜桃 | 不卡视频在线观看| 折磨小男生性器羞耻的故事| 国产999精品久久久久久| aaaaa黄色片| 成人激情免费网站| 中国极品少妇videossexhd| av网站免费线看精品| 香蕉视频黄色在线观看| 久久亚洲免费视频| 欧美激情 一区| 国产精品久久久久久久久久久免费看| 人人艹在线视频| 亚洲麻豆国产自偷在线| 久草免费在线观看视频| 欧美日韩精品在线视频| 精品国产乱子伦| 欧美日韩大陆在线| 精品国产av 无码一区二区三区| 日韩亚洲欧美成人一区| 免费观看黄色一级视频| 亚洲欧美综合另类中字| eeuss影院www在线观看| 另类图片亚洲另类| gogo高清在线播放免费| 国产精品成人v| 自拍偷拍亚洲| 精品国产_亚洲人成在线| 伊人久久大香线蕉综合网站 | 三级电影在线看| 国产日韩综合av| 在线看的片片片免费| 亚洲国产一区二区三区| 五月天婷婷导航| 欧美精品乱人伦久久久久久| 精品久久无码中文字幕| 亚洲国产99精品国自产| 成人福利在线| 色综合久久88色综合天天看泰| 欧美私密网站| 成人精品久久av网站| 欧美爱爱网站| 一本一道久久a久久综合精品| 黄色av成人| 不卡av免费在线| 成人性生交大片| 手机毛片在线观看| 亚洲午夜久久久久中文字幕久| 五月婷婷激情视频| 日韩精品在线一区| av电影在线观看网址| 久久免费成人精品视频| 免费视频成人| 久久久久久国产精品mv| 亚洲激情久久| 日本va中文字幕| 成人午夜私人影院| 国产精品suv一区二区88| 精品国产精品三级精品av网址| 一本一道精品欧美中文字幕| 精品国产伦一区二区三区观看体验| 成人在线观看黄色| 国内偷自视频区视频综合| 自拍偷拍亚洲图片| 日韩中文字幕一区二区| 日韩视频不卡| 国产男女无遮挡猛进猛出| 亚洲国产成人一区二区三区| 亚洲免费在线观看av| 欧美一个色资源| 香蕉视频在线免费看| 青青青国产精品一区二区| 2020最新国产精品| 麻豆md0077饥渴少妇| 免费在线观看一区二区三区| 人妻少妇精品视频一区二区三区| 亚洲综合久久久久| 国产又黄又粗又硬| 中文字幕久热精品视频在线| 女生影院久久| 激情欧美一区二区三区中文字幕| 欧美+日本+国产+在线a∨观看| 三级av免费观看| 日本一区二区三级电影在线观看| 激情五月色婷婷| 亚洲国产成人精品女人久久久 | 成人久久久久| 任你操这里只有精品| 99久久99精品久久久久久| 欧美精品入口蜜桃| 欧美一区二区三区影视| 伦xxxx在线| 成人欧美一区二区三区黑人孕妇 | 久久久久久久久久久99| 国产91精品精华液一区二区三区| 日韩一级片大全| 欧美精品日韩精品| av在线免费网址| 92看片淫黄大片看国产片| 国产精品国内免费一区二区三区| 亚洲免费黄色网| 国产精品毛片高清在线完整版| 中文字幕一区2区3区| 中国china体内裑精亚洲片| 香蕉久久免费电影| 丝袜足脚交91精品| 免费成人av资源网| 国内毛片毛片毛片毛片毛片| 欧美乱妇15p| 永久免费网站在线| a级国产乱理论片在线观看99| 亚洲成人资源| 五月婷婷综合在线观看| 色综合天天性综合| 最新国产在线观看| 成人伊人精品色xxxx视频| 国产精品av久久久久久麻豆网| 国产ts在线观看| 婷婷丁香激情综合| 国产乱视频在线观看| 91久久在线视频| 亚洲精品1234| 欧美黄色激情视频| 欧美绝品在线观看成人午夜影视| 成人黄色网址| 久久av一区二区三区漫画| 老妇喷水一区二区三区| 五月婷婷综合激情网| 欧美成人一区二区三区片免费 | 欧美日韩国产综合网| 日韩成人av一区二区| 欧美在线啊v一区| 国产区在线观看| 国外成人在线视频网站| 天堂成人免费av电影一区| 亚洲二区在线播放| 亚洲精品黄网在线观看| 成人国产精品一区二区免费麻豆| 日本在线视频www色| 91女人视频在线观看| 一本久道久久综合无码中文| 欧美黄色性视频| 成人写真视频| 久草免费资源站| 91成人免费在线| 伊人在我在线看导航| 欧美深深色噜噜狠狠yyy| 国产精品自在在线| 国产九色在线播放九色| 久久亚洲精品视频| 精品在线手机视频| 久久久久久无码精品人妻一区二区| 欧美性videos高清精品| av片在线观看永久免费|