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

溫故而知新 MeasureSpec在View測量中的作用

開發(fā) 前端
對于具體的View/ViewGroup 測量,就涉及到另外的一個方法measureChildWithMargins,這個方法也是在很多布局中會看到,比如LinearLayout。

[[396440]]

前言

對于MeasureSpec,你的認識有多少呢?

  • MeasureSpec是干嘛的?存在的意義在哪?
  • MeasureSpec中的mode和size到底指的是什么?
  • MeasureSpec是怎么計算的,與哪些因素有關?
  • 父View測量好子View的MeasureSpec之后,子View會怎么處理?
  • View/ViewGroup、DecorView的MeasureSpec有什么區(qū)別?
  • UNSPECIFIED這個特殊模式又有什么用呢?

介紹

首先,我們看下這個類:

  1. public static class MeasureSpec { 
  2.        private static final int MODE_SHIFT = 30; 
  3.        private static final int MODE_MASK  = 0x3 << MODE_SHIFT; 
  4.  
  5.        //00后面跟30個0 
  6.        public static final int UNSPECIFIED = 0 << MODE_SHIFT; 
  7.        //01后面跟30個0 
  8.        public static final int EXACTLY     = 1 << MODE_SHIFT; 
  9.        //10后面跟30個0 
  10.        public static final int AT_MOST     = 2 << MODE_SHIFT; 
  11.  
  12.        public static int makeMeasureSpec(int sizeint mode) { 
  13.            if (sUseBrokenMakeMeasureSpec) { 
  14.                return size + mode; 
  15.            } else { 
  16.                return (size & ~MODE_MASK) | (mode & MODE_MASK); 
  17.            } 
  18.        } 
  19.  
  20.        //獲取mode 
  21.        public static int getMode(int measureSpec) { 
  22.            //保留高2位,剩下30個0 
  23.            return (measureSpec & MODE_MASK); 
  24.        } 
  25.  
  26.        //獲取size 
  27.        public static int getSize(int measureSpec) { 
  28.         //替換高兩位00,保留低30位 
  29.            return (measureSpec & ~MODE_MASK); 
  30.        } 
  31.  
  32.    } 

我留下了比較重要的三個方法:

  • makeMeasureSpec。用于生成一個MeasureSpec,生成的方式就是size+mode,得到一個32位的int值。
  • 獲取mode。也就是取前2位的值作為mode。
  • 獲取size。也就是取后30位的值作為size。

至此,我們至少知道了MeasureSpec是一個32位的int值,高2位為mode(測量模式),低30位為size(測量大小)。

這么做的目的主要是避免過多的對象內存分配。

所以我們可以大致猜測,這個MeasureSpec就是用來標記View的測量參數(shù),其中測量模式可能和View具體怎么顯示有關,而測量大小就是值的View實際大小。

當然,這只是我們的初步猜測。

要搞清楚具體信息,就要從View樹的繪制測量開始說起。

DecorView的測量

上文說到,測量代碼是從ViewRootImpl的measureHierarchy開始的,然后會執(zhí)行到performMeasure方法:

  1. private void measureHierarchy(){ 
  2.  childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width); 
  3.        childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); 
  4.        performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); 
  5.  
  6.  
  7.    private void performMeasure(int childWidthMeasureSpec, int childHeightMeasureSpec) { 
  8.        try { 
  9.            mView.measure(childWidthMeasureSpec, childHeightMeasureSpec); 
  10.        } finally { 
  11.            Trace.traceEnd(Trace.TRACE_TAG_VIEW); 
  12.        } 
  13.    } 

很明顯,在這里就會進行第一次MeasureSpec的計算,并且傳給了下層的mView,也就是DecorView。

那我們就來看看DecorView的MeasureSpec測量規(guī)格計算方式:

  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.    } 

所以DecorView是和它的LayoutParams有關,其實也就是跟Window的調整有關,如果Window是子窗口,那么就可以調整,比如Dialog的寬高設置為WRAP_CONTENT,那么DecorView對應的測量規(guī)格就是AT_MOST。

到此,我們也可以初步得到這個測量規(guī)格mode的含義:

  • 如果View的值是確定大小,比如MATCH_PARENT或者固定值,那么它的測量模式就是MeasureSpec.EXACTLY。
  • 如果View的值是自適應,比如WRAP_CONTENT,那么它的測量模式就是 MeasureSpec.AT_MOST。

