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

Android自定義View

移動開發 Android
Android自定義View的詳細步驟是我們每一個Android開發人員都必須掌握的技能,因為在開發中總會遇到自定義View的需求。為了提高自己的技術水平,自己就系統的去研究了一下,在這里寫下一點心得,有不足之處希望大家及時指出。

前言

Android自定義View的詳細步驟是我們每一個Android開發人員都必須掌握的技能,因為在開發中總會遇到自定義View的需求。為了提高自己的技術水平,自己就系統的去研究了一下,在這里寫下一點心得,有不足之處希望大家及時指出。

流程

在Android中對于布局的請求繪制是在Android framework層開始處理的。繪制是從根節點開始,對布局樹進行measure與draw。在RootViewImpl中的performTraversals展開。它所做的就是對需要的視圖進行measure(測量視圖大小)、layout(確定視圖的位置)與draw(繪制視圖)。下面的圖能很好的展現視圖的繪制流程:   

 

當用戶調用requestLayout時,只會觸發measure與layout,但系統開始調用時還會觸發draw

下面來詳細介紹這幾個流程。

measure

measure是View中的final型方法不可以進行重寫。它是對視圖的大小進行測量計算,但它會回調onMeasure方法,所以我們在自定義View的時候可以重寫onMeasure方法來對View進行我們所需要的測量。它有兩個參數widthMeasureSpec與heightMeasureSpec。其實這兩個參數都包含兩部分,分別為size與mode。size為測量的大小而mode為視圖布局的模式

我們可以通過以下代碼分別獲取:

  1. int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
  2. int heightSize = MeasureSpec.getSize(heightMeasureSpec); 
  3. int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
  4. int heightMode = MeasureSpec.getMode(heightMeasureSpec);  

獲取到的mode種類分為以下三種:

MODE EXPLAIN
UNSPECIFiED 父視圖不對子視圖進行約束,子視圖大小可以是任意大小,一般是對ListViewScrollView等進行自定義,一般用不到
EXACTLY 父視圖對子視圖設定了一個精確的尺寸,子視圖不超過該尺寸,一般為精確的值例如200dp或者使用了match_parent
AT_MOST 父視圖對子視圖指定了一***的尺寸,確保子視圖的所以內容都剛好能在該尺寸中顯示出來,一般為wrap_content,這種父視圖不能獲取子視圖的大小,只能由子視圖自己去計算尺寸,這也是我們測量要實現的邏輯情況

setMeasuredDimension

通過以上邏輯獲取視圖的寬高,***要調用setMeasuredDimension方法將測量好的寬高進行傳遞出去。其實最終是調用setMeasuredDimensionRaw方法對傳過來的值進行屬性賦值。調用super.onMeasure()的調用邏輯也是一樣的。

下面以自定義一個驗證碼的View為例,它的onMeasure方法如下:

  1. @Override 
  2.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
  3.         int widthSize = MeasureSpec.getSize(widthMeasureSpec); 
  4.         int heightSize = MeasureSpec.getSize(heightMeasureSpec); 
  5.         int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
  6.         int heightMode = MeasureSpec.getMode(heightMeasureSpec); 
  7.         if (widthMode == MeasureSpec.EXACTLY) { 
  8.             //直接獲取精確的寬度 
  9.             width = widthSize; 
  10.         } else if (widthMode == MeasureSpec.AT_MOST) { 
  11.             //計算出寬度(文本的寬度+padding的大小) 
  12.             width = bounds.width() + getPaddingLeft() + getPaddingRight(); 
  13.         } 
  14.         if (heightMode == MeasureSpec.EXACTLY) { 
  15.             //直接獲取精確的高度 
  16.             height = heightSize; 
  17.         } else if (heightMode == MeasureSpec.AT_MOST) { 
  18.             //計算出高度(文本的高度+padding的大小) 
  19.             height = bounds.height() + getPaddingBottom() + getPaddingTop(); 
  20.         } 
  21.         //設置獲取的寬高 
  22.         setMeasuredDimension(width, height); 
  23.     }  

