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

從自定義ViewGroup看Layout作用

開發(fā) 前端
關(guān)于layout,很多朋友知道它是負(fù)責(zé)布局的,那么具體是怎么布局的?viewGroup和view的layout方法又有什么不同?一起來看看吧。

[[400334]]

我回來了

這次感冒可耽誤我太多時(shí)間了,中間斷斷續(xù)續(xù)去了幾趟醫(yī)院和診所,終于差不多好了,于是心里又暗暗下定決定,一定要好好養(yǎng)身體(可能過兩天又忘了??)

總之大家也都多注意身體吧,身體垮了啥也干不了。

廢話不多說,開始今天的Android之旅~

前言

上次我們說到View的Mearsure流程,今天接著說說layout。

關(guān)于layout,很多朋友知道它是負(fù)責(zé)布局的,那么具體是怎么布局的?viewGroup和view的layout方法又有什么不同?一起來看看吧。

View layout方法

首先,還是從ViewRootImpl說起,界面的繪制會(huì)觸發(fā)performMeasure、performLayout方法,而在performLayout方法中就會(huì)調(diào)用mView的layout方法開始一層層View的布局工作。

  1. private void performLayout(WindowManager.LayoutParams lp, int desiredWindowWidth, 
  2.            int desiredWindowHeight) { 
  3.         
  4.        final View host = mView; 
  5.        host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight()); 
  6.    } 

mView我們都知道了,就是頂層View——DecorView,那么就進(jìn)去看看DecorView的layout方法:

不好意思,DecorView中并沒有l(wèi)ayout方法...

所以,我們直接看看View的layout方法:

  1. public void layout(int l, int t, int r, int b) { 
  2.  
  3.        boolean changed = isLayoutModeOptical(mParent) ? 
  4.                setOpticalFrame(l, t, r, b) : setFrame(l, t, r, b); 
  5.  
  6.        if (changed || (mPrivateFlags & PFLAG_LAYOUT_REQUIRED) == PFLAG_LAYOUT_REQUIRED) { 
  7.            onLayout(changed, l, t, r, b); 
  8.        } 
  9.    } 
  10.  
  11.    protected void onLayout(boolean changed, int leftint topint rightint bottom) { 
  12.    } 
  • 首先,方法傳入了四個(gè)參數(shù),分別代表view的左、上、下、右四個(gè)值。
  • 然后通過setOpticalFrame方法或者setFrame方法判斷布局參數(shù)是否改變。

具體判斷過程就是通過老的上下左右值和新的上下左右值進(jìn)行比較,邏輯就在setFrame方法中:

  1. protected boolean setFrame(int leftint topint rightint bottom) { 
  2.         boolean changed = false
  3.  
  4.         if (mLeft != left || mRight != right || mTop != top || mBottom != bottom) { 
  5.             changed = true
  6.  
  7.             // Remember our drawn bit 
  8.             int drawn = mPrivateFlags & PFLAG_DRAWN; 
  9.  
  10.             int oldWidth = mRight - mLeft; 
  11.             int oldHeight = mBottom - mTop; 
  12.             int newWidth = right - left
  13.             int newHeight = bottom - top
  14.             boolean sizeChanged = (newWidth != oldWidth) || (newHeight != oldHeight); 
  15.  
  16.             // Invalidate our old position 
  17.             invalidate(sizeChanged); 
  18.  
  19.             mLeft = left
  20.             mTop = top
  21.             mRight = right
  22.             mBottom = bottom; 
  23.             mRenderNode.setLeftTopRightBottom(mLeft, mTop, mRight, mBottom); 
  24.         } 
  25.         return changed; 
  26.     } 

如果上下左右有一個(gè)參數(shù)值發(fā)生了改變,就說明這個(gè)View的布局發(fā)生了改變,然后重新計(jì)算View的寬度高度(newWidth、newHeight),并賦值了View新的上下左右參數(shù)值。

在這個(gè)layout方法中主要涉及到了四個(gè)參數(shù):mLeft、mTop、mBottom、mRight,分別代表了View的左坐標(biāo)、上坐標(biāo)、下坐標(biāo)和右坐標(biāo),你可以把View理解為一個(gè)矩形,確定了這四個(gè)值,就能確定View矩形的四個(gè)頂點(diǎn)值,也就能確定View在畫布中的具體位置。