具體是不是這樣呢?我們繼續(xù)到下層View一探究竟。

View/ViewGroup的測量

對于具體的View/ViewGroup 測量,就涉及到另外的一個方法measureChildWithMargins,這個方法也是在很多布局中會看到,比如LinearLayout。

  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.     } 

代碼不多,首先獲取子View的LayoutParams。然后根據(jù) padding、margin、width 以及 parentWidthMeasureSpec 算出寬的測量模式——childWidthMeasureSpec。

高度測量模式同理。

到此,我們的認識又前進了一步,對于子View的測量模式MeasureSpec肯定是和兩個元素有關:

  • 子View的LayoutParams(包括margin,width)
  • 父View的MeasureSpec (再加上padding)

繼續(xù)看看getChildMeasureSpec方法:

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

代碼其實很簡單,就是對子View的LayoutParams和父View的specMode、specSize,共同計算出子View的MeasureSpec。

舉其中一個例子,當父view的測量模式為MeasureSpec.EXACTLY,子View寬的LayoutParams為MATCH_PARENT。想象一下,這種情況,子View的寬肯定就會占滿父View的大小,所以子View的測量模式中的mode肯定就是確定值,為MeasureSpec.EXACTLY,而大小就是父View的大小了。對應的代碼就是:

  1. case MeasureSpec.AT_MOST: 
  2. if (childDimension == LayoutParams.MATCH_PARENT) { 
  3.     // Child wants to be our size. So be it. 
  4.     resultSize = size
  5.     resultMode = MeasureSpec.EXACTLY; 
  6. }  

綜合所有的情況,很經典的一張表格就來了:

這里我們也可以明確了MeasureSpec中mode的含義:

  • MeasureSpec.EXACTLY。父View可以確定子View的精確大小,比如子View大小是固定的值,在所有的情況下都會是EXACTLY模式。
  • MeasureSpec.AT_MOST。父View給定一個最大的值,意思是子View大小可以不確定,但是肯定不能超過某個最大的值,例如窗口的大小。
  • MeasureSpec.UNSPECIFIED。父View對子View完全沒限制,要多大給多大。這個模式似乎聽起來有點奇怪?待會我們再細談。

到此,似乎就結束了?當然沒啦,獲取子View的MeasureSpec之后,子View又會怎么處理呢?

View對于MeasureSpec的處理

繼續(xù)上文,測量子View的測量規(guī)格之后,會調用child.measure方法。

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

child.measure方法也就是View的measure方法,也就是走到了onMeasure方法,繼續(xù)看看:

  1. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
  2.      setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec), 
  3.              getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec)); 
  4.  } 
  5.  
  6.  protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) { 
  7.      if (optical != isLayoutModeOptical(mParent)) { 
  8.          measuredWidth  += optical ? opticalWidth  : -opticalWidth; 
  9.          measuredHeight += optical ? opticalHeight : -opticalHeight; 
  10.      } 
  11.      setMeasuredDimensionRaw(measuredWidth, measuredHeight); 
  12.  } 

哦~最后原來是給子View的measuredWidth和measuredHeight賦值了,所賦的值就是getDefaultSize方法返回的大小。

而這個measuredWidth是干嘛的呢?搜索一下:

  1. public final int getMeasuredWidth() { 
  2.  //MEASURED_SIZE_MASK用于限制大小的 
  3.         return mMeasuredWidth & MEASURED_SIZE_MASK; 
  4.     } 

這不就是我們獲取view的大小調用的方法嗎?所以小結一下:

  • 父view通過父View的MeasureSpec和子View的LayoutParams算出了子View的MeasureSpec。
  • 然后子View通過MeasureSpec計算了measuredWidth
  • 而這個measuredWidth也就是我們可以獲取View寬高所調用的方法。

最后就是看看getDefaultSize方法干了啥,也就是驗證MeasureSpec中size是不是就是我們要獲取的View的寬高呢?

  1. getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec) 
  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.    } 

可以看到,在AT_MOST和EXACTLY這兩種常用的情況下,確實是等于測量大小specSize的。

只是在一個特殊情況,也就是UNSPECIFIED的時候,這個大小會等于getSuggestedMinimumWidth()方法的大小。

問題來了,UNSPECIFIED模式到底是啥,getSuggestedMinimumWidth()方法又做了什么?

UNSPECIFIED

很多文章會忽略這個模式,其實它也是很重要的,在前兩天的討論群中,我們還討論了這個問題,一起看看吧~

