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

粗談繪制任務和繪制流程

開發 項目管理
當有繪制任務的時候,會將這個任務交給Choreographer,然后再等下一個VSync信號來的時候,執行到ViewRootImpl的performTraversals方法。

[[395776]]

前言

今天是2028年4月26日,天氣晴,我請了一天假在家陪女兒。

正在陪女兒畫畫的我,被女兒問到:

??:“爸爸,媽媽說你的工作是可以把我們想到的東西變到手機上,是這樣嗎?”

??:“對呀,厲害吧~”

??:“那你可以把我們家的小狗狗變到手機上嗎?”

??:“當然可以了,不過手機是很笨的東西,必須我們把所有的規則寫好,他才能聽我們的話~”

??:“什么規則呀“

簡述繪制流程

你看,手機屏幕只有這么大,所以我們先要確定狗狗的大小,該畫多大的狗狗,可以畫多大的狗狗。

這就是測量的過程。

接著,我們要確定狗狗放在哪里,左上角還是中間還是右下角?

這就是布局的過程。

最后,我們就要畫出狗狗的樣子,是斑點狗還是大狼狗,是小白狗還是小黑狗。

這就是繪畫的過程。

所以,在手機上變出一只狗狗,或者變出任何一個東西都需要三個步驟:

  • 測量(measure)
  • 布局(layout)
  • 繪畫(draw)

繪制任務的來源

把視線拉回到成年人的世界。

第一次界面繪制

上篇文章說到,當有繪制任務的時候,會將這個任務交給Choreographer,然后再等下一個VSync信號來的時候,執行到ViewRootImpl的performTraversals方法。

那么這個任務到底從何而來呢?回顧下Activity的顯示過程:

  • 首先在setContentView方法中,創建了DecorView。
  • 然后在handleResumeActivity方法中,執行了addView方法將DecorView添加到WindowManager。
  • 最后設置DecorView對用戶可見。

所以在第二步addView方法中,肯定進行了與View繪制有關的操作:

  1. //WindowManagerGlobal.java 
  2.  public void addView() { 
  3.         synchronized (mLock) { 
  4.             root = new ViewRootImpl(view.getContext(), display); 
  5.             view.setLayoutParams(wparams); 
  6.             mViews.add(view); 
  7.             mRoots.add(root); 
  8.             mParams.add(wparams); 
  9.             try { 
  10.                 root.setView(view, wparams, panelParentView); 
  11.             }  
  12.         } 
  13.     } 
  14.  
  15.     //ViewRootImpl.java 
  16.     public void setView() { 
  17.         synchronized (this) { 
  18.          //繪制 
  19.          requestLayout(); 
  20.          //調用WMS的addWindow方法 
  21.          res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes, 
  22.                             getHostVisibility(), mDisplay.getDisplayId(), mWinFrame, 
  23.                             mAttachInfo.mContentInsets, mAttachInfo.mStableInsets, 
  24.                             mAttachInfo.mOutsets, mAttachInfo.mDisplayCutout, mInputChannel); 
  25.          //設置this(ViewRootImpl)為view(decorView)的parent 
  26.    view.assignParent(this); 
  27.         } 
  28.     } 
  29.  
  30.  
  31.     //ViewRootImpl.java 
  32.     @Override 
  33.     public void requestLayout() { 
  34.         if (!mHandlingLayoutInLayoutRequest) { 
  35.             checkThread(); 
  36.             mLayoutRequested = true
  37.             scheduleTraversals(); 
  38.         } 
  39.     } 
  40.  
  41.     ->scheduleTraversals() 
  42.     ->performMeasure() performLayout() performDraw() 
  43.     ->measure、layout、draw方法 

在addView方法中,創建了ViewRootImpl,執行了setView方法,在這里調用了requestLayout方法開始了View的繪制工作。

所以這里就是Activity顯示界面所做的第一次繪制來源。

那后續界面上的元素改變帶來的繪制呢?