可以對自定義View的layout_width與layout_height進行設置不同的屬性,達到不同的mode類型,就可以看到不同的效果

measureChildren

如果你是對繼承ViewGroup的自定義View那么在進行測量自身的大小時還要測量子視圖的大小。一般通過measureChildren(int widthMeasureSpec, int heightMeasureSpec)方法來測量子視圖的大小。

  1. protected void measureChildren(int widthMeasureSpec, int heightMeasureSpec) { 
  2.         final int size = mChildrenCount; 
  3.         final View[] children = mChildren; 
  4.         for (int i = 0; i < size; ++i) { 
  5.             final View child = children[i]; 
  6.             if ((child.mViewFlags & VISIBILITY_MASK) != GONE) { 
  7.                 measureChild(child, widthMeasureSpec, heightMeasureSpec); 
  8.             } 
  9.         } 
  10.     }  

通過上面的源碼會發現,它其實是遍歷每一個子視圖,如果該子視圖不是隱藏的就調用measureChild方法,那么來看下measureChild源碼:

  1. protected void measureChild(View child, int parentWidthMeasureSpec, 
  2.             int parentHeightMeasureSpec) { 
  3.         final LayoutParams lp = child.getLayoutParams(); 
  4.         final int childWidthMeasureSpec = getChildMeasureSpec(parentWidthMeasureSpec, 
  5.                 mPaddingLeft + mPaddingRight, lp.width); 
  6.         final int childHeightMeasureSpec = getChildMeasureSpec(parentHeightMeasureSpec, 
  7.                 mPaddingTop + mPaddingBottom, lp.height); 
  8.         child.measure(childWidthMeasureSpec, childHeightMeasureSpec); 
  9.     }  

會發現它首先調用了getChildMeasureSpec方法來分別獲取寬高,***再調用的就是View的measure方法,而通過前面的分析我們已經知道它做的就是對視圖大小的計算。而對于measure中的參數是通過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.     }  

是不是容易理解了點呢。它做的就是前面所說的根據mode的類型,獲取相應的size。根據父視圖的mode類型與子視圖的LayoutParams類型來決定子視圖所屬的mode,***再將獲取的size與mode通過MeasureSpec.makeMeasureSpec方法整合返回。***傳遞到measure中,這就是前面所說的widthMeasureSpec與heightMeasureSpec中包含的兩部分的值。整個過程為measureChildren->measureChild->getChildMeasureSpec->measure->onMeasure->setMeasuredDimension,所以通過measureChildren就可以對子視圖進行測量計算。

layout

layout也是一樣的內部會回調onLayout方法,該方法是用來確定子視圖的繪制位置,但這個方法在ViewGroup中是個抽象方法,所以如果要自定義的View是繼承ViewGroup的話就必須實現該方法。但如果是繼承View的話就不需要了,View中有一個空實現。而對子視圖位置的設置是通過View的layout方法通過傳遞計算出來的left、top、right與bottom值,而這些值一般都要借助View的寬高來計算,視圖的寬高則可以通過getMeasureWidth與getMeasureHeight方法獲取,這兩個方法獲取的值就是上面onMeasure中setMeasuredDimension傳遞的值,即子視圖測量的寬高。

getWidth、getHeight與getMeasureWidth、getMeasureHeight是不同的,前者是在onLayout之后才能獲取到的值,分別為left-right與top-bottom;而后者是在onMeasure之后才能獲取到的值。只不過這兩種獲取的值一般都是相同的,所以要注意調用的時機。