所以,layout方法到底干了啥?

就是傳入上下左右值、然后賦值上下左右值、完畢。

然后我們就可以根據(jù)這些值獲取View的一系列參數(shù),比如View寬度:

  1. public final int getWidth() { 
  2.       return mRight - mLeft; 
  3.   } 

至此,View的layout方法就結(jié)束了,主要就是通過對(duì)上下左右參數(shù)的賦值完成對(duì)View的布局,非常簡單。

下面看看ViewGroup。

ViewGroup layout方法

  1. @Override 
  2.    public final void layout(int l, int t, int r, int b) { 
  3.        if (!mSuppressLayout && (mTransition == null || !mTransition.isChangingLayout())) { 
  4.            if (mTransition != null) { 
  5.                mTransition.layoutChange(this); 
  6.            } 
  7.            super.layout(l, t, r, b); 
  8.        } else { 
  9.            mLayoutCalledWhileSuppressed = true
  10.        } 
  11.    } 

額,還是調(diào)用到View的layout方法,難道說ViewGroup和View的布局過程是一樣的,就是確定了本身的位置?

那ViewGroup的子View怎么辦呢?不急,我們剛才說layout方法的時(shí)候還漏了一個(gè)onLayout方法,只不過這個(gè)方法在View里面是空實(shí)現(xiàn),而到了ViewGroup中變成了一個(gè)抽象方法:

  1. @Override 
  2.     protected abstract void onLayout(boolean changed, 
  3.             int l, int t, int r, int b); 

也就是任何ViewGroup都必須實(shí)現(xiàn)這個(gè)方法,來完成對(duì)子View的布局?jǐn)[放。

具體的布局?jǐn)[放邏輯就是在onLayout方法中一個(gè)個(gè)調(diào)用子View的layout方法,然后完成每個(gè)子View的布局,最終完成繪制工作。

接下來我們就來自己實(shí)現(xiàn)一個(gè)垂直線性布局(類似LinearLayout),正好復(fù)習(xí)下上一節(jié)的onMearsure和這一節(jié)的onLayout。

自定義垂直布局VerticalLayout

首先,我們要確定我們這個(gè)自定義ViewGroup的作用,是類似垂直方向的LinearLayout功能,在該ViewGroup下的子View可以按垂直線性順序依次往下排放。我們給它起個(gè)名字叫VerticalLayout~

繼承ViewGroup

首先,我們這個(gè)布局肯定要繼承自ViewGroup,并且實(shí)現(xiàn)相應(yīng)的構(gòu)造方法:

  1. public class VerticalLayout : ViewGroup { 
  2.  
  3.     constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int = 0) : super( 
  4.         context, 
  5.         attrs, 
  6.         defStyleAttr 
  7.     ) 
  8.  
  9.     constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { 
  10.     } 

重寫generateLayoutParams方法

自定義ViewGroup還需要重寫的一個(gè)方法是generateLayoutParams,這一步是為了讓我們的ViewGroup支持Margin,后續(xù)我們就可以通過MarginLayoutParams來獲取子View的Margin值。

  1. override fun generateLayoutParams(attrs: AttributeSet?): LayoutParams? { 
  2.       return MarginLayoutParams(context, attrs) 
  3.   } 

重寫測量方法onMeasure

然后,我們需要對(duì)我們的布局進(jìn)行測量,也就是重寫onMeasure方法。

在該方法中,我們需要對(duì)我們的布局進(jìn)行測量,并且將測量好的寬高傳入setMeasuredDimension方法,完成測量。

  1. protected final void setMeasuredDimension(int measuredWidth, int measuredHeight) 

之前我們說過,onMeasure方法會(huì)傳進(jìn)來兩個(gè)參數(shù),widthMeasureSpec和heightMeasureSpec。

里面包含了父View根據(jù)當(dāng)前View的LayoutParams和父View的測量規(guī)格進(jìn)行計(jì)算,得出的對(duì)當(dāng)前View期望的測量模式和測量大小:

  • 當(dāng)測量模式為MeasureSpec.EXACTLY

也就是當(dāng)寬或者高為確定值時(shí),那么當(dāng)前布局View的寬高也就是設(shè)定為父View給我們設(shè)置好的測量大小即可。比如寬為400dp,那么我們無需重新測量直接調(diào)用setMeasuredDimension傳入這個(gè)固定值即可。

  • 當(dāng)測量模式為MeasureSpec.AT_MOST 或者 UNSPECIFIED:

這時(shí)候,說明父View對(duì)當(dāng)前View的要求不固定,是可以為任意大小或者不超過最大值的情況,比如設(shè)置這個(gè)VerticalLayout的高度為wrap_content。那么我們就必須重新進(jìn)行高度測量了,因?yàn)橹挥形覀冊O(shè)計(jì)者知道這個(gè)自適應(yīng)高度需要怎么計(jì)算。具體就是VerticalLayout是一個(gè)垂直線性布局,所以高度很自然就是所有子View的高度之和。