View.requestLayout

首先看看在View中調用requestLayout方法會怎么繪制,比如TextView.setText,最后就會執行到requestLayout

  1. //View.java 
  2. public void requestLayout() { 
  3.         
  4.  //設置兩個標志位 
  5.        mPrivateFlags |= PFLAG_FORCE_LAYOUT; 
  6.        mPrivateFlags |= PFLAG_INVALIDATED; 
  7.  
  8.        //執行父view的requestLayout方法 
  9.        if (mParent != null && !mParent.isLayoutRequested()) { 
  10.            mParent.requestLayout(); 
  11.        } 
  12.    } 

精簡之后的代碼,主要干了兩件事:

1、設置兩個標志位,PFLAG_FORCE_LAYOUT 和 PFLAG_INVALIDATED。

2、執行父View的requestLayout方法。

這里的標志位暫且按下不表,待會就會遇到。從第二點可以看到View會一直向上執行requestLayout方法,而頂層的View就是DecorView,DecorView的parent就是ViewRootImpl。

所以最后還是執行到了ViewRootImpl的requestLayout方法,開始整個View樹的 測量、布局、繪畫。

  1. //ViewRootImpl.java 
  2.     @Override 
  3.     public void requestLayout() { 
  4.         if (!mHandlingLayoutInLayoutRequest) { 
  5.             checkThread(); 
  6.             mLayoutRequested = true
  7.             scheduleTraversals(); 
  8.         } 
  9.     } 

其中,mLayoutRequested字段設置為true,這是第二個標志位,待會也會遇到。

但是這有點奇怪哦?我一個View改變了,為什么整個界面的View樹都需要重新繪制呢?

這是因為每個子View直接或多或少都會產生聯系,比如一個RelativeLayout,一個View在TextView的右邊,一個View在TextView的下面。

那么當TextView長度寬度變化了,那么其他的View自然也需要跟著變化,所以就必須整個View樹進行重新繪制,保證布局的完整性。

View.invalidate/postInvalidate

還有一種觸發繪制的情況就是View.invalidate/postInvalidate,postInvalidate一般用于子線程,最后也會調用到invalidate方法,就不單獨說了。

invalidate方法一般用于View內部的重新繪畫,比如同樣是TextView.setText,也會觸發invalidate方法。

  1. public void invalidate(boolean invalidateCache) { 
  2.         invalidateInternal(0, 0, mRight - mLeft, mBottom - mTop, invalidateCache, true); 
  3.     } 
  4.  
  5.  void invalidateInternal(int l, int t, int r, int b, boolean invalidateCache, 
  6.             boolean fullInvalidate) { 
  7.  
  8.         if ((mPrivateFlags & (PFLAG_DRAWN | PFLAG_HAS_BOUNDS)) == (PFLAG_DRAWN | PFLAG_HAS_BOUNDS) 
  9.                 || (invalidateCache && (mPrivateFlags & PFLAG_DRAWING_CACHE_VALID) == PFLAG_DRAWING_CACHE_VALID) 
  10.                 || (mPrivateFlags & PFLAG_INVALIDATED) != PFLAG_INVALIDATED 
  11.                 || (fullInvalidate && isOpaque() != mLastIsOpaque)) { 
  12.  
  13.             mPrivateFlags |= PFLAG_DIRTY; 
  14.  
  15.             final ViewParent p = mParent; 
  16.             if (p != null && ai != null && l < r && t < b) { 
  17.                 damage.set(l, t, r, b); 
  18.                 p.invalidateChild(this, damage); 
  19.             } 
  20.  
  21.         } 
  22.     } 

可以看到,這里調用了invalidateInternal方法,并且傳入了可繪制的區域,最后調用了父view的invalidateChild方法。

  1. public final void invalidateChild(View child, final Rect dirty) { 
  2.         ViewParent parent = this; 
  3.         if (attachInfo != null) { 
  4.             do { 
  5.                 parent = parent.invalidateChildInParent(location, dirty); 
  6.             } while (parent != null); 
  7.         } 
  8.     } 