下面以定義一個把子視圖放置于父視圖的四個角的View為例:

  1. @Override 
  2.     protected void onLayout(boolean changed, int l, int t, int r, int b) { 
  3.         int count = getChildCount(); 
  4.         MarginLayoutParams params; 
  5.          
  6.         int cl; 
  7.         int ct; 
  8.         int cr; 
  9.         int cb; 
  10.              
  11.         for (int i = 0; i < count; i++) { 
  12.             View child = getChildAt(i); 
  13.             params = (MarginLayoutParams) child.getLayoutParams(); 
  14.                  
  15.             if (i == 0) { 
  16.                 //左上角 
  17.                 cl = params.leftMargin; 
  18.                 ct = params.topMargin; 
  19.             } else if (i == 1) { 
  20.                 //右上角 
  21.                 cl = getMeasuredWidth() - params.rightMargin - child.getMeasuredWidth(); 
  22.                 ct = params.topMargin; 
  23.             } else if (i == 2) { 
  24.                 //左下角 
  25.                 cl = params.leftMargin; 
  26.                 ct = getMeasuredHeight() - params.bottomMargin - child.getMeasuredHeight() 
  27.                  - params.topMargin; 
  28.             } else { 
  29.                 //右下角 
  30.                 cl = getMeasuredWidth() - params.rightMargin - child.getMeasuredWidth(); 
  31.                 ct = getMeasuredHeight() - params.bottomMargin - child.getMeasuredHeight() 
  32.                  - params.topMargin; 
  33.             } 
  34.             cr = cl + child.getMeasuredWidth(); 
  35.             cb = ct + child.getMeasuredHeight(); 
  36.             //確定子視圖在父視圖中放置的位置 
  37.             child.layout(cl, ct, cr, cb); 
  38.         } 
  39.     }  

至于onMeasure的實現源碼我后面會給鏈接,如果要看效果圖的話,我后面也會貼出來,前面的那個驗證碼的也是一樣

draw

draw是由dispatchDraw發動的,dispatchDraw是ViewGroup中的方法,在View是空實現。自定義View時不需要去管理該方法。而draw方法只在View中存在,ViewGoup做的只是在dispatchDraw中調用drawChild方法,而drawChild中調用的就是View的draw方法。那么我們來看下draw的源碼:

  1. public void draw(Canvas canvas) { 
  2.         final int privateFlags = mPrivateFlags; 
  3.         final boolean dirtyOpaque = (privateFlags & PFLAG_DIRTY_MASK) == PFLAG_DIRTY_OPAQUE && 
  4.                 (mAttachInfo == null || !mAttachInfo.mIgnoreDirtyState); 
  5.         mPrivateFlags = (privateFlags & ~PFLAG_DIRTY_MASK) | PFLAG_DRAWN; 
  6.           
  7.         /* 
  8.          * Draw traversal performs several drawing steps which must be executed 
  9.          * in the appropriate order
  10.          * 
  11.          *      1. Draw the background 
  12.          *      2. If necessary, save the canvas' layers to prepare for fading 
  13.          *      3. Draw view's content 
  14.          *      4. Draw children 
  15.          *      5. If necessary, draw the fading edges and restore layers 
  16.          *      6. Draw decorations (scrollbars for instance) 
  17.          */ 
  18.            
  19.         // Step 1, draw the background, if needed 
  20.         int saveCount; 
  21.   
  22.         if (!dirtyOpaque) { 
  23.             drawBackground(canvas); 
  24.         } 
  25.           
  26.         // skip step 2 & 5 if possible (common case
  27.         final int viewFlags = mViewFlags; 
  28.         boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0; 
  29.         boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0; 
  30.         if (!verticalEdges && !horizontalEdges) { 
  31.             // Step 3, draw the content 
  32.             if (!dirtyOpaque) onDraw(canvas); 
  33.               
  34.             // Step 4, draw the children 
  35.             dispatchDraw(canvas); 
  36.               
  37.             // Overlay is part of the content and draws beneath Foreground 
  38.             if (mOverlay != null && !mOverlay.isEmpty()) { 
  39.                             mOverlay.getOverlayView().dispatchDraw(canvas); 
  40.             } 
  41.                           
  42.             // Step 6, draw decorations (foreground, scrollbars) 
  43.             onDrawForeground(canvas); 
  44.                         
  45.             // we're done... 
  46.             return
  47.         } 
  48.         //省略2&5的情況 
  49.         .... 
  50. }     

源碼已經非常清晰了draw總共分為6步;

  • 繪制背景
  • 如果需要的話,保存layers
  • 繪制自身文本
  • 繪制子視圖
  • 如果需要的話,繪制fading edges
  • 繪制scrollbars