至此,onMeasure方法的邏輯也基本摸清了:

  1. override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { 
  2.         super.onMeasure(widthMeasureSpec, heightMeasureSpec) 
  3.         //獲取寬高的測量模式和測量大小 
  4.         val widthMode = MeasureSpec.getMode(widthMeasureSpec) 
  5.         val heightMode = MeasureSpec.getMode(heightMeasureSpec) 
  6.         val sizeWidth = MeasureSpec.getSize(widthMeasureSpec) 
  7.         val sizeHeight = MeasureSpec.getSize(heightMeasureSpec) 
  8.  
  9.         var mHeight = 0 
  10.         var mWidth = 0 
  11.  
  12.         //遍歷子View,獲取總高度 
  13.         for (i in 0 until childCount) { 
  14.             val childView = getChildAt(i) 
  15.             //測量子View的寬和高 
  16.             measureChild(childView, widthMeasureSpec, heightMeasureSpec) 
  17.             val lp = childView.layoutParams as MarginLayoutParams 
  18.             val childWidth = childView.measuredWidth + lp.leftMargin + lp.rightMargin 
  19.             val childHeight = childView.measuredHeight + lp.topMargin + lp.bottomMargin 
  20.  
  21.             //計(jì)算得出最大寬度 
  22.             mWidth = Math.max(mWidth, childWidth) 
  23.             //累計(jì)計(jì)算高度 
  24.             mHeight += childHeight 
  25.         } 
  26.  
  27.         //設(shè)置寬高 
  28.         setMeasuredDimension( 
  29.             if (widthMode == MeasureSpec.EXACTLY) sizeWidth else mWidth, 
  30.             if (heightMode == MeasureSpec.EXACTLY) sizeHeight else mHeight 
  31.         ) 
  32.     } 

主要的邏輯就是遍歷子View,得出VerticalLayout的實(shí)際寬高:

最終ViewGroup的高 = 所有子View的 (高 + margin值)

最終ViewGroup的寬 = 最大子View的 (寬 + margin值)

最后調(diào)用setMeasuredDimension 根據(jù)測量模式 傳入寬高。

重寫布局方法onLayout