一個dowhile循環,不斷調用父View的invalidateChildInParent方法。

也就是會執行ViewGroup的invalidateChildInParent,最后再執行ViewRootImpl的invalidateChildInParent方法,我們就直接看ViewRootImpl:

  1. //ViewRootImpl.java 
  2.  public ViewParent invalidateChildInParent(int[] location, Rect dirty) { 
  3.          
  4.         invalidateRectOnScreen(dirty); 
  5.         return null
  6.     } 
  7.  
  8.     private void invalidateRectOnScreen(Rect dirty) { 
  9.         if (!mWillDrawSoon && (intersected || mIsAnimating)) { 
  10.             scheduleTraversals(); 
  11.         } 
  12.     } 

完事,果不其然,又到了scheduleTraversals繪制方法。

(這其中還有很多關于Dirty區域的繪制和轉換我省略了,Dirty區域就是需要重新繪圖的區域)

那invalidate和requestLayout有什么區別呢?繼續研究scheduleTraversals方法。

peformTraversals

接下來就看看peformTraversals方法是怎么觸發到三大繪制流程的。

  1. private void performTraversals() { 
  2.  boolean layoutRequested = mLayoutRequested && (!mStopped || mReportNextDraw); 
  3.  //測量 
  4.  if (layoutRequested) { 
  5.         windowSizeMayChange |= measureHierarchy(host, lp, res, 
  6.                     desiredWindowWidth, desiredWindowHeight); 
  7.     } 
  8.  
  9.     //布局 
  10.     final boolean didLayout = layoutRequested && (!mStopped || mReportNextDraw); 
  11.     if (didLayout) { 
  12.         performLayout(lp, mWidth, mHeight); 
  13.     } 
  14.  
  15.     //繪畫 
  16.     boolean cancelDraw = mAttachInfo.mTreeObserver.dispatchOnPreDraw() || !isViewVisible; 
  17.     if (!cancelDraw) { 
  18.         performDraw(); 
  19.     } 

我只保留了與三大繪制流程相關的直接代碼,可以看到:

1、測量過程的前提是layoutRequested為true,與mLayoutRequested有關。

2、布局過程的前提是didLayout,也與mLayoutRequested有關。

3、繪畫過程的前提是!cancelDraw。

而mLayoutRequested字段是在requestlayout方法中進行設置的,invalidate方法中并沒有設置。所以我們可以初步斷定,只有requestLayout方法才會執行到onMeasure和onLayout。

測量(measureHierarchy)

  1. private boolean measureHierarchy() { 
  2.  
  3.         childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width); 
  4.         childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); 
  5.         performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); 
  6.  
  7.         return windowSizeMayChange; 
  8.     } 
  9.  
  10.  private void performMeasure(int childWidthMeasureSpec, int childHeightMeasureSpec) { 
  11.         try { 
  12.             mView.measure(childWidthMeasureSpec, childHeightMeasureSpec); 
  13.         }  
  14.     } 
  15.  
  16.  public final void measure(int widthMeasureSpec, int heightMeasureSpec) { 
  17.         final boolean forceLayout = (mPrivateFlags & PFLAG_FORCE_LAYOUT) == PFLAG_FORCE_LAYOUT; 
  18.         final boolean needsLayout = specChanged 
  19.                 && (sAlwaysRemeasureExactly || !isSpecExactly || !matchesSpecSize); 
  20.  
  21.         if (forceLayout || needsLayout) { 
  22.             // first clears the measured dimension flag 
  23.             onMeasure(widthMeasureSpec, heightMeasureSpec); 
  24.  
  25.             mPrivateFlags |= PFLAG_LAYOUT_REQUIRED; 
  26.         } 
  27.  
  28.     } 