其中 第2步與第5步不是必須的。在第3步調用了onDraw方法來繪制自身的內容,在View中是空實現,這就是我們為什么在自定義View時必須要重寫該方法。而第4步調用了dispatchDraw對子視圖進行繪制。還是以驗證碼為例:

  1. @Override 
  2.     protected void onDraw(Canvas canvas) { 
  3.         //繪制背景 
  4.         mPaint.setColor(getResources().getColor(R.color.autoCodeBg)); 
  5.         canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint); 
  6.  
  7.         mPaint.getTextBounds(autoText, 0, autoText.length(), bounds); 
  8.         //繪制文本 
  9.         for (int i = 0; i < autoText.length(); i++) { 
  10.              mPaint.setColor(getResources().getColor(colorRes[random.nextInt(6)])); 
  11.             canvas.drawText(autoText, i, i + 1, getWidth() / 2 - bounds.width() / 2 + i * bounds.width() / autoNum 
  12.                     , bounds.height() + random.nextInt(getHeight() - bounds.height()) 
  13.                     , mPaint); 
  14.         } 
  15.   
  16.         //繪制干擾點 
  17.         for (int j = 0; j < 250; j++) { 
  18.              canvas.drawPoint(random.nextInt(getWidth()), random.nextInt(getHeight()), pointPaint); 
  19.         } 
  20.   
  21.         //繪制干擾線 
  22.         for (int k = 0; k < 20; k++) { 
  23.             int startX = random.nextInt(getWidth()); 
  24.             int startY = random.nextInt(getHeight()); 
  25.             int stopX = startX + random.nextInt(getWidth() - startX); 
  26.             int stopY = startY + random.nextInt(getHeight() - startY); 
  27.              linePaint.setColor(getResources().getColor(colorRes[random.nextInt(6)])); 
  28.             canvas.drawLine(startX, startY, stopX, stopY, linePaint); 
  29.         } 
  30.     }  

其實很簡單,就是一些繪制的業務邏輯。好了基本就到這里了,下面上傳一張示例的效果圖,與源碼鏈接

示例圖 

 

 

對了還有自定義屬性,這里簡單說一下。自定義View時一般都要自定義屬性,所以都會在res/values/attr.xml中定義attr與declare-styleable,***在自定義View中通過TypedArray獲取。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2016-12-26 15:25:59

Android自定義View

2016-04-12 10:07:55

AndroidViewList

2017-03-02 13:33:19

Android自定義View

2013-05-20 17:33:44

Android游戲開發自定義View

2012-05-18 10:52:20

TitaniumAndroid模塊自定義View模塊

2013-01-06 10:43:54

Android開發View特效

2021-10-26 10:07:02

鴻蒙HarmonyOS應用

2011-08-02 11:17:13

iOS開發 View

2017-03-14 15:09:18

AndroidView圓形進度條

2013-04-01 14:35:10

Android開發Android自定義x

2017-05-18 12:36:16

android萬能適配器列表視圖

2010-02-07 14:02:16

Android 界面

2017-05-19 10:03:31

AndroidBaseAdapter實踐

2015-02-12 15:33:43

微信SDK

2011-08-18 17:32:55

iPhone開發Table Cell

2013-05-02 14:08:18

2014-12-10 10:37:45

Android自定義布局

2015-02-11 17:49:35

Android源碼自定義控件

2015-02-12 15:38:26

微信SDK

2013-01-09 17:22:38

Android開發Camera
點贊
收藏

51CTO技術棧公眾號