上文說過,作為一個(gè)ViewGroup,必須重寫onLayout方法,來保證子View的正常布局?jǐn)[放。

垂直線性布局VerticalLayout亦是如此,那么在這個(gè)布局中onLayout方法的關(guān)鍵邏輯又是什么呢?

還是那句話,確定位置,也就是確定左、上、右、下四個(gè)參數(shù)值,而在VerticalLayout中,最關(guān)鍵的參數(shù)就是這個(gè)上,也就是top值。

每個(gè)View的top值必須是上一個(gè)View的bottom值,也就是接著上一個(gè)View進(jìn)行擺放,這樣才會(huì)是垂直線性的效果,所以我們需要做的就是動(dòng)態(tài)計(jì)算每個(gè)View的top值,其實(shí)也就是不斷累加View的高度,作為下一個(gè)View的top值。

  1. override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { 
  2.         var childWidth = 0 
  3.         var childHeight = 0 
  4.         var childTop = 0 
  5.         var lp: MarginLayoutParams 
  6.  
  7.         //遍歷子View,布局每個(gè)子View 
  8.         for (i in 0 until childCount) { 
  9.             val childView = getChildAt(i) 
  10.             childHeight = childView.measuredHeight 
  11.             childWidth = childView.measuredWidth 
  12.             lp = childView.layoutParams as MarginLayoutParams 
  13.  
  14.             //累計(jì)計(jì)算top值 
  15.             childTop += lp.topMargin 
  16.  
  17.             //布局子View 
  18.             childView.layout( 
  19.                 lp.leftMargin, 
  20.                 childTop, 
  21.                 lp.leftMargin + childWidth, 
  22.                 childTop + childHeight 
  23.             ); 
  24.  
  25.             childTop += childHeight + lp.bottomMargin 
  26.         } 
  27.     } 

邏輯還是挺簡單的,

left是固定的子View的leftMargin。

top是累加計(jì)算的子View的高度 + Margin值。

right是left + 子View的寬度。

bottom是top + 子View的高度。

最后調(diào)用子View的layout方法,對(duì)每個(gè)子View進(jìn)行布局。

大功告成,最后看看我們這個(gè)自定義垂直線性布局的效果吧~

效果展示

  1. <com.panda.studynote3.VerticalLayout 
  2.         android:layout_width="wrap_content" 
  3.         android:layout_height="wrap_content"
  4.  
  5.         <TextView 
  6.             android:layout_width="100dp" 
  7.             android:layout_height="100dp" 
  8.             android:text="啦啦啦" 
  9.             android:textSize="20sp" 
  10.             android:textColor="@color/white" 
  11.             android:background="@color/design_default_color_primary" 
  12.             /> 
  13.  
  14.         <TextView 
  15.             android:layout_width="300dp" 
  16.             android:layout_height="200dp" 
  17.             android:layout_marginTop="20dp" 
  18.             android:background="@color/cardview_dark_background" 
  19.             android:textSize="20sp" 
  20.             android:textColor="@color/white" 
  21.             android:text="你好啊" 
  22.             /> 
  23.  
  24.         <TextView 
  25.             android:layout_width="140dp" 
  26.             android:layout_height="100dp" 
  27.             android:text="嘻嘻" 
  28.             android:layout_marginLeft="10dp" 
  29.             android:layout_marginTop="10dp" 
  30.             android:textSize="20sp" 
  31.             android:gravity="center" 
  32.             android:textColor="@color/black" 
  33.             android:background="@color/teal_200" 
  34.             /> 
  35.  
  36.     </com.panda.studynote3.VerticalLayout> 

本文轉(zhuǎn)載自微信公眾號(hào)「碼上積木」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系碼上積木公眾號(hào)。

 

責(zé)任編輯:武曉燕 來源: 碼上積木
相關(guān)推薦

2015-02-12 15:33:43

微信SDK

2020-11-25 11:20:44

Spring注解Java

2015-02-12 15:38:26

微信SDK

2016-11-16 21:55:55

源碼分析自定義view androi

2016-12-26 15:25:59

Android自定義View

2011-06-23 10:49:13

Qt 自定義信號(hào)

2021-07-05 08:43:46

Spring Beanscope作用域

2017-02-28 10:05:56

Chrome源碼

2023-09-05 08:23:56

SpringScope方法

2021-12-07 18:23:50

自定義進(jìn)度條分段式

2009-07-06 16:59:26

JSP自定義標(biāo)簽

2025-03-03 00:00:00

Chrome工具前端

2023-09-06 10:33:40

夜鶯監(jiān)控數(shù)據(jù)庫

2013-06-27 11:10:01

iOS開發(fā)自定義UISlider

2013-04-19 10:14:24

2015-07-22 10:57:36

watchOS圖表自定義

2010-09-14 16:47:23

SQL自定義函數(shù)

2021-12-28 15:38:46

Traefik中間件插件

2015-01-14 15:06:48

定義相機(jī)

2009-06-08 20:13:36

Eclipse自定義控
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日本欧洲一区二区| 欧美人与牲禽动交com | 高清性色生活片在线观看| 亚洲人人精品| 亚洲精品久久久久久久久久久| 337p亚洲精品色噜噜狠狠p| 亚洲电影免费| 免费观看a级片| 福利视频亚洲| 亚洲免费观看视频| 国产综合欧美在线看| 人人干人人干人人干| 老牛影视精品| 天天视频天天爽| 欧美肥婆姓交大片| 久久激情久久| 国产精品爽爽久久| aa成人免费视频| 国产性天天综合网| 美女高潮视频在线看| 精品一区不卡| 欧美日韩国产123区| 国产精品夜夜夜爽张柏芝| 精品二区在线观看| 宅男噜噜噜66一区二区| 在线观看欧美视频| 精品国产一二区| 不卡福利视频| 亚洲啪啪综合av一区二区三区| 国产精品三级久久久久三级| 久久久中精品2020中文| 亚洲成人黄色av| 日韩成人在线看| 日本丰满少妇一区二区三区| 超碰人人爱人人| 国产专区在线| 国产精一区二区三区| 日韩av123| 麻豆视频在线观看| japanese国产精品| 亚洲第一色在线| 国产色视频在线播放| аⅴ资源天堂资源库在线| 中文字幕一区二区三中文字幕| 久久久国产一区二区三区四区小说 | 欧美黄色小说| 国精产品一区一区三区视频| 日韩久久免费av| 天堂a中文在线| 国产精品免费看一区二区三区| 国产精品一级久久久| 女人十八毛片嫩草av| 国产ts一区| 337p亚洲精品色噜噜噜| 中文字幕无码不卡免费视频| 欧美1234区| 日韩理论片一区二区| 日本高清不卡一区二区三| 欧美特黄一级视频| 国产精品1024久久| 91在线观看免费| 一本色道久久综合熟妇| 视频在线观看一区| 欧美专区中文字幕| 日韩人妻无码一区二区三区99| 亚洲精品久久| 日韩网站免费观看| 日本不卡一区视频| 精品国产一区探花在线观看| 精品小视频在线| 亚洲国产第一区| 国产精品网在线观看| 精品99久久久久久| 国产艳妇疯狂做爰视频| 亚洲经典视频| 欧美人妇做爰xxxⅹ性高电影 | 天美av一区二区三区久久| 日韩欧美综合在线| 日韩高清一二三区| 国产劲爆久久| 亚洲精品国产欧美| 熟女少妇一区二区三区| 在线一级成人| 亚洲人成网站色ww在线| 一本色道综合久久欧美日韩精品 | 91麻豆精品国产| 亚洲精品性视频| 综合久久伊人| 日韩一区二区三区免费看| 中文字幕乱妇无码av在线| 日韩免费高清视频网站| 精品免费一区二区三区| 午夜av免费看| 国产aⅴ精品一区二区三区久久| 亚洲日本中文字幕免费在线不卡| 黄免费在线观看| 成人亚洲一区二区| 久久久99久久精品女同性| 少妇视频一区二区| 综合久久十次| 韩剧1988免费观看全集| av网站中文字幕| 久久激情综合网| 97人人干人人| 你懂的在线播放| 国产色产综合产在线视频| 亚洲图片小说在线| 免费电影视频在线看| 精品毛片网大全| 亚洲人成无码www久久久| 久久日本片精品aaaaa国产| 日韩欧美亚洲国产另类| 性久久久久久久久久| 久久美女视频| 欧美国产在线电影| 久久久黄色大片| 久久99久久久久久久久久久| 国产精品12| 男人的天堂在线| 亚洲视频图片小说| 91av资源网| 996久久国产精品线观看| 日韩电影在线观看永久视频免费网站| 蜜桃传媒一区二区亚洲| 欧美黄色免费| 国产精品久久久久久久久久ktv| 国产视频一二三四区| 91在线国产福利| 国产精品无码乱伦| 三上悠亚激情av一区二区三区| 日韩一区二区三区视频| 国产又粗又猛又爽又黄av| 欧美69视频| 国产精品一区二区久久精品| 色婷婷综合视频| 国产精品毛片久久久久久久| 欧美日韩一区二区三区电影| 在线观看爽视频| 精品久久人人做人人爰| 在线观看天堂av| 做爰视频毛片视频| 亚洲成人日韩在线| 中文字幕人妻色偷偷久久| 天堂影院一区二区| 国产精品初高中精品久久| 成人在线观看免费| 午夜精品福利在线| 在线免费看v片| 欧美老女人另类| 81精品国产乱码久久久久久| 精品国产无码AV| 国产精品久久久久影院老司| 欧美a在线视频| 国产香蕉精品| 欧美激情国产日韩精品一区18| 亚洲综合精品国产一区二区三区| 国产99久久久久久免费看农村| 一区二区精品在线| 亚洲天堂手机| 日韩电影免费在线观看中文字幕| 久热精品在线观看| 国产成人99久久亚洲综合精品| 一本一生久久a久久精品综合蜜| 97久久香蕉国产线看观看| 国产婷婷97碰碰久久人人蜜臀| 日韩激情一区二区三区| 福利视频网站一区二区三区| 麻豆传媒网站在线观看| 久久丁香四色| 欧美日韩国产成人在线| 午夜老司机福利| 亚洲精品乱码久久久久久黑人| 久国产精品视频| 天天天综合网| 91在线视频成人| 99在线视频观看| 欧美一级日韩一级| 东方av正在进入| 日日夜夜免费精品| 奇米视频888战线精品播放| 高潮一区二区| 自拍视频国产精品| 69av视频在线观看| 日韩欧美电影在线观看| 国产欧美日韩在线视频| 116极品美女午夜一级| 国产精品欧美三级在线观看| 国产不卡在线观看| 浮生影视网在线观看免费| 精品欧美aⅴ在线网站| 91九色蝌蚪porny| 最新国产乱人伦偷精品免费网站| 精品乱子伦一区二区三区| 亚洲精品88| 中文字幕亚洲情99在线| 国产日韩欧美一区二区东京热| 夜夜精品视频一区二区| 国产草草浮力影院| 青青青爽久久午夜综合久久午夜| 一本一道久久a久久精品综合 | 一区二区三区美女视频| 美女搡bbb又爽又猛又黄www| 国产一区二区你懂的| 青青草原亚洲| 亚洲精品一区三区三区在线观看| 中文字幕亚洲天堂| www.97超碰| 欧美日韩在线视频观看| 五月婷婷六月香| 国产成人精品综合在线观看| 欧美 日韩 国产 高清| 色狮一区二区三区四区视频| 91亚洲精品丁香在线观看| 国产不卡人人| 日韩在线视频网站| 日本激情一区二区三区| 欧美网站一区二区| 久久精品www人人爽人人| 久久久久久毛片| 香蕉视频xxxx| 手机精品视频在线观看| 亚洲一区二区三区欧美| 韩国精品福利一区二区三区| 日韩美女在线观看| 免费污视频在线| 日韩中文字幕网址| 午夜视频福利在线| 欧美一区二区人人喊爽| 国产亚洲欧美日韩高清| 亚洲www啪成人一区二区麻豆| 手机看片国产日韩| 94色蜜桃网一区二区三区| 亚洲第一天堂久久| 久久中文字幕一区二区三区| 天堂8在线天堂资源bt| 亚洲丁香日韩| 国产精品美女xx| 热久久久久久| 欧美日韩一区二区三区在线| 波多野结衣综合网| 亚洲成人精品| 欧美在线视频全部完| 伦伦影院午夜理论片| 国产精品日韩精品欧美精品| 精品无码av无码免费专区| 台湾亚洲精品一区二区tv| 国产精品国色综合久久| 婷婷精品久久久久久久久久不卡| 国产精品久久一区主播| 日本免费一区二区六区| 久久久久国产视频| 18av在线播放| 久久精品视频在线| 草碰在线视频| 亚洲色无码播放| 日夜干在线视频| 亚洲第一区中文字幕| 黄色一级免费视频| 国产91免费看| 开心激情综合| 久久全国免费视频| 成人video亚洲精品| 日韩在线观看免费av| 国产一区二区影视| 亚洲精品中文字| 国产又爽又黄网站亚洲视频123| 精品国产在天天线2019| jlzzjlzzjlzz亚洲人| 欧美日韩国产123区| 在线免费观看国产精品| 日本乱码高清不卡字幕| 五月婷婷激情视频| 在线观看91精品国产入口| 亚洲成人av网址| 色婷婷亚洲精品| 激情五月色婷婷| 岛国av午夜精品| 日产精品久久久| 精品福利在线看| 国产精品999在线观看| 福利精品视频在线| 亚洲黄色免费观看| 欧美亚洲国产bt| 久久青青草视频| 精品成人av一区| 色av性av丰满av| 欧美视频在线观看一区| 亚洲视频一区二区三区四区| 777色狠狠一区二区三区| 中文字幕欧美色图| 欧美日韩国产大片| 精品国产一级片| 亚洲成人久久一区| 免费a在线观看| 深夜福利一区二区| 成人免费看片| 久久久久久久久中文字幕| 伊人久久视频| 国产精品日韩一区| 免费一级欧美在线大片| 中文字幕精品一区久久久久| 亚洲xxxx视频| 好男人www社区| 人妻 日韩精品 中文字幕| www555久久| 一区二区三区美女| 欧美日韩偷拍视频| 亚洲在线视频免费观看| 超碰超碰超碰超碰| 色www精品视频在线观看| 在线观看av大片| 欧美精品一区二区久久婷婷| 免费播放片a高清在线观看| 久久精品91久久香蕉加勒比| 丁香高清在线观看完整电影视频| 国产99在线|中文| 精品国产一区二区三区性色av| 精品视频在线观看| 99久久99热这里只有精品| 欧美不卡在线播放| 另类av一区二区| 一级日本黄色片| 高清日韩电视剧大全免费| 人与嘼交av免费| 亚洲一区中文日韩| 国产免费a视频| 欧美成人一区二区三区在线观看| 国产在线自天天| 欧美激情aaaa| 天天综合91| 91精品福利在线一区二区三区 | 蜜臀精品一区二区三区在线观看 | 日本韩国一区二区三区| 精品久久国产视频| 在线观看免费高清视频97| av在线不卡免费| 91网站免费看| 精品人人人人| 五月天在线免费视频| 欧美aⅴ一区二区三区视频| 欧美精品欧美极品欧美激情| 亚洲男帅同性gay1069| 日韩久久久久久久久久| 日韩精品免费视频| 久草在线视频资源| 国产z一区二区三区| 国产精品一线| 亚洲精品一区二区三| 久久精品国语| 免费中文字幕av| 可以看av的网站久久看| 色噜噜色狠狠狠狠狠综合色一| 欧美激情无毛| 五月激情五月婷婷| 国产精品麻豆视频| 自拍偷拍色综合| 免费高清在线视频一区·| 最新国产精品久久| 日本午夜一本久久久综合| 右手影院亚洲欧美| 欧美日韩在线视频一区二区| 亚洲国产福利视频| 欧美理论电影在线播放| 成人国产精品| 亚洲成人自拍| 蜜桃视频在线观看一区二区| 国产真实乱人偷精品人妻| 色久综合一二码| 国产在线色视频| 热草久综合在线| 日本三级久久| 97xxxxx| 99精品视频一区| 国产激情av在线| 在线观看免费一区| 蜜芽在线免费观看| 成人h视频在线观看| 亚洲精一区二区三区| 精品少妇一区二区三区免费观| 精品视频在线看| 神马午夜伦理不卡| 久久久久久一区| 麻豆精品精品国产自在97香蕉| 日韩福利小视频| 欧美精品一区二区精品网| 一呦二呦三呦精品国产| 三年中文高清在线观看第6集| 懂色中文一区二区在线播放| 9i看片成人免费看片| 久久精品国产v日韩v亚洲 | av资源一区二区| 国产精品嫩草99av在线| 天天爽天天爽天天爽| 精品久久久久久无| 日韩久久一区二区三区| 91av视频在线| 欧美一区二区三区不卡视频| 91.com在线观看| 国产伦理精品| 国产成年人在线观看|