在measure方法中,我們判斷了兩個字段forceLayout和needsLayout,當其中有一個為true的時候,才會繼續執行onMeasure。其中forceLayout字段代表的是mPrivateFlags標志位是不是PFLAG_FORCE_LAYOUT。

PFLAG_FORCE_LAYOUT?是不是有點熟悉。剛才在View.requestLayout方法中,就對每個View都設置了這個標志,所以才能觸發到onMeasure進行測量。

所以requestLayout方法通過這個標志位 PFLAG_FORCE_LAYOUT,使每個子View都能進入到onMeasure流程。

布局(performLayout)

  1. private void performLayout(WindowManager.LayoutParams lp, int desiredWindowWidth, 
  2.            int desiredWindowHeight) { 
  3.        final View host = mView; 
  4.        host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight()); 
  5.    } 
  6.  
  7.    public void layout(int l, int t, int r, int b) { 
  8.   
  9.        if (changed || (mPrivateFlags & PFLAG_LAYOUT_REQUIRED) == PFLAG_LAYOUT_REQUIRED) { 
  10.            onLayout(changed, l, t, r, b); 
  11.        } 
  12.        
  13.    } 

可以看到在layout方法中,是通過PFLAG_LAYOUT_REQUIRED標記來決定是否執行onLayout方法,而這個標記是在onMeasure方法執行之后設置的。

說明了只要onMeasure方法執行了,那么onLayout方法肯定也會執行,這兩個方法是兄弟伙的關系,有你就有我。

繪畫(performDraw)

  1. private void performDraw() { 
  2.        boolean canUseAsync = draw(fullRedrawNeeded); 
  3.    } 
  4.  
  5.    private boolean draw(boolean fullRedrawNeeded){ 
  6.     if (!dirty.isEmpty() || mIsAnimating || accessibilityFocusDirty) { 
  7.      if (!drawSoftware(surface, mAttachInfo, xOffset, yOffset, 
  8.                        scalingRequired, dirty, surfaceInsets)) { 
  9.                    return false
  10.          } 
  11.      } 
  12.         return useAsyncReport; 
  13.  
  14.    } 
  15.  
  16.    private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int xoff, int yoff, 
  17.            boolean scalingRequired, Rect dirty, Rect surfaceInsets) { 
  18.  
  19.        mView.draw(canvas); 
  20.        return true
  21.    } 
  22.  
  23.    public void draw(Canvas canvas) { 
  24.        final int privateFlags = mPrivateFlags; 
  25.        mPrivateFlags = (privateFlags & ~PFLAG_DIRTY_MASK) | PFLAG_DRAWN; 
  26.  
  27.        /* 
  28.         * Draw traversal performs several drawing steps which must be executed 
  29.         * in the appropriate order
  30.         * 
  31.         *      1. Draw the background 
  32.         *      2. If necessary, save the canvas' layers to prepare for fading 
  33.         *      3. Draw view's content 
  34.         *      4. Draw children 
  35.         *      5. If necessary, draw the fading edges and restore layers 
  36.         *      6. Draw decorations (scrollbars for instance) 
  37.         */ 
  38.  
  39.        // Step 1, draw the background, if needed 
  40.        drawBackground(canvas); 
  41.  
  42.        // Step 2, save the canvas' layers 
  43.        canvas.saveUnclippedLayer.. 
  44.  
  45.        // Step 3, draw the content 
  46.        onDraw(canvas); 
  47.  
  48.        // Step 4, draw the children 
  49.        dispatchDraw(canvas); 
  50.  
  51.        // Step 5, draw the fade effect and restore layers 
  52.        canvas.drawRect.. 
  53.  
  54.        // Step 6, draw decorations (foreground, scrollbars) 
  55.        onDrawForeground(canvas); 
  56.  
  57.    } 

先看第二步draw(boolean fullRedrawNeeded)方法:

在該方法中,判斷了dirty是否為空,只有不為空的話才會繼續執行下去。dirty是什么?剛才也說過,就是需要重繪的區域。

