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

Android源碼進階之深入理解View的繪制流程(Draw)機制

開發 前端
三大工作流程始于ViewRootImpl#performTraversals,在這個方法內部會分別調用performMeasure,performLayout,performDraw三個方法來分別完成測量,布局,繪制流程。那么我們現在先從performDraw方法看起。

[[426758]]

前言

前幾篇文章,講述了measure,layout流程等,接下來將詳細分析繪制流程。

測量流程決定了View的大小,布局流程決定了View的位置,那么繪制流程將決定View的樣子,一個View該顯示什么由繪制流程完成;

那我們就開始開車了;

一、performDraw

三大工作流程始于ViewRootImpl#performTraversals,在這個方法內部會分別調用performMeasure,performLayout,performDraw三個方法來分別完成測量,布局,繪制流程。那么我們現在先從performDraw方法看起;

performDraw

  1. private void performDraw() { 
  2.     //... 
  3.     final boolean fullRedrawNeeded = mFullRedrawNeeded; 
  4.     try { 
  5.         draw(fullRedrawNeeded); 
  6.     } finally { 
  7.         mIsDrawing = false
  8.         Trace.traceEnd(Trace.TRACE_TAG_VIEW); 
  9.     } 

里面又調用了ViewRootImpl#draw方法,我們來看看ViewRootImpl#draw:

  1. private void draw(boolean fullRedrawNeeded) { 
  2.     ... 
  3.     //獲取mDirty,該值表示需要重繪的區域 
  4.     final Rect dirty = mDirty; 
  5.     if (mSurfaceHolder != null) { 
  6.         // The app owns the surface, we won't draw. 
  7.         dirty.setEmpty(); 
  8.         if (animating) { 
  9.             if (mScroller != null) { 
  10.                 mScroller.abortAnimation(); 
  11.             } 
  12.             disposeResizeBuffer(); 
  13.         } 
  14.         return
  15.     } 
  16.     //如果fullRedrawNeeded為真,則把dirty區域置為整個屏幕,表示整個視圖都需要繪制 
  17.     //第一次繪制流程,需要繪制所有視圖 
  18.     if (fullRedrawNeeded) { 
  19.         mAttachInfo.mIgnoreDirtyState = true
  20.         dirty.set(0, 0, (int) (mWidth * appScale + 0.5f), (int) (mHeight * appScale + 0.5f)); 
  21.     } 
  22.     //... 
  23.     if (!drawSoftware(surface, mAttachInfo, xOffset, yOffset, scalingRequired, dirty)) { 
  24.                 return
  25.         } 

根據fullRedrawNeeded來判斷是否需要重置dirty區域,最后調用了ViewRootImpl#drawSoftware方法,并把相關參數傳遞進去,包括dirty區域,我們接著看該方法的源碼;

  1. private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int xoff, int yoff, 
  2.             boolean scalingRequired, Rect dirty) { 
  3.     // Draw with software renderer. 
  4.     final Canvas canvas; 
  5.     try { 
  6.         final int left = dirty.left
  7.         final int top = dirty.top
  8.         final int right = dirty.right
  9.         final int bottom = dirty.bottom; 
  10.         //鎖定canvas區域,由dirty區域決定 
  11.         canvas = mSurface.lockCanvas(dirty); 
  12.         // The dirty rectangle can be modified by Surface.lockCanvas() 
  13.         //noinspection ConstantConditions 
  14.         if (left != dirty.left || top != dirty.top || right != dirty.right 
  15.                 || bottom != dirty.bottom) { 
  16.             attachInfo.mIgnoreDirtyState = true
  17.         } 
  18.         canvas.setDensity(mDensity); 
  19.     }  
  20.     try { 
  21.         if (!canvas.isOpaque() || yoff != 0 || xoff != 0) { 
  22.             canvas.drawColor(0, PorterDuff.Mode.CLEAR); 
  23.         } 
  24.         dirty.setEmpty(); 
  25.         mIsAnimating = false
  26.         attachInfo.mDrawingTime = SystemClock.uptimeMillis(); 
  27.         mView.mPrivateFlags |= View.PFLAG_DRAWN; 
  28.         try { 
  29.             canvas.translate(-xoff, -yoff); 
  30.             if (mTranslator != null) { 
  31.                 mTranslator.translateCanvas(canvas); 
  32.             } 
  33.             canvas.setScreenDensity(scalingRequired ? mNoncompatDensity : 0); 
  34.             attachInfo.mSetIgnoreDirtyState = false
  35.             //正式開始繪制 
  36.             mView.draw(canvas); 
  37.         } 
  38.     }  
  39.     return true

實例化了Canvas對象,然后鎖定該canvas的區域,由dirty區域決定,接著對canvas進行一系列的屬性賦值,最后調用了mView.draw(canvas)方法,

mView就是DecorView,也就是說從DecorView開始繪制;

二、draw源碼詳解

由于ViewGroup沒有重寫draw方法,因此所有的View都是調用View#draw方法,因此,我們直接看它的源碼

  1. public void draw(Canvas canvas) { 
  2.     ....  
  3.     // 1. 繪制本身View背景 
  4.     if (!dirtyOpaque) { 
  5.         drawBackground(canvas); 
  6.     } 
  7.     if (!verticalEdges && !horizontalEdges) { 
  8.         // Step 3, draw the content 
  9.         // 2. 繪制內容,默認空實現 需復寫 
  10.         if (!dirtyOpaque) onDraw(canvas); 
  11.         // 3. 繪制 children  
  12.         dispatchDraw(canvas); 
  13.         drawAutofilledHighlight(canvas); 
  14.         // 4. 分發Draw (單一View空實現,ViewGroup見下面分析) 
  15.         if (mOverlay != null && !mOverlay.isEmpty()) { 
  16.             mOverlay.getOverlayView().dispatchDraw(canvas); 
  17.         } 
  18.         // 5. 繪制裝飾 (前景色,滾動條) 
  19.         onDrawForeground(canvas); 
  20.         return
  21.     } 
  22.     .... 

可以看到,draw過程比較復雜,但是邏輯十分清晰。首先來看一開始的標記位dirtyOpaque,

該標記位的作用是判斷當前View是否是透明的,如果View是透明的,那么根據下面的邏輯可以看出,將不會執行一些步驟,比如繪制背景、繪制內容等;

繪制流程的五個步驟:

  • 對View的背景進行繪制;
  • 繪制View的內容;
  • 對View的子View進行繪制(如果有子View);
  • 分發Draw;

繪制View的裝飾(例如:前景色,滾動條);

1、繪制背景

  1. //繪制背景 
  2. private void drawBackground(Canvas canvas) { 
  3.     final Drawable background = mBackground; 
  4.     if (background == null) { 
  5.         return
  6.     } 
  7.     // 根據在 layout 過程中獲取的 View 的位置參數,來設置背景的邊界 
  8.     setBackgroundBounds(); 
  9.     // 先嘗試用HWUI繪制 
  10.     if (canvas.isHardwareAccelerated() && mAttachInfo != null 
  11.             && mAttachInfo.mThreadedRenderer != null) { 
  12.         mBackgroundRenderNode = getDrawableRenderNode(background, mBackgroundRenderNode); 
  13.         final RenderNode renderNode = mBackgroundRenderNode; 
  14.         if (renderNode != null && renderNode.isValid()) { 
  15.             setBackgroundRenderNodeProperties(renderNode); 
  16.             ((DisplayListCanvas) canvas).drawRenderNode(renderNode); 
  17.             return
  18.         } 
  19.     } 
  20.     final int scrollX = mScrollX; 
  21.     final int scrollY = mScrollY; 
  22.     if ((scrollX | scrollY) == 0) { 
  23.         //調用 Drawable 的 draw 方法來進行背景的繪制 
  24.         background.draw(canvas); 
  25.     } else { 
  26.         // 若 mScrollX 和 mScrollY 有值,則對 canvas 的坐標進行偏移平移畫布 
  27.         canvas.translate(scrollX, scrollY); 
  28.         //調用 Drawable 的 draw 方法來進行背景的繪制 
  29.         background.draw(canvas); 
  30.         canvas.translate(-scrollX, -scrollY); 
  31.     } 

2、繪制View的內容

  1. // 繪制View本身內容,空實現,子類必須復寫 
  2. protected void onDraw(Canvas canvas) { 

這里調用了View#onDraw方法,View中該方法是一個空實現,因為不同的View有著不同的內容,這需要我們自己去實現,即在自定義View中重寫該方法來實現;

3、子View進行繪制

當前的View是一個ViewGroup類型,那么就需要繪制它的子View,這里調用了dispatchDraw,而View中該方法是空實現,實際是ViewGroup重寫了這個方法,那么我們來看看;

  1. @Override 
  2. protected void dispatchDraw(Canvas canvas) { 
  3.     ... 
  4.     //  遍歷子View 
  5.     final int childrenCount = mChildrenCount; 
  6.     ... 
  7.     for (int i = 0; i < childrenCount; i++) { 
  8.         while (transientIndex >= 0 && mTransientIndices.get(transientIndex) == i) { 
  9.             final View transientChild = mTransientViews.get(transientIndex); 
  10.             if ((transientChild.mViewFlags & VISIBILITY_MASK) == VISIBLE || 
  11.                     transientChild.getAnimation() != null) { 
  12.                 more |= drawChild(canvas, transientChild, drawingTime); 
  13.             } 
  14.             transientIndex++; 
  15.             if (transientIndex >= transientCount) { 
  16.                 transientIndex = -1; 
  17.             } 
  18.         } 
  19.         final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder); 
  20.         final View child = getAndVerifyPreorderedView(preorderedList, children, childIndex); 
  21.         if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) { 
  22.             // 調用 drawChild 方法,進行子元素繪制 
  23.             more |= drawChild(canvas, child, drawingTime); 
  24.         } 
  25.     } 
  26.     .... 

4、分發Draw

  1. @Override 
  2. protected void dispatchDraw(Canvas canvas) { 
  3.     ... 
  4.     // 1. 遍歷子View 
  5.     final int childrenCount = mChildrenCount; 
  6.     ... 
  7.     for (int i = 0; i < childrenCount; i++) { 
  8.         while (transientIndex >= 0 && mTransientIndices.get(transientIndex) == i) { 
  9.             final View transientChild = mTransientViews.get(transientIndex); 
  10.             if ((transientChild.mViewFlags & VISIBILITY_MASK) == VISIBLE || 
  11.                     transientChild.getAnimation() != null) { 
  12.                 more |= drawChild(canvas, transientChild, drawingTime); 
  13.             } 
  14.             transientIndex++; 
  15.             if (transientIndex >= transientCount) { 
  16.                 transientIndex = -1; 
  17.             } 
  18.         } 
  19.         final int childIndex = getAndVerifyPreorderedIndex(childrenCount, i, customOrder); 
  20.         final View child = getAndVerifyPreorderedView(preorderedList, children, childIndex); 
  21.         if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) { 
  22.             // 調用 drawChild 方法,進行子元素繪制 
  23.             more |= drawChild(canvas, child, drawingTime); 
  24.         } 
  25.     } 
  26.     .... 

5、繪制View

所謂的繪制裝飾,就是指View除了背景、內容、子View的其余部分,例如滾動條等,我們看View#onDrawForeground

  1. public void onDrawForeground(Canvas canvas) { 
  2.     //繪制指示器 
  3.     onDrawScrollIndicators(canvas); 
  4.     //繪制滾動條 
  5.     onDrawScrollBars(canvas); 
  6.     final Drawable foreground = mForegroundInfo != null ? mForegroundInfo.mDrawable : null
  7.     if (foreground != null) { 
  8.         if (mForegroundInfo.mBoundsChanged) { 
  9.             mForegroundInfo.mBoundsChanged = false
  10.             final Rect selfBounds = mForegroundInfo.mSelfBounds; 
  11.             final Rect overlayBounds = mForegroundInfo.mOverlayBounds; 
  12.             if (mForegroundInfo.mInsidePadding) { 
  13.                 selfBounds.set(0, 0, getWidth(), getHeight()); 
  14.             } else { 
  15.                 selfBounds.set(getPaddingLeft(), getPaddingTop(), 
  16.                         getWidth() - getPaddingRight(), getHeight() - getPaddingBottom()); 
  17.             } 
  18.             final int ld = getLayoutDirection(); 
  19.             Gravity.apply(mForegroundInfo.mGravity, foreground.getIntrinsicWidth(), 
  20.                     foreground.getIntrinsicHeight(), selfBounds, overlayBounds, ld); 
  21.             foreground.setBounds(overlayBounds); 
  22.         } 
  23.         //調用 Drawable 的 draw 方法,繪制前景色 
  24.         foreground.draw(canvas); 
  25.     } 

到目前為止,View的繪制流程也講述完畢了;

總結

其實繪制這塊還是很重要的,下次還是要繼續講解下;

學如逆水行舟,不進則退;心似平原走馬,易放難收;

一起加油老鐵們

本文轉載自微信公眾號「Android開發編程」

【編輯推薦】

 

責任編輯:姜華 來源: Android開發編程
相關推薦

2021-09-16 06:44:04

Android進階流程

2021-10-15 09:19:17

AndroidSharedPrefe分析源碼

2021-09-17 06:55:50

AndroidLayoutView

2021-09-08 06:51:52

AndroidRetrofit原理

2021-08-24 07:53:28

AndroidActivity生命周期

2021-09-15 07:31:33

Android窗口管理

2021-09-24 08:10:40

Java 語言 Java 基礎

2021-09-10 07:31:54

AndroidAppStartup原理

2021-09-18 06:56:01

JavaCAS機制

2017-05-03 17:00:16

Android渲染機制

2024-12-30 08:02:40

2022-10-11 07:43:34

AndroidSyncGradle 構建

2021-08-17 13:41:11

AndroidView事件

2017-01-13 22:42:15

iosswift

2014-07-15 17:17:31

AdapterAndroid

2017-08-08 09:15:41

前端JavaScript頁面渲染

2021-02-17 11:25:33

前端JavaScriptthis

2017-07-12 14:58:21

AndroidInstant Run

2016-10-26 20:49:24

ReactJavascript前端

2024-06-06 09:58:13

點贊
收藏

51CTO技術棧公眾號

久久国产精品国语对白| 国产欧美激情视频| 精品三级久久久久久久电影聊斋| 国产v综合v| 欧美国产成人精品| 99在线视频免费观看| 91浏览器在线观看| 日韩综合在线| 亚洲精品久久久一区二区三区 | 中文字幕 国产| 久久久人成影片免费观看| 亚洲国产另类久久精品| 亚洲精品综合在线观看| 日韩激情电影| 亚洲精品国产品国语在线app| 国产精品视频地址| 欧美成人免费看| 精品成人影院| 亚洲丁香久久久| 亚洲美女爱爱视频| 中文字幕乱码在线播放| 伊人夜夜躁av伊人久久| 亚洲欧美日韩精品在线| 天堂视频中文在线| 国产99久久久久| 国产剧情久久久久久| 久久综合色综合| 天天影视综合| 在线播放国产精品| 少妇精品一区二区| 日韩精品一区二区三区中文字幕 | 亚洲色图美腿丝袜| 特级特黄刘亦菲aaa级| 亚洲国产91视频| 色婷婷精品久久二区二区蜜臀av | 欧美日本韩国一区二区| 国产毛片精品视频| 国产精品美女网站| 亚洲黄色三级视频| 伊人久久亚洲热| 久久国产精品影片| 91久久久久久久久久久久久久| 亚洲精品一区国产| 欧美精品三级在线观看| 欧美伦理视频在线观看| 成人影院入口| 色婷婷激情综合| 欧洲av无码放荡人妇网站| 色爱综合区网| 亚洲在线视频一区| 99er在线视频| 欧洲在线视频| 亚洲国产中文字幕在线视频综合| 欧美国产视频在线观看| 天天干天天草天天射| 成人av电影在线网| av一区和二区| 日本高清视频免费看| 成人午夜在线视频| 九九久久99| 日韩欧美在线观看一区二区| 26uuu国产一区二区三区| 久久riav二区三区| 国产在线观看黄| 中文字幕va一区二区三区| 亚洲精品久久区二区三区蜜桃臀| 亚洲成人第一区| 成人少妇影院yyyy| 精品亚洲第一| 国产玉足榨精视频在线观看| 国产精品成人网| 桥本有菜av在线| 18videosex性欧美麻豆| 亚洲一区影音先锋| 少妇无码av无码专区在线观看 | 亚洲亚洲一区二区三区| 精品国产乱码久久久久久久| 在线精品一区二区三区| 国产欧美日韩| 久久天堂av综合合色| 久久婷婷国产麻豆91| 最新成人av网站| 2020久久国产精品| 最近日韩免费视频| 国产精品亚洲人在线观看| 精品国产aⅴ麻豆| 成人资源www网在线最新版| 亚洲欧洲精品一区二区精品久久久| 免费看成人片| 欧洲不卡av| 亚洲成人av一区二区三区| 四虎永久在线精品无码视频| 欧美黄色a视频| 亚洲成av人片在线观看香蕉| 亚洲AV无码片久久精品| 一本到12不卡视频在线dvd| 91高清视频在线免费观看| 国产偷人爽久久久久久老妇app | 神马电影在线观看| 国产精品私人自拍| 青草青青在线视频| 高清亚洲高清| 日韩av在线网| 国产黄色小视频网站| 免费日韩视频| 超碰97人人人人人蜜桃| 在线激情网站| 天天色综合天天| 男生操女生视频在线观看| 亚洲精品一级二级三级| 久久99国产精品自在自在app | 欧美视频综合| 亚洲精品乱码久久久久| 亚洲三级视频网站| 超碰成人在线免费| 久久影视电视剧免费网站清宫辞电视| 永久免费未视频| 性色一区二区三区| 成人欧美一区二区三区黑人免费| 国产后入清纯学生妹| 国产欧美在线观看一区| 无码人妻精品一区二区三区在线| 天堂av在线| 欧美成人女星排名| 特黄一区二区三区| 久久综合婷婷| 久久亚裔精品欧美| 成人免费网站观看| 精品久久久久99| 精品国产视频在线观看| 免费在线观看精品| 日韩电影天堂视频一区二区| 国产在线观看www| 精品国产免费视频| 私库av在线播放| 精品一二三四区| 亚洲欧美国产不卡| 久久久精品一区二区毛片免费看| 欧美一区二区三区日韩视频| 国产破处视频在线观看| 久久精品官网| 欧美二区在线| 伊人久久综合一区二区| 亚洲精品自拍偷拍| av大片在线免费观看| 91麻豆高清视频| 国产精品视频一区二区三区四区五区| 国产日韩另类视频一区| 精品调教chinesegay| 国产精品.www| av资源网一区| 青青草原av在线播放| 西野翔中文久久精品国产| 欧美亚洲成人免费| 欧美男男激情freegay| 欧洲人成人精品| 一级二级黄色片| 久久福利视频一区二区| 欧美性视频在线播放| 精品一区二区三区亚洲| 欧美日韩成人精品| 后进极品白嫩翘臀在线视频| 亚洲成av人片观看| 国产成人av一区二区三区不卡| 一区二区电影在线观看| 91九色露脸| 97在线超碰| 亚洲免费电影一区| 做爰视频毛片视频| 中文字幕亚洲区| 日本泡妞xxxx免费视频软件| 国产手机视频一区二区 | 91丨九色丨丰满| 国产精品福利av| 激情成人在线观看| 亚洲看片免费| 亚洲高清不卡一区| 欧美特黄不卡| 欧美性视频精品| 黄在线免费观看| 亚洲国产精品va在线看黑人 | 亚洲国产果冻传媒av在线观看| 91麻豆精品国产91久久久平台| 91国内免费在线视频| 天堂а√在线8种子蜜桃视频| 亚洲综合成人在线| 亚洲自拍偷拍一区二区| 久久99精品久久久久久| 丁香婷婷综合激情| 欧美精品一二| caoporen国产精品| 另类专区亚洲| 欧美另类在线观看| 欧美精品a∨在线观看不卡| 7777女厕盗摄久久久| 免费在线观看国产精品| 久久久久99精品国产片| 无人码人妻一区二区三区免费| 婷婷综合久久| 久久综合九色99| 日韩三级不卡| 国产精品亚洲片夜色在线| heyzo高清中文字幕在线| 日韩在线www| 亚洲AV成人无码一二三区在线| 一区二区免费在线| 日韩一级在线| 欧美videos中文字幕| 亚洲GV成人无码久久精品| 中文字幕在线播放不卡一区| 91视频福利网| 奇米影视一区二区三区小说| 男人添女人下部高潮视频在观看| 久久视频社区| 国产精品国语对白| 久久99亚洲网美利坚合众国| 日韩专区中文字幕| 日本1级在线| 精品黑人一区二区三区久久| 在线免费观看av片| 91久久精品一区二区| 国产真实乱偷精品视频| 亚洲精品国产第一综合99久久 | 欧美中文字幕在线观看视频 | 国产在线精品一区| 国产韩日精品| 庆余年2免费日韩剧观看大牛| 高清av电影在线观看| 亚洲黄色有码视频| 国模人体一区二区| 欧美一级电影网站| 国产精品玖玖玖| 欧美美女一区二区| 中文字幕在线观看高清| 欧美性猛交xxxxxx富婆| 精品成人av一区二区在线播放| 日本一区二区三区国色天香| 大黑人交xxx极品hd| av资源网一区| 无码国产69精品久久久久网站| 日日夜夜精品视频免费| av免费播放网址| 中日韩视频在线观看| 无罩大乳的熟妇正在播放| 欧美成人一品| 久久亚洲国产成人精品无码区| 自拍自偷一区二区三区| 蜜桃麻豆www久久国产精品| 看全色黄大色大片免费久久久| 国产精品成av人在线视午夜片| 秋霞成人影院| www.xxxx欧美| 中文字幕免费高清电视剧网站在线观看| 欧美变态tickle挠乳网站| 精品人妻无码一区二区色欲产成人 | 色婷婷国产精品免| 欧美国产亚洲另类动漫| 青青草自拍偷拍| 亚洲人成网站精品片在线观看| 最近日本中文字幕| 久久久无码精品亚洲日韩按摩| 污污的视频免费观看| 国产又黄又大久久| 中文字幕18页| 91丨porny丨蝌蚪视频| 丝袜美腿中文字幕| 中文字幕精品在线不卡| 国产精品成人69xxx免费视频 | 九九九九久久久久| 亚洲伊人春色| 亚洲狠狠婷婷综合久久久| 香蕉综合视频| www插插插无码视频网站| 久久精品官网| 热久久久久久久久| 成人ar影院免费观看视频| 欧美熟妇精品黑人巨大一二三区| 国产凹凸在线观看一区二区| 韩国黄色一级片| 91看片淫黄大片一级在线观看| av影片在线播放| 99re在线精品| 妖精视频在线观看免费| 一二三区精品福利视频| 日本中文在线播放| 欧美揉bbbbb揉bbbbb| 亚洲国产一二三区| 一本色道久久综合狠狠躁篇的优点| 欧美 日韩 国产 成人 在线| 亚洲精品动漫100p| av播放在线| 午夜精品一区二区三区视频免费看| 青春草视频在线观看| 国产精品91在线| 成人爽a毛片| 亚洲人成人77777线观看| 精品动漫av| 九色porny自拍| 91小视频免费观看| 四虎永久免费在线| 日本精品视频一区二区三区| 99在线观看免费| 亚洲欧美另类人妖| 污污的网站在线免费观看| 国产精国产精品| 牛牛影视久久网| 中文字幕中文字幕一区三区| 亚洲综合日本| av天堂一区二区| 亚洲免费毛片网站| 国产精品第6页| 日韩电视剧免费观看网站| 国产传媒在线播放| 国产精品美女主播| 亚洲女娇小黑人粗硬| 欧美乱做爰xxxⅹ久久久| 蜜臀久久99精品久久久画质超高清| 日本特黄a级片| 91在线国内视频| 免费在线一级片| 欧美日韩免费观看一区二区三区| 97视频免费在线| 亚洲精品自产拍| 国产夫妻在线播放| 不卡视频一区二区三区| 永久91嫩草亚洲精品人人| 九热视频在线观看| 久久免费精品国产久精品久久久久| 五月婷六月丁香| 欧美性猛交xxxx黑人| 韩国av在线免费观看| 欧美成人精品一区| 国产亚洲高清在线观看| 亚洲 欧洲 日韩| 久久精品久久综合| 久久视频一区二区三区| 日本精品免费观看高清观看| 免费人成黄页在线观看忧物| 8050国产精品久久久久久| 伊人www22综合色| 女人色极品影院| 成人午夜免费电影| 国产亚洲第一页| 精品av综合导航| 草草视频在线| 久久99精品久久久久久水蜜桃 | youjizz.com在线观看| 黄色精品一二区| 午夜爽爽爽男女免费观看| 51精品国自产在线| 黄色av免费在线| 不卡一卡2卡3卡4卡精品在| 激情综合中文娱乐网| 精品熟女一区二区三区| 精品二区三区线观看| 天堂av电影在线观看| 国产成人精品网站| 久久高清精品| 久久久福利影院| 一区二区三区免费| 秋霞av鲁丝片一区二区| 青青在线视频一区二区三区| 精品无人区麻豆乱码久久久| av免费一区二区| 夜夜精品浪潮av一区二区三区| 亚洲永久精品一区| 最近2019年日本中文免费字幕| 欧美草逼视频| 国产在线视频欧美一区二区三区| 精品视频免费| 国产aⅴ爽av久久久久| 亚洲美女屁股眼交3| 人妻无码一区二区三区久久99| 一区二区在线视频| 国产精品麻豆| 蜜臀精品一区二区| 久久九九久精品国产免费直播| 中文字幕av免费在线观看| 欧美精品一区二区三区在线播放| 日韩在线资源| 成人午夜电影免费在线观看| 麻豆精品网站| 黄色片网站在线播放| 日韩欧美国产午夜精品| 亚洲精品一区| 精品国产三级a∨在线| av高清久久久| 在线观看免费黄色小视频| 欧美激情亚洲综合一区| 欧美色图在线播放| 国产精品成人免费一区久久羞羞| 亚洲激情图片qvod| 色视频免费在线观看| 亚洲影院色无极综合| 视频在线观看一区| 久久亚洲av午夜福利精品一区| 欧美高清激情brazzers| 国产在线美女| 免费日韩在线观看| 国产日韩亚洲欧美综合|