首先,我們看看什么時候會存在UNSPECIFIED模式呢?它的概念是父View對子View的大小沒有限制,很容易想到的一個控件就是ScrollView,那么在ScrollView中肯定有對這個模式的設置:

  1. @Override 
  2.    protected void measureChildWithMargins(View child, 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 usedTotal = mPaddingTop + mPaddingBottom + lp.topMargin + lp.bottomMargin + 
  10.                heightUsed; 
  11.        final int childHeightMeasureSpec = MeasureSpec.makeSafeMeasureSpec( 
  12.                Math.max(0, MeasureSpec.getSize(parentHeightMeasureSpec) - usedTotal), 
  13.                MeasureSpec.UNSPECIFIED); 
  14.  
  15.        child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 
  16.    } 

沒錯,在ScrollView中重寫了measureChildWithMargins方法,比對下剛才ViewGroup的measureChildWithMargins方法,發(fā)現(xiàn)有什么不對了嗎?

childWidthMeasureSpec的計算沒有什么變化,還是調用了getChildMeasureSpec方法,但是childHeightMeasureSpec不對勁了,直接調用了makeSafeMeasureSpec方法生成了MeasureSpec,而且!而且!直接把SpecMode設置成了MeasureSpec.UNSPECIFIED。

也就是對于子View的高度是無限制的,這也符合ScrollView的理念。

所以當ScrollView嵌套一個普通View的時候,就會觸發(fā)剛才getDefaultSize中UNSPECIFIED的邏輯,也就是View的實際大小為getSuggestedMinimumWidth的大小。

繼續(xù)看看getSuggestedMinimumWidth到底獲取的是什么大?。?/p>

  1. protected int getSuggestedMinimumWidth() { 
  2.         return (mBackground == null) ? mMinWidth : max(mMinWidth, mBackground.getMinimumWidth()); 
  3.     } 

就一句代碼:

  • 如果view的背景為null,則等于最小寬度mMinWidth。
  • 如果view的背景不為null,則等于最小寬度和 背景的最小寬度 中取較大值。

所以如果View沒有設置背景,沒有設置mMinWidth,那么ScrollView嵌套View的情況,View的寬度就是為0,即使設置了固定值也沒用。

這只是UNSPECIFIED在普通View中的處理情況,不同的情況對UNSPECIFIED的處理方式都不一樣,比如TextView、RecycleView等等。

下次會專門出一篇UNSPECIFIED的文章,到時候見。

總結

今天回顧了MeasureSpec的相關知識點:

  • MeasureSpec的基本概念:
  • MeasureSpec為一個32位的int值。
  • SpecMode為高兩位,一共三種模式,代表父View對子View的大小限制模式,比如最大可用大小——AT_MOST。

SpecSize為低30位,代表父View給子View測量好的寬高。這個寬高大概率等于View的實際寬高,但是也有例外情況,也就是UNSPECIFIED的情況。

測量流程中的MeasureSpec:

  • View輸?shù)臏y量流程開始于ViewRootImpl的measureHierarchy,也是在這里開始了第一次MeasureSpec的計算。
  • 第一次MeasureSpec的計算也就是DecorView的MeasureSpec計算,是通過自身的LayoutParams相關,也就是和Window大小有關。
  • 然后就開始子View/ViewGroup的MeasureSpec計算,是通過父View的MeasureSpec和子View的LayoutParams相關。
  • 計算完子View的MeasureSpec之后,就開始調用onMeasure方法,計算出View的實際大小。
  • 如果是UNSPECIFIED模式,實際大小為。否則實際大小就等于計算好的specSize。

參考

《Android開發(fā)藝術探索》

本文轉載自微信公眾號「碼上積木」,作者積木zz。轉載本文請聯(lián)系碼上積木公眾號。

 

責任編輯:武曉燕 來源: 碼上積木
相關推薦

2012-03-26 10:12:25

C#

2022-06-30 08:01:33

ProxyReflecthandler

2019-06-18 10:31:23

數(shù)據(jù)庫端口URL

2019-06-19 08:14:14

數(shù)據(jù)庫驅動URL

2021-05-29 10:11:00

Kafa數(shù)據(jù)業(yè)務

2021-05-31 07:44:08

Kafka分布式系統(tǒng)

2016-12-14 15:13:30

GradleAndroid定制化打包

2019-04-23 16:19:01

網絡命令網絡故障ping

2023-08-01 14:36:00