而我們調用invalidate方法的目的就是向上傳遞dirty區域,最終生成屏幕上需要重繪的dirty,requestLayout方法中并沒有對dirty區域進行設定。

繼續看draw(Canvas canvas)方法,注釋還是比較清晰的,一共分為了六步:

  • 1、繪制背景
  • 2、保存圖層信息
  • 3、繪制內容(onDraw)
  • 4、繪制children
  • 5、繪制邊緣
  • 6、繪制裝飾

而我們常用的onDraw就是用于繪制內容。

總結

到此,View的繪制大體流程就結束了。

當然,其中還有大量細節,比如具體的繪制流程、需要注意的細節、自定義View實現等等,我們后面慢慢說道。

之前我們的問題,現在也可以解答了,就是繪制的兩個請求:requestLayout和invalidate區別是什么?

  • requestLayout方法。會依次執行performMeasure、performLayout、performDraw,但在performDraw方法中由于沒有dirty區域,一般情況下是不會執行onDraw。也有特殊情況,比如頂點發生變化。
  • invalidate方法。由于沒有設置標示,只會走onDraw流程進行dirty區域重繪。

所以如果某個元素的改變涉及到寬高布局的改變,就需要執行requestLayout()。如果某個元素之需要內部區域進行重新繪制,就執行invalidate().

如果都需要,就先執行requestLayout(),在執行invalidate(),比如TextView.setText()。

參考

https://www.jianshu.com/p/e79a55c141d6

https://juejin.cn/post/6904518722564653070

本文轉載自微信公眾號「碼上積木」,可以通過以下二維碼關注。轉載本文請聯系碼上積木公眾號。

 

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

2023-08-23 19:21:38

流程圖時序圖UML

2017-08-21 21:36:23

AndroidViewJava

2013-05-23 14:50:55

2020-03-02 18:56:03

PythonGNU Octave編程語言

2010-06-09 19:25:54

UML活動圖

2011-02-18 11:22:01

2010-06-11 10:55:51

UML部署圖

2022-10-18 23:53:20

Python數據Matplotlib

2020-07-28 21:38:24

跨職能流程圖

2019-08-05 13:20:35

Android繪制代碼

2013-04-15 14:23:21

2010-06-09 08:59:30

UML活動圖

2021-09-30 07:36:51

AndroidViewDraw

2011-08-17 14:32:44

iOS開發繪制

2020-07-16 08:33:38

ViewGroupView

2010-06-08 10:35:38

UML圖

2023-05-08 09:08:33

CSS前端

2010-06-08 10:51:48

UML活動圖

2010-06-09 18:56:44

UML用例圖

2022-07-15 16:04:22

R 語言
點贊
收藏

51CTO技術棧公眾號