伊人狠狠色丁香综合尤物| 精品国偷自产在线视频99| 九一国产精品视频| 国产高清视频在线播放| 精品一区二区三区不卡 | 国产欧美一级| 在线观看国产精品91| 日本中文字幕在线不卡| 亚洲风情在线资源| 亚洲私人影院在线观看| 久久66热这里只有精品| 91精品国产综合久| 黑丝一区二区三区| 中文字幕视频精品一区二区三区| 国产91精品一区二区| 欧美最近摘花xxxx摘花| 青青青在线免费观看| 亚洲a级精品| 欧美不卡激情三级在线观看| 日本999视频| f2c人成在线观看免费视频| 国产精品久久久爽爽爽麻豆色哟哟| 国产精品乱码一区二区三区| 中文字幕一二三四| 亚洲女人av| 色综合久久久久久中文网| youjizz亚洲女人| 欧美综合自拍| 精品国产区一区| 亚洲综合伊人久久| 99精品国自产在线| 色94色欧美sute亚洲线路二| 日本欧美黄色片| 三级网站视频在在线播放| 国产精品麻豆视频| 欧美日韩精品久久久免费观看| 乱色精品无码一区二区国产盗| 毛片不卡一区二区| 国产精品免费看久久久香蕉| www.毛片.com| 国产日韩免费| 97精品久久久| 久久久久久久久久久久久久av| 欧美福利网址| 欧美成人精品在线观看| 婷婷社区五月天| 欧美成人milf| www.午夜精品| 亚洲一级生活片| 91精品亚洲| 乱亲女秽乱长久久久| 日本女人性生活视频| 亚洲精品亚洲人成在线| 国产丝袜一区视频在线观看| 六十路息与子猛烈交尾| 欧美成人专区| 日韩国产精品亚洲а∨天堂免| 亚洲制服丝袜在线播放| 久久精品色综合| 日韩激情av在线播放| 中国xxxx性xxxx产国| 国内精品国产成人国产三级粉色| 亚洲国产成人爱av在线播放| 午夜视频在线观看国产| 日韩av网站在线免费观看| 国产视频久久久久久久| 女人又爽又黄免费女仆| 精品一区二区三区在线| 深夜福利国产精品| 91高清免费观看| 欧美午夜视频| 国内免费久久久久久久久久久| 国产无码精品视频| 久久不射2019中文字幕| 国产精品成人播放| 国产又粗又猛又黄又爽无遮挡| 韩国一区二区三区| 国产精品中出一区二区三区| 免费在线观看一级毛片| 中文av字幕一区| 黄色一级片av| 亚洲性受xxx喷奶水| 欧美日韩一区不卡| 第一页在线视频| 美女网站一区| 三级精品视频久久久久| 国产精品suv一区二区| 丝袜脚交一区二区| 亚洲一区二区三区视频播放| 香蕉视频网站在线| 国产精品高潮久久久久无| 日本高清视频免费在线观看| 成人性生交大片免费网站| 欧美挠脚心视频网站| 国产艳妇疯狂做爰视频| 女女色综合影院| 伊人网在线播放| 亚洲国产精品久久一线不卡| 成人小视频在线看| 精品伊人久久| 亚洲色图五月天| 欧美成人精品欧美一级| 爽爽淫人综合网网站| av一区二区三区四区电影| 精品无吗乱吗av国产爱色| 亚洲精品高清在线| 亚洲第一中文av| 欧美精品国产白浆久久久久| 久久精品亚洲国产| 男女啊啊啊视频| 国产一区二区在线影院| 欧美精品二区三区四区免费看视频| 超碰caoporn久久| 在线观看一区二区视频| 久久久久久久穴| 国产精品久久久乱弄 | 日韩精品欧美国产精品忘忧草| 乐播av一区二区三区| 很黄很黄激情成人| 亚洲精品日产aⅴ| 高清美女视频一区| 欧美日韩免费在线| 激情综合激情五月| 91不卡在线观看| 国产精品视频一区二区三区四| 少妇精品视频一区二区| 一区二区三区中文字幕电影| 中文字幕 91| 狠狠操综合网| 日本精品免费一区二区三区| 日本久久一级片| 一级日本不卡的影视| 午夜剧场在线免费观看| 欧美日韩性在线观看| 日韩av成人在线观看| 四虎免费在线观看| 亚洲va韩国va欧美va| 色欲欲www成人网站| 图片小说视频色综合| 国产日韩综合一区二区性色av| 毛片在线播放网址| 一本大道久久精品懂色aⅴ| jizz日本免费| 性色一区二区三区| 欧美日韩在线观看一区| 亚洲一二三四| 一区二区在线视频| 艳妇乳肉豪妇荡乳av无码福利| 久久精品一区二区三区不卡| 那种视频在线观看| 色综合综合色| 国产精品极品美女在线观看免费| 国产美女性感在线观看懂色av | 情侣黄网站免费看| 亚洲肉体裸体xxxx137| 日韩av高清不卡| 在线免费观看黄色网址| 欧美伦理视频网站| 玖玖爱这里只有精品| 黄色小说综合网站| av影院在线播放| 国产精品毛片视频| 欧美亚洲另类激情另类| 精品无人乱码| 在线不卡免费欧美| 欧美人妻精品一区二区免费看| 国产精品影视在线| 91精品国产91久久久久麻豆 主演| 高清一区二区三区| 欧美最顶级丰满的aⅴ艳星| 成人在线免费看| 91精品国产乱码| 日韩av男人天堂| 国产亚洲一区二区三区在线观看| 污污的网站18| 国产一区二区三区自拍| 久久久久久久久一区| 99久久伊人| 九九精品在线播放| 免费在线看v| 91精品国产综合久久福利| 国产在线一二区| 久久综合精品国产一区二区三区| 一女二男3p波多野结衣| 欧美三区视频| 日本中文不卡| 一区二区三区在线免费看 | 中文字幕亚洲国产| 精品久久久中文字幕人妻| 精品国产电影一区| 麻豆视频免费在线播放| 丁香激情综合五月| 日日摸天天爽天天爽视频| 农村寡妇一区二区三区| 麻豆一二三区精品蜜桃| 人人澡人人澡人人看欧美| 国产视频在线播放| 亚洲美女av在线| 国产浮力第一页| 一本到一区二区三区| 青青草原国产视频| 欧美国产精品久久| 成年人的黄色片| 国产一区不卡视频| 日本在线观看a| 亚洲天堂偷拍| 在线丝袜欧美日韩制服| 性欧美lx╳lx╳| av成人综合网| 日韩精品一页| 国产成人精品av在线| 激情黄产视频在线免费观看| 色老头一区二区三区| 亚洲三区在线播放| 欧美zozozo| 国产日韩欧美一区二区东京热| 色综合久久久久久久久久久| 国产第一页在线播放| 亚洲欧美激情插| 精品熟妇无码av免费久久| 久久蜜桃一区二区| 国产xxxxxxxxx| 国产精品一区二区在线播放| 2025韩国理伦片在线观看| 国产精品色网| 农民人伦一区二区三区| 中文字幕免费一区二区| 伊人久久青草| 欧美xxxx中国| 亚洲无玛一区| 日韩免费一区| 亚洲国产日韩综合一区| 国产一区二区精品福利地址| 欧美国产视频在线观看| 日韩丝袜视频| 久久精品国产综合精品| 国产伦乱精品| 国模精品娜娜一二三区| 高潮久久久久久久久久久久久久| 成人免费91在线看| 国产一区二区av在线| 成人女保姆的销魂服务| 日韩欧美专区| 成人自拍性视频| 免费精品一区| 99在线视频免费观看| 天堂久久av| 国产精品免费一区二区三区观看| 亚洲高清999| 国产精品入口免费| 欧美精品国产白浆久久久久| 欧美另类网站| 不卡在线一区| 欧美日韩视频免费在线观看| 久久精品免费一区二区三区| 在线视频一二三区| 亚洲欧美亚洲| 日本午夜激情视频| 美女久久网站| gai在线观看免费高清| 国产在线精品一区在线观看麻豆| 性色av浪潮av| 99在线精品一区二区三区| 日本xxx在线播放| 国产女同互慰高潮91漫画| 开心激情五月网| 亚洲精品成人在线| 国产午夜在线播放| 色狠狠一区二区三区香蕉| 一二三四区在线| 精品卡一卡二卡三卡四在线| 亚洲日本在线播放| 日韩一区二区三区在线播放| 密臀av在线| 国产91色在线免费| 精品国产乱码久久久久久樱花| 国产高清在线一区| 国内精品视频在线观看| 激情图片qvod| 欧美亚洲网站| 亚洲一二区在线观看| 99国产欧美久久久精品| 日日操免费视频| 亚洲国产成人av网| 老熟妇一区二区三区啪啪| 日韩免费视频线观看| 欧美美女搞黄| 久久精品视频在线播放| 欧美久久天堂| 亚洲一区二区三区乱码aⅴ| 午夜先锋成人动漫在线| 国产又粗又爽又黄的视频 | 污污的网站免费| 成人av资源网站| 午夜激情福利电影| 欧美日韩国产精品专区 | 六九午夜精品视频| 国产欧美欧洲| 亚洲成av人片乱码色午夜| 国产日产欧美视频| 国产精品一级片| 日韩在线视频免费观看| 日本亚洲一区| 久久69精品久久久久久久电影好| 88xx成人免费观看视频库| 91精品久久久久久蜜桃| 精品久久久亚洲| 国产不卡一区二区视频| 精品在线观看免费| a天堂中文字幕| 亚洲成人av免费| 国产福利视频导航| 一区二区欧美久久| 亚洲精品国产精品国产| 国产精品麻豆免费版| 国产精品久久久久无码av| 99视频精品免费| 波多野结衣一区二区三区 | 99久久精品国产亚洲精品 | 不卡的免费av| 欧美一区二区精品久久911| 大胆av不用播放器在线播放| 91国内精品久久| 99精品中文字幕在线不卡| 中国成人亚色综合网站| 日本亚洲免费观看| 久久久无码人妻精品一区| 亚洲成人精品一区二区| 午夜精品无码一区二区三区| 久久久国产在线视频| 欧美xxxx网站| 亚洲一区二区在线看| 石原莉奈在线亚洲三区| 91精品人妻一区二区| 欧美日韩国产精品| 青青免费在线视频| 欧美一区二区视频97| 日韩av中文字幕一区| 成人免费播放器| 99精品在线观看视频| 国产精品7777| 亚洲精品美女网站| 别急慢慢来1978如如2| 91在线视频网址| 自拍偷拍欧美亚洲| 日韩不卡中文字幕| 成人性生交大片免费网站| 免费日韩av电影| 日日夜夜精品免费视频| 免费一级黄色录像| 在线观看www91| 尤物网在线观看| 成人妇女淫片aaaa视频| 久久看人人摘| 涩多多在线观看| 亚洲免费高清视频在线| 成 人片 黄 色 大 片| 欧美激情综合亚洲一二区| 精品福利一区| 妞干网在线免费视频| 亚洲国产精品成人综合色在线婷婷 | 成人免费看吃奶视频网站| 911精品美国片911久久久| 青青草精品在线| 亚洲成av人在线观看| 亚洲av毛片成人精品| 青青草原成人在线视频| 小嫩嫩12欧美| 中文字幕 欧美日韩| 亚洲激情图片一区| 四虎影视在线播放| 国产精品成人观看视频国产奇米| 午夜激情久久| 李丽珍裸体午夜理伦片| 色播五月激情综合网| 成人短视频在线观看| 国产日韩欧美一区二区三区四区| 午夜在线播放视频欧美| 日本视频在线免费| 欧美xxxxxxxx| 亚洲伦乱视频| 青青视频免费在线| 91免费版在线| 97人人爽人人爽人人爽| 国内精品国产三级国产在线专| 国产一区二区三区天码| 99视频在线观看视频| 日韩欧美极品在线观看| 黄色大片在线播放| 久久久久久一区| 国产一区二区影院| 国产又大又黄视频| 久久综合电影一区| 亚洲欧美tv| 精品国产aⅴ一区二区三区东京热 久久久久99人妻一区二区三区 | 国产精品乡下勾搭老头1| 亚洲国产成人无码av在线| 不卡av在线网站| 伊人春色之综合网| 性折磨bdsm欧美激情另类|