JavaScript開發(fā)

2021-05-07 10:20:11

前端開發(fā)技術

2020-07-16 08:04:21

瀏覽器緩存策略

2016-12-30 13:52:55

網絡事件

2024-05-13 10:27:37

DevOps云技術IT

2020-12-01 00:03:16

新冠疫情分析數(shù)字化

2019-01-14 15:31:42

HTTP23

2010-05-05 10:35:50

CIO

2023-04-02 23:22:04

GPU流水線體系

2022-11-15 07:30:04

EverDB云端alive

2010-05-25 16:04:45

VoIPVoWLAN

2021-08-06 10:36:15

首席數(shù)據(jù)官CDO數(shù)字化轉型
點贊
收藏

51CTO技術棧公眾號

精品久久一区二区三区蜜桃| 日韩大片免费观看视频播放| 在线观看成人av电影| 波多野结衣啪啪| 精品国产午夜| 在线成人小视频| 日本大片免费看| 日本福利片高清在线观看| 母乳一区在线观看| 色先锋资源久久综合5566| www.桃色.com| 男人久久天堂| 国产精品系列在线| 91免费在线观看网站| 99热只有这里有精品| 成人激情电影在线| 精品国产123| www.99av.com| 丁香花电影在线观看完整版| 国产丝袜欧美中文另类| 99国产盗摄| 日韩电影在线观看一区二区| 欧美a级在线| 亚洲欧美激情精品一区二区| 手机av在线网站| 桃花岛成人影院| 亚洲午夜视频在线| 亚洲欧美日韩国产成人综合一二三区| 韩国av在线免费观看| 轻轻草成人在线| 97在线视频一区| 国产精品白丝喷水在线观看| 国产精选一区| 亚洲成人网久久久| www.成人黄色| 成人a在线观看高清电影| 午夜欧美大尺度福利影院在线看| 亚洲视频在线观看日本a| 无码国产伦一区二区三区视频| 久久99精品国产.久久久久久| 91超碰中文字幕久久精品| 人妻久久一区二区| 人人狠狠综合久久亚洲婷婷| 亚洲精品中文字幕av| 自拍偷拍激情视频| 自拍偷拍亚洲| 欧美日韩久久久久久| 精品99在线视频| 国内激情视频在线观看| 亚洲综合免费观看高清完整版| 影音先锋欧美资源| 国模吧精品人体gogo| 99久久99久久综合| 国产精品果冻传媒潘| 国产三级伦理片| 久久99精品久久久久久动态图 | av黄色免费网站| 99精品国产一区二区三区2021 | 日本在线观看免费视频| 亚洲天堂导航| 欧美性20hd另类| 无码专区aaaaaa免费视频| 超碰在线网站| 亚洲成人资源在线| av免费观看国产| 无遮挡爽大片在线观看视频 | 自拍偷拍亚洲区| 国产毛片欧美毛片久久久| 国产精品入口久久| 亚洲性猛交xxxxwww| 亚洲第一页av| 精品国产一区二区三区小蝌蚪 | 欧美日韩卡一卡二| 99热一区二区| 福利一区三区| 日韩欧美在线一区二区三区| 国产精品99久久久精品无码| 8848成人影院| 亚洲国产精彩中文乱码av| 熟妇人妻久久中文字幕| 蜜桃a∨噜噜一区二区三区| 亚洲欧美国内爽妇网| 日本精品久久久久中文| 999国产精品视频| 欧美夫妻性生活视频| 男女免费视频网站| 99国产精品私拍| 国产精品 欧美在线| 这里只有精品9| 国产不卡免费视频| 久久久福利视频| 97在线观看免费观看高清 | 国产精品自拍区| 在线观看亚洲视频| 久久人妻无码aⅴ毛片a片app| 欧美日韩1080p| 17婷婷久久www| 中文字幕人妻互换av久久| 国产一区二区精品久久99| 官网99热精品| 啊v在线视频| 一区二区三区四区av| 亚欧无线一线二线三线区别| 成人黄色在线| 欧美变态口味重另类| aaaaa一级片| 亚洲精品a级片| 97在线视频免费观看| 中文字幕一区二区三区四区免费看 | 成人av动漫在线观看| 久久精品国产免费观看| 日本亚洲欧美在线| 久久99日本精品| 国产亚洲自拍偷拍| 欧美三级黄网| 亚洲制服丝袜一区| 一区二区三区 欧美| 国产精品网址| 久久久精品国产| 男人天堂2024| 国产91在线观看| 亚洲视频小说| 成人欧美大片| 亚洲成人动漫在线播放| 国产在线观看免费视频软件| 国产一区二区三区久久久久久久久| 国产中文字幕日韩| 美女做暖暖视频免费在线观看全部网址91 | 综合自拍亚洲综合图不卡区| 欧美不卡在线播放| 偷拍自拍亚洲| 亚洲欧美综合v| 国产一级特黄aaa大片| 久久av老司机精品网站导航| 欧美国产一区二区在线| 牛牛在线精品视频| 91精品国产色综合久久不卡蜜臀| 亚洲黄色小说视频| 亚洲精品视频啊美女在线直播| 91亚洲精品一区| 成年网站在线| 日本韩国一区二区| 极品白嫩丰满美女无套| 亚洲夜间福利| ts人妖另类在线| 成人福利网站| 69久久夜色精品国产69蝌蚪网| 毛片aaaaaa| 日日夜夜一区二区| 欧美日韩中文国产一区发布| 一区二区精品伦理... | 日批视频免费看| 欧美91视频| 豆国产97在线| av2020不卡| 亚洲国产精品va在线看黑人| 日产亚洲一区二区三区| 成人性生交大片免费看中文网站| 欧美极品少妇无套实战| 欧美日韩黄色| 色综合色综合网色综合| 亚洲精品第五页| 亚洲一区二区三区四区在线 | 警花av一区二区三区| 久久精品一区中文字幕| 97在线播放免费观看| 亚洲天堂久久久久久久| 手机精品视频在线| 狠狠色狠狠色综合日日tαg| 国产专区一区二区| 天堂电影一区| 亚洲香蕉伊综合在人在线视看| 最近国语视频在线观看免费播放| 国产精品入口麻豆九色| 天天影视色综合| 91精品国产91久久久久久黑人| 亚洲一区二区三区成人在线视频精品| 中文字幕在线观看网站| 亚洲成人网在线| 无码aⅴ精品一区二区三区| 中文字幕欧美三区| 午夜啪啪小视频| 影音先锋中文字幕一区二区| 女同一区二区| 色狠狠一区二区三区| 九九热这里只有精品免费看| 色综合免费视频| 91成人在线免费观看| 美国黄色特级片| 国产成a人亚洲| 久久精品.com| 91精品国产福利在线观看麻豆| 粉嫩av免费一区二区三区| 伊人成综合网站| 久久久国产一区二区三区| 丰满少妇一级片| 日本国产一区二区| 亚洲av无码一区二区三区在线| 99久久久精品免费观看国产蜜| 日韩福利视频在线| 欧美日韩亚洲国产精品| 欧美一级二级三级| 国产精品亚洲综合在线观看 | 男女啊啊啊视频| 国产精品无遮挡| 911亚洲精选| 蜜臀精品一区二区三区在线观看 | 欧美人与z0zoxxxx视频| 久久精品国产亚洲av麻豆色欲| 国产欧美一区二区精品久导航 | 中文字幕手机在线视频| 亚洲欧美日韩中文字幕一区二区三区 | 国产人妻人伦精品1国产丝袜 | 亚洲欧洲日本精品| 亚洲高清成人| 特级毛片在线免费观看| 日韩mv欧美mv国产网站| 91久久夜色精品国产网站| 久久电影tv| 久久久久久有精品国产| 欧美天天影院| 国产香蕉一区二区三区在线视频| 刘亦菲毛片一区二区三区| 欧美日韩综合一区| 国产五月天婷婷| 亚洲人成网站影音先锋播放| 伊人网在线视频观看| 成人午夜视频网站| 亚洲一区二区福利视频| 日韩国产高清影视| 精品少妇一区二区三区在线| 欧美日韩p片| 久久av喷吹av高潮av| 精品一区电影| 欧美高清性xxxxhd | 免费中文日韩| 日韩高清三区| 国产亚洲欧美一区二区| aiai久久| 国产高清在线精品一区二区三区| 国产在线视频欧美一区| 国产精品色视频| 久久久一本精品| 欧美在线免费观看| 136福利第一导航国产在线| 欧美肥婆姓交大片| 青草视频在线免费直播| 欧美精品生活片| av在线播放观看| 久久在线观看视频| 免费av在线播放| 久久亚洲电影天堂| 黄网站在线免费| 另类色图亚洲色图| www久久日com| 色综合色综合久久综合频道88| 日韩专区av| 久久久久久国产三级电影| 在线免费观看污| 欧美激情第一页xxx| 欧美xxx黑人xxx水蜜桃| 久久久久久久999| av在线最新| 欧美在线视频一区二区| 国产v综合v| 国产精品亚洲精品| 一区二区三区无毛| 91久久精品www人人做人人爽| 日韩一级淫片| 国内一区二区三区在线视频| 亚洲人挤奶视频| 午夜老司机精品| 小处雏高清一区二区三区| 26uuu成人| 狠狠噜噜久久| 欧美一级黄色片视频| 日韩电影在线观看电影| 国产一区二区在线观看免费视频| 国产精品1024| 国产精品探花一区二区在线观看| 久久久精品综合| 日韩成人短视频| 亚洲一区二区三区四区的| 国产精品久久久免费视频| 日韩欧美国产黄色| 伊人网站在线观看| 日韩欧美一区二区视频| 天堂91在线| 综合国产在线视频| 性欧美ⅴideo另类hd| 欧美孕妇与黑人孕交| 久久99国产精品二区高清软件| 99国产在线视频| 免费欧美视频| 伊人久久在线观看| 久久精品盗摄| 国产xxxxhd| 久久青草欧美一区二区三区| 黑人操日本美女| 大荫蒂欧美视频另类xxxx| 中文永久免费观看| 精品国产乱码久久久久久图片| 狠狠狠综合7777久夜色撩人| 久久手机免费视频| 一级毛片久久久| 国产va免费精品高清在线| 精品91福利视频| 国产色综合一区二区三区| 欧美手机在线| 波多野结衣之无限发射| 久久成人久久爱| 素人fc2av清纯18岁| 亚洲人成伊人成综合网小说| 国产黄色免费视频| 91精品久久久久久久蜜月| 国产精品区一区| 久久免费大视频| 中文字幕日本最新乱码视频| 国产在线播放一区| 97在线观看免费视频| 调教+趴+乳夹+国产+精品| 国产乱人乱偷精品视频a人人澡| 亚洲欧美精品中文字幕在线| 第一av在线| 91在线观看免费高清完整版在线观看| 国产精品一区高清| 浮妇高潮喷白浆视频| 国产.欧美.日韩| 国产wwwwxxxx| 在线看一区二区| 神马电影在线观看| 国产最新精品视频| 午夜视频一区二区在线观看| 亚洲成人自拍| 老司机精品久久| 99久久国产精| 亚洲国产成人91porn| 超碰在线观看99| 欧美成人中文字幕在线| 伊人亚洲精品| 亚洲精品一区二区三区樱花 | 中文字幕欧美视频在线| 中文字幕影音在线| 国产精品制服诱惑| 欧美色综合网| 伦伦影院午夜理论片| 亚洲人精品午夜| 97视频免费在线| www日韩欧美| 亚洲成人高清| 一区二区三区视频在线播放| 日本人妖一区二区| 中文字幕人妻一区二区三区在线视频 | 91精品久久久久久蜜桃| 日韩在线观看一区| 久久婷婷国产91天堂综合精品| 91视频免费播放| 成人免费视频毛片| 日韩电影中文字幕在线观看| 黄色在线免费观看网站| 精品福利影视| 国产精品试看| 欧美大波大乳巨大乳| 日本道在线观看一区二区| 国产51人人成人人人人爽色哟哟| 国产精品三级在线| 婷婷精品进入| 欧美老女人bb| 精品成人av一区| 美丽的姑娘在线观看免费动漫| 国产精品嫩草视频| 97在线精品| 波多野结衣办公室双飞| 精品久久久久久久大神国产| 国产色a在线| 成人午夜激情免费视频| 欧美色一级片| 国产熟妇久久777777| 欧美日韩国产精品成人| av网站在线免费看推荐| 国产乱码一区| 日本在线不卡一区| 91原创国产| 久久午夜影院| 欧美精品第三页| 国产精品不卡视频| www.蜜臀av.com| 国产91精品久久久久| 黑丝美女一区二区| 久久成年人网站| 精品久久香蕉国产线看观看gif| 国产视频精选在线| 成人妇女淫片aaaa视频| 影院欧美亚洲| 欧美乱大交做爰xxxⅹ小说| 日韩欧美成人一区| 成人爱爱网址| 久久av高潮av| 亚洲国产电影在线观看| 男人天堂网在线视频|