精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

男生草女生视频| 亚洲欧美色图片| 永久免费精品视频网站| 亚洲天天综合网| 欧美日韩福利| 亚洲美女性生活视频| 91 在线视频观看| 98色花堂精品视频在线观看| 99re66热这里只有精品3直播| 亚洲桃花岛网站| 国产成人强伦免费视频网站| 99re6在线精品视频免费播放| 久久99久久久久| 久久久久久国产精品三级玉女聊斋 | 久久在线免费观看视频| 久久久久久久无码| 国产69精品久久久久按摩| 一区二区在线免费观看| 欧美视频1区| 亚洲第一页综合| 日韩黄色免费电影| 曰本一区二区三区视频| 久久影音资源网| 91在线观看免费观看| 欧美a在线播放| 在线日韩成人| 欧美日韩视频专区在线播放| 无罩大乳的熟妇正在播放| 91大神在线网站| 北条麻妃一区二区三区| 精品久久久中文| 一区二区三区四区免费视频| 丝袜视频国产在线播放| 91成人观看| 亚洲欧美日韩国产精品| 亚洲少妇一区二区三区| 日本片在线观看| 中文字幕一区免费在线观看| 免费不卡亚洲欧美| 亚洲欧美激情国产综合久久久| 亚洲激情网站| 欧美日本高清一区| 暗呦丨小u女国产精品| 欧美亚洲国产激情| 亚洲欧美中文字幕| 鲁大师私人影院在线观看| 99热这里只有精品首页| 欧美一区二区高清| 图片区乱熟图片区亚洲| 久久亚洲精品中文字幕| 麻豆tv在线| 免费观看日韩电影| 国产精品高潮粉嫩av| 国产成人av一区二区三区不卡| 成人久久网站| 欧美这里有精品| 成人av在线播放观看| 国产婷婷视频在线| 亚洲欧美韩国综合色| 噜噜噜噜噜久久久久久91| 视频一区 中文字幕| 不卡av免费在线观看| 狠狠色狠狠色综合人人| 无码精品在线观看| 91麻豆福利精品推荐| 国产精品美女一区二区三区| 日韩中文字幕欧美| www.黄色com| 国产大片一区| 欧美超级免费视 在线| 欧美黑吊大战白妞| 国内精品久久久久久久影视麻豆| 三级精品视频久久久久| 18啪啪污污免费网站| 亚洲第一偷拍| 高清欧美电影在线| www亚洲视频| 日韩成人一级片| 78m国产成人精品视频| 国产专区第一页| 日韩激情一区二区| 91色p视频在线| 亚洲av综合一区| 美女视频网站久久| 欧美三级一区| 欧美撒尿777hd撒尿| 国产奶头好大揉着好爽视频| 国产区在线观看| 亚洲自拍欧美精品| 无码人妻丰满熟妇区毛片| 国产成人福利夜色影视| 日韩欧美一级特黄在线播放| 中国极品少妇videossexhd | www.com国产| 久久福利精品| 国产在线日韩在线| 好男人在线视频www| 91一区一区三区| 亚洲一区二区在线看| 成人三级黄色免费网站| 26uuu精品一区二区在线观看| av日韩免费电影| 青青久草在线| 玉米视频成人免费看| 日韩最新中文字幕| 男人久久天堂| 欧美日韩另类字幕中文| 91亚洲免费视频| 粉嫩av一区二区| 欧美一区二区精美| 欧美黄色一级生活片| 国产一区二区三区站长工具| 亚洲欧美成人在线| 老熟妻内射精品一区| 国产精品试看| 91传媒视频免费| 国产高清一区在线观看| 亚洲国产wwwccc36天堂| 免费看日本毛片| 在线观看欧美| 日韩欧美国产1| 波多野结衣家庭教师在线观看| 91精品亚洲| 国产精品96久久久久久| 91tv国产成人福利| 国产午夜亚洲精品不卡| 久久人人爽人人爽人人av| 日韩福利在线观看| 亚洲一区二区精品| 91美女免费看| 另类欧美日韩国产在线| 农村寡妇一区二区三区| av老司机在线观看| 日韩欧美亚洲国产另类| 69夜色精品国产69乱| 免费成人美女在线观看| 欧美视频观看一区| 不卡一二三区| 91 com成人网| 99热在线观看精品| 蜜臀av国产精品久久久久 | 日本熟妇色xxxxx日本免费看| 美女精品在线| 成人免费xxxxx在线观看| 福利在线观看| 欧美天天综合网| 亚洲精品国产91| 视频一区二区三区入口| 激情亚洲一区二区三区四区| 亚洲aⅴ男人的天堂在线观看| 国产精品老熟女视频一区二区| 风流少妇一区二区| 99久热在线精品视频| 欧美三级一区| 久久久久久久久亚洲| 成人av一区二区三区在线观看| 久久精品在线免费观看| 欧美 国产 小说 另类| 你懂的一区二区三区| 欧美日韩福利视频| 黄色aaa大片| 午夜精品福利一区二区三区蜜桃| caoporm在线视频| 天天做天天爱天天爽综合网| 91免费电影网站| caopo在线| 欧美精品一区二区三区四区| 日本不卡一二区| 国产乱码精品一区二区三 | 一区二区三区视频播放| 欧美精品电影在线| 日夜干在线视频| 欧美性xxxxx极品少妇| 久久精品一区二区三区四区五区| 久久综合网络一区二区| 色姑娘综合网| 成人短视频软件网站大全app| 亚洲系列中文字幕| 97超碰人人模人人人爽人人爱| 国产亚洲一本大道中文在线| www.精品在线| 欧美日本不卡高清| 久久精品人人做人人爽电影| 成人自拍视频网| 欧美精品免费看| 亚洲AV第二区国产精品| 欧美亚洲国产一区在线观看网站| 中文字幕一区二区三区人妻电影| 在线看片一区| 日韩欧美亚洲日产国| 日本久久免费| 精品久久久久久久大神国产| 国产精品三级在线观看无码| 精品亚洲成a人在线观看| 国产va亚洲va在线va| 欧美高清一级片| 欧洲美女7788成人免费视频| 精品国产99久久久久久| 亚洲精品动漫久久久久| 一区二区久久精品66国产精品| 亚洲国产精品黑人久久久| 中文字幕久久久久久久| 久久久久久夜| 福利在线一区二区| 日日夜夜亚洲| 国外色69视频在线观看| 国产理论电影在线观看| 精品久久国产字幕高潮| 国产在线欧美在线| 国产精品天干天干在观线| 野战少妇38p| 经典三级在线一区| 国产日产欧美一区二区| 神马影视一区二区| 国产一区二区三区四区五区加勒比| 国产深夜视频在线观看| 中文字幕日韩在线播放| 完全免费av在线播放| 黄色免费在线网站| 亚洲少妇激情视频| 视频污在线观看| 日韩欧美一区二区在线视频| 国产在线拍揄自揄拍无码视频| 99久久婷婷国产综合精品| 在线观看国产福利| 日韩精品久久久久久| 免费看黄在线看| 成人在线免费观看视频| 精品在线一区| 欧美交a欧美精品喷水| 亚洲a在线播放| 色999韩欧美国产综合俺来也| 欧美激情图片区| 激情小视频在线观看| 日韩成人高清在线| 国产91久久久| 日韩美女视频一区二区在线观看| 亚洲成人av影片| 精品欧美aⅴ在线网站 | 久久久av毛片精品| 中文字幕影片免费在线观看| 成人免费看黄yyy456| 伊人av在线播放| 国产成人a级片| 91精品国产高清91久久久久久| 天堂一区二区在线免费观看| 国产精品一区二区免费在线观看| 久久国产电影| 亚洲精品乱码视频| 欧美三区四区| 日本久久久a级免费| 中文一区一区三区高中清不卡免费| 日韩在线免费av| 午夜毛片在线| 久久久精品美女| 在线观看电影av| 久久久久国产精品www| av在线中出| 欧美综合国产精品久久丁香| 伊人久久综合一区二区| 国产福利视频一区二区| 国产精品天堂蜜av在线播放 | 日韩电影在线观看一区| 男人添女人荫蒂免费视频| 亚洲性感美女99在线| 午夜精品久久久久久久无码 | 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 久久99久久| 中日韩美女免费视频网站在线观看 | 久久成人av少妇免费| 激情在线观看视频| 成人性视频网站| 日韩精品卡通动漫网站| 中文字幕免费在线观看视频一区| 中国极品少妇videossexhd | 国产精品久久久久久久av大片| av小说在线播放| 国产97在线亚洲| 91国产一区| 精品亚洲第一| 日韩大片在线| 青草网在线观看| 久久在线精品| 日韩 欧美 高清| 久久99久久99精品免视看婷婷| 国产精品久久a| 国产成人精品亚洲日本在线桃色| 黄色三级视频在线播放| 91小视频免费观看| 三级黄色在线观看| 午夜av一区二区三区| 国产精品无码粉嫩小泬| 日韩亚洲欧美成人一区| 青青草免费在线| 久久国产精品久久国产精品| 澳门成人av网| av在线亚洲男人的天堂| 欧洲激情综合| 青青草精品视频在线| 蜜桃av一区二区三区电影| 国产精品一区二区在线免费观看| 国产成人精品免费看| 瑟瑟视频在线观看| 成人免费a视频| 午夜精品一区二区三区免费视频| 青青操视频在线播放| 色综合久久久久久久久久久| 久久夜色精品国产噜噜亚洲av| 日韩欧美a级成人黄色| 国产高清不卡视频| 亚洲三级黄色在线观看| 日本在线观看高清完整版| 国产精品av免费在线观看| www.丝袜精品| 在线国产精品网| 丝袜美腿亚洲色图| 逼特逼视频在线观看| 亚洲色图视频网| 一级一级黄色片| 精品中文字幕久久久久久| 午夜羞羞小视频在线观看| 国产精品丝袜久久久久久不卡| 四虎精品永久免费| 欧美区高清在线| 亚洲每日更新| 久久久久亚洲av成人网人人软件| 91影院在线免费观看| 国产精选第一页| 日韩欧美自拍偷拍| 免费人成在线观看播放视频| 欧美肥老妇视频| 国产精久久久| 中文一区一区三区免费| 久久精品国产99| 天堂av网手机版| 欧美艳星brazzers| 久青草国产在线| 国产91热爆ts人妖在线| 日韩大胆成人| 久久免费视频3| 91免费在线看| xxxx.国产| 亚洲开心激情网| 老司机2019福利精品视频导航| 成人激情综合网| 欧美成人激情| 欧美性受xxxxxx黑人xyx性爽| 91麻豆产精品久久久久久| a v视频在线观看| 日韩久久精品电影| 亚洲淫成人影院| 日韩中文字幕av在线| 日本欧美一区二区在线观看| 99久久99久久精品免费| 欧美日韩亚洲国产综合| 精产国品自在线www| 亚洲影影院av| 精品电影一区| 人妻丰满熟妇av无码久久洗澡| 亚洲视频在线一区观看| 国产乱码精品一区二区| 亚洲无线码在线一区观看| 欧美成人精品三级网站| 亚洲蜜桃av| 国产一区在线精品| 少妇视频在线播放| 欧美日韩成人一区二区| 污网站在线免费看| 精品一区二区三区视频日产| 久久精品日韩欧美| 神马影院我不卡午夜| av小说在线播放| 久久免费99精品久久久久久| 久久亚洲欧洲| 天天做夜夜爱爱爱| 欧美艳星brazzers| 爆操欧美美女| 91久久久久久久久久久久久| 欧美三级特黄| 精品人伦一区二区三电影| 欧美三区在线观看| 性欧美videoshd高清| 91亚洲午夜在线| 99热免费精品| 免费看一级黄色| 精品久久久久久久久久久久包黑料| jizzjizz亚洲| 久久久久久久久久久久久久久久av| 激情综合中文娱乐网| 女人又爽又黄免费女仆| 91精品国产综合久久精品| 国产二区三区在线| 成人国产亚洲精品a区天堂华泰 | 亚洲欧美日韩国产yyy| 日本欧美加勒比视频| 欧美日韩成人免费观看| 亚洲人精品午夜在线观看| 欧美经典影片视频网站| 黄色片久久久久| 一区二区国产视频|