久久午夜电影网| 天天综合亚洲| 日韩欧美在线一区| 欧洲精品在线一区| 欧美一级做a爰片免费视频| 欧美日韩一二三四| 日韩一区二区高清| 被灌满精子的波多野结衣| 五十路在线视频| 爽好多水快深点欧美视频| 色yeye香蕉凹凸一区二区av| 亚洲综合在线一区二区| 手机av在线| 国产精品女人毛片| 91文字幕巨乱亚洲香蕉| 亚洲另类欧美日韩| 97欧美在线视频| 亚洲第一区中文99精品| 国产精品涩涩涩视频网站| 日韩伦理在线观看| 国产白丝精品91爽爽久久| 日本精品久久中文字幕佐佐木| 五月婷六月丁香| 午夜视频在线观看精品中文 | 成人18视频免费69| 亚洲2区在线| 91国产福利在线| 久久久99精品视频| 天堂v视频永久在线播放| 狠狠狠色丁香婷婷综合激情| 欧美与黑人午夜性猛交久久久| 狂野欧美性猛交| 日韩高清在线免费观看| 91精品国产日韩91久久久久久| 免费看的黄色大片| 国产成人l区| 久久在线观看免费| 97se亚洲综合| 国产一区二区在线播放视频| 免费亚洲网站| 欧美极品少妇与黑人| 亚洲 欧美 国产 另类| 久久99精品久久久久久园产越南| 日韩一区二区三| 亚洲成人天堂网| 悠悠资源网亚洲青| 亚洲欧洲日韩一区二区三区| 欧美另类视频在线| 欧洲精品久久一区二区| 国产综合成人久久大片91| 国产黑人绿帽在线第一区| 日韩欧美不卡视频| 欧美欧美天天天天操| 久久精品在线视频| 五月天婷婷丁香网| 精品久久成人| 亚洲欧美在线一区| 播金莲一级淫片aaaaaaa| 国产精品毛片视频| 精品伦理精品一区| 99re6在线观看| 日本国产亚洲| 色哦色哦哦色天天综合| 国产淫片免费看| 三妻四妾完整版在线观看电视剧| 亚洲丶国产丶欧美一区二区三区| 国产91在线亚洲| 丝袜美腿av在线| 一区二区三区日韩| 亚洲三区在线| 国产原创精品视频| 亚洲日本丝袜连裤袜办公室| 色乱码一区二区三区熟女| 在线观看av黄网站永久| 国产精品国产三级国产普通话99| 亚洲欧洲国产日韩精品| 黄色视屏免费在线观看| 亚洲欧洲美洲综合色网| 久久久国产精华液999999| а√中文在线8| 亚洲一区二区在线播放相泽| 国产片侵犯亲女视频播放| 51精品视频| 精品高清一区二区三区| 99免费视频观看| 国产亚洲欧美日韩精品一区二区三区| 欧美美女直播网站| aaaaa黄色片| 欧美xxxx在线| 在线精品91av| 极品久久久久久久| 综合激情一区| 国内揄拍国内精品少妇国语| 日本特级黄色片| 欧美电影网站| 国产精品片aa在线观看| 亚洲欧美另类人妖| 久久中文字幕人妻| 日韩精品一区二区三区免费观影| 久久夜色精品亚洲噜噜国产mv| 麻豆视频在线观看| 久久精品观看| 成人激情在线观看| 精品人妻一区二区三区日产乱码| www.视频一区| 视频一区在线免费观看| 日本乱理伦在线| 都市激情亚洲色图| 中文字幕12页| 丝袜连裤袜欧美激情日韩| 中文字幕日韩高清| 久久久夜色精品| 国产精品腿扒开做爽爽爽挤奶网站| 国产日韩在线播放| 懂色av蜜臀av粉嫩av分享吧| 国产色综合久久| 鲁一鲁一鲁一鲁一澡| 警花av一区二区三区| 国产亚洲美女精品久久久| 日韩 国产 在线| 国产精品综合一区二区三区| 亚洲国产精品123| 澳门成人av网| 亚洲福利视频二区| 免费日韩在线视频| 加勒比av一区二区| 日韩精品一区二区三区丰满 | 中文字幕亚洲区| 91av俱乐部| 亚洲+变态+欧美+另类+精品| 久久久免费在线观看| 国产suv一区二区| 亚洲欧洲无码一区二区三区| 亚洲精品午夜在线观看| 欧美男gay| 国产91在线高潮白浆在线观看 | 视频在线观看一区二区| 手机在线看片1024| 久久综合九色综合97婷婷| 国产美女在线一区| 国产欧美自拍一区| 欧美肥臀大乳一区二区免费视频| 日本一区二区三区精品视频| 亚洲AV无码国产精品午夜字幕| 最新国产成人在线观看| 亚洲天堂av线| 国产乱码精品一区二区三区四区| 日本亚洲欧美三级| 免费在线国产| 在线视频你懂得一区二区三区| 黑人巨大精品欧美| 亚洲综合二区| 欧美日韩一区二区视频在线观看| 国产精品一区二区av影院萌芽| 亚洲免费电影在线观看| 日日噜噜噜噜人人爽亚洲精品| 99精品偷自拍| 激情综合网俺也去| 日韩电影在线视频| 91久久久在线| 激情图片在线观看高清国产| 精品国产乱码久久久久久牛牛| 国产一级淫片a| 91亚洲精品乱码久久久久久蜜桃| 国产精品wwwww| 超碰成人久久| 91入口在线观看| 国产美女一区视频| 精品一区电影国产| 做爰视频毛片视频| 最新国产の精品合集bt伙计| 99免费观看视频| 午夜亚洲精品| 最新欧美日韩亚洲| 红杏成人性视频免费看| 日韩av毛片网| 欧美18hd| 亚洲激情自拍图| 性高潮视频在线观看| 亚洲欧洲日韩在线| 在线免费看黄色片| 日韩高清电影一区| 黄黄视频在线观看| 伊人春色之综合网| 国产在线98福利播放视频| 人人澡人人添人人爽一区二区| 日韩大陆毛片av| 中文字幕男人天堂| 一区二区三区.www| 中文字幕在线看高清电影| 久久99国产乱子伦精品免费| 日韩精品综合在线| 欧美日韩一区二区综合| 99在线观看视频| 婷婷综合六月| 欧美黑人性视频| 日本高清一区| 中文字幕乱码中文乱码51精品| 中文字幕亚洲专区| 精品国产九九九| 欧洲激情一区二区| 国产无码精品在线观看| 国产精品国产三级国产有无不卡 | 天堂国产一区二区三区| 精品视频1区2区3区| 久久视频免费在线观看| 国产精品网站在线| 激情综合丁香五月| 国产精品亚洲午夜一区二区三区| 国产麻花豆剧传媒精品mv在线| 亚洲字幕久久| 亚洲精品成人久久久998| 看全色黄大色大片免费久久久| 91精品久久久久久久久久久| 日韩大尺度黄色| 海角国产乱辈乱精品视频| 秋霞影院午夜丰满少妇在线视频| 亚洲精品狠狠操| 超碰在线人人干| 777a∨成人精品桃花网| 国产寡妇亲子伦一区二区三区四区| 亚洲精品日韩专区silk| 午夜黄色福利视频| 久久久精品影视| 800av在线播放| 国产精品小仙女| 亚洲精品久久久中文字幕| 午夜亚洲性色福利视频| 国精产品一区一区三区视频| 欧美在线免费一级片| 宅男一区二区三区| 国产一区二区三区四区五区传媒| 久久久久一区二区| 国产精品白丝av嫩草影院| 国产自摸综合网| 免费视频观看成人| 国产精品美女视频网站| 国产欧美一区二区三区精品酒店| 性欧美视频videos6一9| 阿v视频在线| 97在线日本国产| 美女搞黄视频在线观看| 91精品国产99| 在线观看网站免费入口在线观看国内 | 你真棒插曲来救救我在线观看| 天天做综合网| 亚洲综合av一区| 欧美aaaa视频| 一级一片免费播放| 偷拍欧美精品| 成人手机在线播放| 欧美久久久久| 亚洲中文字幕无码av永久| 99视频在线精品国自产拍免费观看| 亚洲 自拍 另类小说综合图区| 亚洲精品视频啊美女在线直播| 玩弄中年熟妇正在播放| 久久婷婷丁香| 国产精品区在线| 国内精品国产三级国产a久久| 九九久久久久久| 国产精品69毛片高清亚洲| 亚洲精品无码一区二区| 波多野结衣中文一区| 中文字幕5566| 日本一区二区三区久久久久久久久不 | 国产又黄又大又粗视频| 99精品福利视频| 粉嫩虎白女毛片人体| 免费在线看一区| 在线a免费观看| 不卡一区二区在线| 国产高清一区二区三区四区| 国产精品国产三级国产有无不卡| 青娱乐国产精品| 欧美午夜www高清视频| 波多野结衣在线观看一区| 欧美乱妇15p| 国内爆初菊对白视频| 亚洲欧美日韩精品久久亚洲区 | 欧美亚洲视频在线观看| 亚洲私拍视频| 国产精品丝袜视频| 一区二区三区国产好| 欧美日韩国产精品一区二区| 99久久久国产精品美女| 97久久国产亚洲精品超碰热| 久久国产精品久久久久久电车| 小泽玛利亚视频在线观看| 国产老肥熟一区二区三区| www.88av| 亚洲四区在线观看| 欧美亚洲精品天堂| 欧美日韩一区二区三区不卡| 天堂av2024| 久久精品99久久久香蕉| 欧美巨大丰满猛性社交| 成人在线小视频| 天天操天天干天天操| 菠萝蜜视频在线观看一区| 亚洲国产精品无码久久久久高潮| 欧美国产激情二区三区| 日本免费一二三区| 欧美日韩国产在线播放网站| 天堂а在线中文在线无限看推荐| xxx一区二区| 欧美精品高清| 精品综合在线| 亚洲一区二区三区| 亚洲乱码国产一区三区| 不卡视频在线看| 免费国产羞羞网站美图| 色噜噜狠狠色综合中国| 国产综合在线播放| 日韩一区二区福利| 黑人巨大亚洲一区二区久| 97自拍视频| 91九色精品国产一区二区| www.国产区| aaa国产一区| 欧美成人免费观看视频| 欧美日产在线观看| 国产高清免费在线播放| 97成人精品视频在线观看| 亚洲乱码一区| 性做爰过程免费播放| 美女在线视频一区| 亚洲天堂岛国片| 色婷婷av一区二区三区软件| 色丁香婷婷综合久久| 久久免费高清视频| 亚洲综合色婷婷在线观看| 综合久久国产| 韩国精品一区二区| av最新在线观看| 欧美精品xxxxbbbb| 看女生喷水的网站在线观看| 国产剧情久久久久久| 欧美日韩在线网站| 蜜桃免费在线视频| 国产免费观看久久| 最近中文在线观看| 丝袜亚洲欧美日韩综合| 成人午夜在线| 在线观看亚洲视频啊啊啊啊| 免费看欧美美女黄的网站| 天天躁夜夜躁狠狠是什么心态| 日本二三区不卡| av在线免费观看网| 国产伦精品免费视频| 天天插综合网| 一级网站在线观看| 亚洲激情五月婷婷| 国产18精品乱码免费看| 欧美黄色片在线观看| www.亚洲一二| 久草热视频在线观看| 久久影院午夜片一区| 亚洲第一网站在线观看| 中文字幕一区二区精品| 久久久精品一区二区毛片免费看| 中文字幕人成一区| 国产一区二区三区四区在线观看| 五月天av网站| 亚洲成人xxx| 日韩成人亚洲| 99精品一级欧美片免费播放| 国产成人av一区| 91蜜桃视频在线观看| 亚洲视频在线观看| 18深夜在线观看免费视频| 亚洲图片激情小说| 免费av一级片| 国产精品jizz在线观看麻豆| 国产精品99久久精品| 99久久久无码国产精品性波多 | 西西人体44www大胆无码| 日本久久精品视频| 天天操综合网| 国产精品久久无码| 欧美日韩国产综合久久| 七七久久电影网| 欧美另类视频在线| 国产一区二区三区在线观看免费 | 成人51免费| 亚洲人成无码网站久久99热国产| 久久久精品人体av艺术| av中文字幕播放| 欧洲成人免费视频| 亚洲精品国产成人影院| 中文字幕在线观看的网站| 欧美日韩在线播放| 大尺度在线观看| 亚洲国产精品影院| h视频在线播放| 国产欧美日韩视频一区二区三区| 蜜臀99久久精品久久久久久软件| 青青草原免费观看| 一本一本久久a久久精品牛牛影视| 久久久久久久久成人|