久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

Android仿抖音右滑清屏左滑列表功能的實現代碼

瀏覽:159日期:2022-06-06 18:22:45

概述

​ 項目中要實現仿抖音直播間滑動清屏,側滑列表的功能,在此記錄下實現過程和踩坑記錄希望避免大家走些彎路,也當作自己的一個總結

​ 首先看下Demo中的效果

Android仿抖音右滑清屏左滑列表功能的實現代碼

​ 閱讀文章需要提前熟悉些事件分發的內容,相信大家都已經了解過了,網上也有很多優秀的文章,這里推薦兩篇自己讀過印象較深的文章

https://www.jb51.net/article/124249.htm

https://www.jb51.net/article/124861.htm

關于這方面的知識,在Android中是再重要不過的了,是遲早都要掌握的知識,所以還是希望大家都能提早掌握,最好可以跟著源碼一起分析,理解掌握的更深刻一點

實踐

所以網上基于這部分內容講解已經很詳細了,這里就不再搬磚了,主要分享一下自己項目中結合這部分知識運用過程中產生的一些想法和經驗,解決的一些bug

Android仿抖音右滑清屏左滑列表功能的實現代碼

以上就是功能在實現過程中要解決的問題,下面詳細展開

1. 布局結構

​ 布局結構始終是界面設計時首先要考慮的一個問題,從接到一個需求開始,首先要根據項目中現有的布局結構,考慮如何更優雅的嵌入布局層次。如果一不小心,走上了錯誤的實現道路,那么不好意思,即使功能最后實現了,到了后期,也有千萬種理由迫使你不得不走上重構的道路。

​ 比如實現不合理,導致的布局結構復雜,嵌套冗余層次,比如代碼業務邏輯處理復雜蹩腳,比如資源浪費,內存消耗過多等等。雖然功能好使,使用起來也沒有差別,但是,作為一個有追求的程序員,我們還是要避免這種情況的發生不是嗎

不巧的是,本文就屬于上述踩坑記錄,下面詳細分析

1.1 初步實現

​ 上來以后,思路很直接明了的去想要實現清屏和滑屏的功能是每個房間都有的功能,每個房間又都是一個RecyclerView 的一個Item。所以,很明顯在Item的布局上包一層,實現清屏和側滑列表的功能就可以了,這樣每個房間都可以上下滑,切換房間。切換以后,滑屏的功能是在每個房間里的,互不影響,所以很好理解

我們項目中實現直播間上下滑切換的功能是RecyclerView + 自定義LinearLayoutManager實現的,這部分內容網上demo很多,就不展開了

​ 具體實施,是自定義布局繼承RelativeLayout,解析自定義的布局文件,里面包含,直播間的房間布局,和自己右側滑塊兒布局,然后用自己實現的布局替換之前的房間Item布局位置

Android仿抖音右滑清屏左滑列表功能的實現代碼

由于我們自定義的Container布局是繼承子RelativeLayout實現的,內部三個子View 又全部是占滿父布局的,所以就是三層覆蓋的效果,類似抖音直播間效果 這里我們盡量將覆蓋層/清屏控件,封裝成一個ViewGroup 內部包含了上邊細分的各個子View,例如頭部個人信息,頭像列表等等;中間彈幕,SVGA禮物展示區域;底部聊天評論區域方便管理 還有右側滑塊我們也做成繼承自RelativeLayout形式,解析自定義布局,方便擴展

這樣我們調用封裝的Container將清屏控件,和右側滑塊兒布局View分別添加到內部即可

API提供如下

// 添加需要清屏的view fun addClearViews(vararg views: View?) // 添加需要滑入的view fun addSlideView(view: RightSlideLayout)

這樣我們在視頻播放頁面滑動,就可以在Container內判斷手勢,處理清屏控件或者滑出右側滑塊兒了

右側滑塊再動態加載Fragment,展示列表布局,基本完成功能效果了

1.2 重構

​ 本來以為開開心心的可以上線了,誰知到下邊繼續體驗和對比抖音到過程中還是發現不足:

第一個是,右側滑塊兒(后邊稱RightSlider)包含在房間,這樣上下切換房間(后邊稱Container),RightSlider布局也會隨著Container新建而新建,雖然有RecyclerView的布局緩存,但是至少也會新建Holder幾次,造成資源的浪費。第二個是,RightSlider的新建就會導致里邊的Fragment的新建,所以又會重新請求加載列表數據,再次造成資源浪費,而且,新建后右側列表又會重新頂到頭,之前滑動過的距離就會丟失。這樣就造成,用戶從右側列表點擊切換房間后,再次滑出RightSlider切換房間,發現又要從頭開始往下滑,這樣肯定不符合用戶體驗。觀察抖音列表后發現,每次滑動到固定位置點擊Item切換房間后,再次滑出滑塊兒,發現列表還是之前的位置,好像跟之前滑出的是一個滑塊兒的效果,于是恍然大悟,滑塊兒是跟Activity綁定的,也就是要把RightSlider放在跟Activity布局那一層

​ 其實提出RightSlider到外層的過程中,還是走了不少彎路,因為之前畢竟已經實現好的邏輯,如果改動布局結構,肯定要重寫滑動沖突、事件分發這部分代碼,工作量又不可預計。所以想著能不能不動布局結構的情況下實現仿抖音效果

動態替換Fragment

​ 首先想到的是滑出RightSlider里的列表每次都好像是同一個,那么保證里邊的Fragment是同一個不就好了,滑出的滑塊兒雖然不同,但是里邊裝載的Fragment列表是同一個,這樣就營造出同一個滑塊兒的效果。

​ 但是實現過程中還是出現了問題,由于RecyclerView的預加載功能,導致我們項目中,從第一個房間上滑到下一個房間,過程中會新建兩個Holder,這樣Fragment替換就出了問題,切換房間后Fragment添加不上去,折騰一下午后最終放棄這個方案

固定List高度

​ 然后想的,既然Fragment替換不了了,那么RecyclerView肯定不是同一個了,如果點擊后記錄當前RecyclerView滑動的位置,下次滑出時,代碼固定到當前位置不是也可以偽造出同一個滑塊兒的效果嘛,這部分也去找了一些資料,實現了個小demo。其中用到的主要方法是

/** * 獲取滑動距離 */ fun getScollYDistance(): Int { // 獲取recyclerview 的layoutManagerval layoutManager = recyclerView.layoutManager as LinearLayoutManager// 獲取當前第一個可見View的位置val position = layoutManager.findFirstVisibleItemPosition()// 根據position 獲取當前Viewval firstVisiableChildView = layoutManager.findViewByPosition(position)// 獲取當前View 高度val itemHeight = firstVisiableChildView.height// 滑動距離return position * itemHeight - firstVisiableChildView.top }

滑動距離計算的思想是:根據當前可見View 的position * 每個ItemView 的高度 + 當前View已經滑出去的部分

Android仿抖音右滑清屏左滑列表功能的實現代碼

​ 計算出高度后,每次加載時,調用RecyclerView的API

recyclerView.scrollBy(0,scroll) //scroll 剛才計算的高度

還有其他幾個滑動的方法:

// 帶動畫移動距離public void smoothScrollBy(int dx, int dy)// 帶動畫移動到positionpublic void smoothScrollToPosition(int position)// 移動到adapter position ,由LayoutManager實現public void scrollToPosition(int position)// 空實現,無效public void scrollTo(int x, int y)

原理上可以實現,但是最后綜合比較還是放棄了這種方式,因為總感覺這種方法屬于投機取巧不是正道,還是老老實實將RightSlider 提到外面得了

2. 動畫

​ 動畫也是這個功能中很重要的一個方面,因為動畫效果的流暢直接影響了用戶體驗,所以這方面也是細扣了很久。首先這個功能主要分成三個動畫效果:

2.1 進場出場

​ 包含清屏控件入場、出場:

mClearAnimator = ValueAnimator.ofFloat(0f, 1.0f).setDuration(300)mClearAnimator.addUpdateListener(ValueAnimator.AnimatorUpdateListener { valueAnimator -> val value = valueAnimator.animatedValue as Float translateClearChild((startX + value * (endX - startX)).toInt())})mClearAnimator.addListener(object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) {isCleared = !isCleared }})

這里使用了屬性動畫ValueAnimator,其中 translateClearChild 負責移動View 代碼如下:

/** * 移動清屏控件 */ private fun translateClearChild(translate: Int) {for (i in mClearViews.indices) { mClearViews[i].translationX = translate.toFloat()} }

​ 滑塊兒的入場、出場:

mSlideInAnimator = ValueAnimator.ofFloat(0f, 1.0f).setDuration(500)// 設置減速攔截器mSlideInAnimator.interpolator = DecelerateInterpolator(3f)mSlideInAnimator.addUpdateListener(ValueAnimator.AnimatorUpdateListener { valueAnimator -> val value = valueAnimator.animatedValue as Float translateSlideView((startX + value * (endX - startX)).toInt())})mSlideInAnimator.addListener(object : AnimatorListenerAdapter() { override fun onAnimationStart(animation: Animator) {mSlideView!!.visibility = View.VISIBLEmBgColorView.isClickable = true } override fun onAnimationEnd(animation: Animator) {if (!isSlideShow && translateX == 0) { isSlideShow = !isSlideShow} else if (isSlideShow && abs(translateX) == width - mSlideView!!.paddingLeft) { isSlideShow = !isSlideShow}if (!isSlideShow) { parent.requestDisallowInterceptTouchEvent(false) mSlideView!!.visibility = View.GONE removeView(mBgColorView) addView(mBgColorView, childCount - 4)}isSliderGoning = false }})

這里startX,endX 分別代表入場和出場時候,動畫起止位置。由于清屏控件沒有中間位置狀態,直接是從0 到屏幕寬度兩個值之間替換;而滑塊兒中間由于要跟隨手勢移動,所以要記錄中間translateX,標記為startX

2.2 跟隨手勢

​ 跟隨手勢實現主要是攔截移動手勢,根據按下手勢位置坐標和Move移動位置坐標的差值,調用移動SliderView的方法

val x = event.rawX.toInt()// 標記移動距離val offsetX = x - mDownXwhen (event.action) { MotionEvent.ACTION_MOVE -> {if ((isSlideShow) && offsetX > 0 && mSlideInAnimator.isRunning && !isSliderGoning) { // 滑入情況下,向右滑一段松開,再向右滑,清除回彈動畫,跟隨手勢 mSlideInAnimator.cancel() translateSlideView(offsetX)}if ((isSlideShow) && offsetX > 0 && !mSlideInAnimator.isRunning) { // 滑入情況下,向右滑,跟隨手勢 translateSlideView(offsetX)}return true } }

2.3 顏色漸變

​ 跟隨手勢滑動過程中還伴隨的左側空白區域顏色漸變,這部分可以在RightSlider移動過程中的距離值關聯起來,設置起始顏色透明和截止顏色灰色蒙層。再根據距離動態算出當前顏色在區間范圍內取值,主要代碼邏輯如下

/** * 移動滑塊兒 */ private fun translateSlideView(translate: Int) {val percent = (mSlideView!!.width.toFloat() - translate) / mSlideView!!.width// 根據百分比算出色值val color = (MASK_DARK_COLOR * percent).toInt() shl 24// 動態設置背景色漸變mBgColorView.setBackgroundColor(color)translateX = translatemSlideView!!.translationX = translate.toFloat() }

3 事件分發

​ 這部分可以說是本功能實現的核心,也是耗費了相當時間的精力,從最開始的Container包含RightSlider布局處理經典的事件分發順序,到最后重構布局,將RightSlider提到外層變成不是包含關系,而是并列或者說是覆蓋關系,中間對事件傳遞的順序理解又深入了一層

3.1 傳遞順序

​ 重構之前的布局結構是每個Container包含了一個RightSlider,兩個是一個整體使用的,滑動的邏輯都可以在Container層內的onInterceptTouchEvent方法內處理。判斷是否攔截事件即可,然后RightSlider內想要禁止父層Container攔截事件,可以使用parent.requestDisallowInterceptTouchEvent(true)禁止父層攔截;是屬于經典模式的事件分發模型,事件分發的順序在一個U型結構里,比較好處理

​ 然后重構以后布局結構變成了如下圖所示

Android仿抖音右滑清屏左滑列表功能的實現代碼

​ 每個Container 共用一個RightSlider,這樣屬于事件的分發處理不在一個ViewGroup的U型模型里了,這樣的分發順序也是屬于自己的一個大膽嘗試,想著實在不行,還是要把Activity內布局包一層,將Container和RightSlider 放在一個U型結構里去處理。

​ 還好最后不斷踩坑,終于實現了事件從Activity分發,到RightSlider,再分發到Container的過程

​ 這里貼下Demo里的布局實現:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:app='http://schemas.android.com/apk/res-auto' xmlns:tools='http://schemas.android.com/tools' android:layout_width='match_parent' android:layout_height='match_parent' android:background='@mipmap/bg' tools:context='.MainActivity'> <com.fxf.slide.SlideContainerLayoutandroid:id='@+id/layout_slider_container'android:layout_width='match_parent'android:layout_height='match_parent'><LinearLayout android:id='@+id/ll12' android:layout_width='match_parent' android:layout_height='200dp' android:layout_gravity='center_horizontal' android:layout_marginTop='100dp' android:background='#00f' android:orientation='vertical'> <TextViewandroid:id='@+id/tv111'android:layout_width='wrap_content'android:layout_height='wrap_content'android:text='111111111'android:textColor='#fff' /> <TextViewandroid:layout_width='wrap_content'android:layout_height='wrap_content'android:text='222222222'android:textColor='#fff' /></LinearLayout> </com.fxf.slide.SlideContainerLayout> <com.fxf.slide.RightSlideLayoutandroid:id='@+id/layout_right_slider'android:layout_width='match_parent'android:layout_height='match_parent'android:paddingLeft='60dp'android:visibility='gone'><RelativeLayout android:layout_width='match_parent' android:layout_height='match_parent' android:background='@drawable/shape_slider_background'> <Viewandroid:id='@+id/live_slide_bar'android:layout_width='4.5dp'android:layout_height='90dp'android:layout_centerVertical='true'android:layout_marginLeft='5dp'android:layout_marginRight='5dp'android:background='@drawable/shape_slider_dark_bar' /> <FrameLayoutandroid:id='@+id/list_fragment'android:layout_width='match_parent'android:layout_height='match_parent'android:layout_toRightOf='@+id/live_slide_bar' /></RelativeLayout> </com.fxf.slide.RightSlideLayout></androidx.constraintlayout.widget.ConstraintLayout>

其中做了部分簡化,主要幫助大家理解布局層次

​ 然后貼下RightSlider核心分發代碼:

override fun dispatchTouchEvent(event: MotionEvent): Boolean {// 獲取坐標,這里用rawX 相對屏幕絕對位置,不然隨手勢移動過程中父布局的移動,導致獲取的坐標左右抖動,會出現移動過程中左右一直抖動現象val x = event.rawX.toInt()val y = event.rawY.toInt()// X方向位移val offsetX = x - mDownXif (!mSlideContainerLayout.isSlideShow){// Container滑塊兒沒滑出來不分發事件 return false}when (event.action) { MotionEvent.ACTION_DOWN -> { // 記錄按下點坐標mDownX = xmDownY = ymSlideContainerLayout.setDownXY(mDownX,mDownY) } MotionEvent.ACTION_MOVE -> if (abs(x - mDownX) < abs(y - mDownY) && paddingLeft < x) { // 上下滑動情況處理if (isSlideHorizontal) { return mSlideContainerLayout.dispatchTouchEvent(event)} } else if ( offsetX < 0 && mSlideContainerLayout.isAlignLeftSide()) { // 向左滑動,滑塊兒已經靠最左邊了,不分發return super.dispatchTouchEvent(event) } else if (abs(x - mDownX) > abs(y - mDownY)){ // 水平方向移動,分發事件isSlideHorizontal = true return mSlideContainerLayout.dispatchTouchEvent(event)// 事件傳遞給Container處理 } MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL ->{ // 抬起時處理if (offsetX < 0 && mSlideContainerLayout.isAlignLeftSide()){ return super.dispatchTouchEvent(event)}if (abs(x - mDownX) > abs(y - mDownY) || isSlideHorizontal){ isSlideHorizontal = false return mSlideContainerLayout.dispatchTouchEvent(event)}isSlideHorizontal = false }}return super.dispatchTouchEvent(event) }

3.2 滑動沖突

因為房間是可以上下滑動的,所以可以判斷如果滑塊兒沒滑粗來時,直接返回分發,不讓RightSlider和Container處理事件

if (!mSlideContainerLayout.isSlideShow){ return false }

然后滑塊兒滑出來以后,因為里邊有列表,所以要消費上下滑動事件,可以處理如下:

MotionEvent.ACTION_MOVE -> if (abs(x - mDownX) < abs(y - mDownY) && paddingLeft < x) {if (isSlideHorizontal) { return mSlideContainerLayout.dispatchTouchEvent(event)} }

其中paddingLeft < x 是因為滑塊左邊有一部分空白區域 paddingLeft ,所以當x坐標在此區域右側時才處理事件

Container動畫執行過程中,說明正在消費事件,此時禁止父層攔截事件

if (mClearAnimator.isRunning || mSlideInAnimator.isRunning || isSlideShow) { // 滑入情況下,禁止上下滑切換直播間 parent.requestDisallowInterceptTouchEvent(true) }

Container處理事件時候和直播間上的進入房間頭像列表沖突,解決方法是判斷mDownY 大于進入頭像列表高度時才處理事件,因為正常人滑入滑塊都是在屏幕中下部操作的,所以太靠上的部分不處理事件也可以接受

MotionEvent.ACTION_MOVE -> {if (!mClearAnimator.isRunning && mDownY > 200 && abs(x - mDownX) > abs(y - mDownY)) { // 清屏不在執行時 && 高度大于200dp(解決進入房間頭像滑動沖突)&& 橫向滑動時攔截事件 if (abs(x - mDownX) > 10) {return true }} }

3.3 滑動優化

​ 這部分有很多細節處理的地方,包括動畫執行到一半情況下,再次左右滑動,先向左后向右,左右滑一半再上下滑等等各種情況具體可以看代碼中SlideContainerLayout中onTouchEvent方法內處理邏輯,都添加了注釋

override fun onTouchEvent(event: MotionEvent): Boolean {mVelocityTracker!!.addMovement(event)val x = event.rawX.toInt()val offsetX = x - mDownXif (mLastOffsetList.size > 2){ mLastOffsetList.removeFirst()}mLastOffsetList.add(offsetX)var slideRight = (offsetX - mLastOffsetList.first) > 0when (event.action) { MotionEvent.ACTION_MOVE -> {if ((isSlideShow) && offsetX > 0 && mSlideInAnimator.isRunning && !isSliderGoning) { // 滑入情況下,向右滑一段松開,再向右滑,清除回彈動畫,跟隨手勢 mSlideInAnimator.cancel() translateSlideView(offsetX)}if ((isSlideShow) && offsetX > 0 && !mSlideInAnimator.isRunning) { // 滑入情況下,向右滑,跟隨手勢 translateSlideView(offsetX)}return true } MotionEvent.ACTION_UP -> {mVelocityTracker!!.computeCurrentVelocity(10)if (isSlideShow && offsetX > 0 && abs(offsetX) > width / 3 && !isSliderGoning && mVelocityTracker!!.xVelocity >= 0) { // 滑入情況下,向右滑距離超過寬度1/3,滑出滑塊 startX = offsetX endX = width - mSlideView!!.paddingLeft isSliderGoning = true mSlideInAnimator.start() return true}if (abs(mVelocityTracker!!.xVelocity) > 1) { if (isCleared && offsetX < 0) {// 清屏情況下,左滑速度超過10個像素時 ===》滑入清屏控件layerShowWithAnim() } else if (!isCleared && offsetX > 0 && !isSlideShow && !mSlideInAnimator.isRunning) {// 未清屏 && 向右速度 > 10 && 沒滑入滑塊 && 滑塊動畫沒執行的時候 ===》清屏layerGoneWithAnim() } else if (isSlideShow && offsetX > 0 && slideRight) {// 滑入情況下 && 向右速度 > 10 ===》滑出滑塊mSlideInAnimator.cancel()isSliderGoning = truestartX = translateXendX = width - mSlideView!!.paddingLeftmSlideInAnimator.start() } else if (isSlideShow && offsetX < 0 && translateX != 0) {// 滑入情況下 && 向左速度 > 10 && 已經向右滑動了一段距離 ===》 滑塊回彈startX = translateXendX = 0mSlideInAnimator.start() } else if (!isSlideShow && offsetX < 0 && !mSlideInAnimator.isRunning) {// 沒滑入情況下 && 向左滑速度 > 10 && 沒右正在滑入情況下 ===》 滑入滑塊sliderShowWithAnim() } else {if (isSlideShow && translateX != 0) { // 滑入情況下 && 已經向右滑動過,速度沒達到松開 ===》回彈 startX = translateX mSlideInAnimator.start()} }}else { if (isSlideShow && translateX != 0) {// 滑入情況下 && 已經向右滑動過,速度沒達到松開 ===》回彈startX = translateXmSlideInAnimator.start() }}return super.onTouchEvent(event) } MotionEvent.ACTION_CANCEL -> {if (isSlideShow) { //取消事件時,滑入情況下回彈 startX = translateX mSlideInAnimator.start()} }}return super.onTouchEvent(event) }

總結

​ 最后通過這次實踐,感觸比較深的是功能實現之前,一定要做好充分的調研,研究好需求的細節,并預先想幾種實現策略,對比哪一種更合理。不要埋頭就寫,結果最后發現不符合需求還要重構

​ 感謝,這里Contanier內的邏輯主要參考了gitHub上[這篇文章](https://github.com/lmxjw3/clearscreen )的處理不過里邊處理滑動沖突的邏輯比較少還是要自己結合項目處理

奉上GitHub 項目地址

項目地址

總結

到此這篇關于Android仿抖音右滑清屏左滑列表功能的實現代碼的文章就介紹到這了,更多相關android 抖音右滑清屏左滑列表內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: 抖音
相關文章:
主站蜘蛛池模板: 亚洲97 | 欧美日韩国产高清视频 | 成人久久18免费观看 | 日韩精品一区二区三区四区 | 久久国产传媒 | 色综合一区二区三区 | 国产一区二区观看 | 99久久99| av一二三区 | 在线观看国产wwwa级羞羞视频 | 国产精品久久久久久妇女6080 | 欧美国产精品一区二区 | 亚洲区视频在线 | 美日一级毛片 | 国产中文视频 | ririsao久久精品一区 | 一区日韩 | 精品免费视频 | 久草网站 | 成人三级网址 | 国产一区久久 | 成人免费一区二区三区视频网站 | 亚洲国产欧美在线 | av中文字幕在线播放 | 欧美一级h | 日韩av在线不卡 | 欧美福利一区二区三区 | 亚洲伊人网站 | 9999久久久久| 91高清视频在线观看 | 一区二区三区影院 | 久久99操| 日韩成人影院 | 日韩视频在线观看一区 | 在线观看免费av网 | 亚洲成人一区二区 | 懂色中文一区二区在线播放 | 亚洲国产二区 | 中文字幕免费视频观看 | 久久狠狠 | 久草高清在线 | 精品 99| 九色一区| 国产成人 综合 亚洲 | 色8久久 | 特级做a爰片毛片免费看108 | 久热中文在线 | 国产精品九九九 | 噜噜噜视频在线观看 | 午夜视频一区 | 欧美日韩第一页 | 久久精品久久久久久久久久久久久 | 亚洲国产精品va在线看黑人 | 亚洲综合色自拍一区 | 欧美日韩在线第一页 | av电影一区二区 | 91色乱码一区二区三区 | 国产精品久久久久久久久久久新郎 | 视频一区二区国产 | 亚洲欧美一区二区三区在线 | 成人av入口| 一级片免费在线 | 午夜影院免费体验区 | 理论片87福利理论电影 | 日本天天操 | 99久久婷婷国产综合精品电影 | 日韩综合一区二区 | 91一区在线 | 欧美国产视频 | 91精品久久久久久久久 | 欧美日韩中文字幕在线 | 精品一区二区三区蜜桃 | 日韩欧美高清视频 | 亚洲免费视频在线 | 欧美综合视频在线观看 | 亚洲成人久久久 | 第一福利丝瓜av导航 | 永久黄网站色视频免费 | 中文字幕在线免费 | 国产一区二区三区四 | 一级毛片色一级 | 天天操网 | 精品成人久久 | 日韩视频在线观看 | 99国产视频| 成人免费久久 | 国产男女做爰免费网站 | 国产精品久久精品 | 精品久久网 | 美女视频一区 | 精品一区二区三区久久 | 成人国产精品一级毛片视频 | 日韩精品在线观看视频 | 成人性生交大片免费看中文带字幕 | 黑人av| а天堂中文官网 | 久久成人免费视频 | 91av原创| 欧美午夜一区 | 久久久国产精品视频 | 久久99精品久久久久子伦 | 欧美视频免费 | 亚洲精品影院 | 女人爽到高潮aaaa电影 | 91极品国产| 久久精品亚洲精品 | 在线一区视频 | 精品国产一区二区三区不卡蜜臂 | 国产精品人人做人人爽 | 亚州视频在线 | 久久久久久国产精品 | 91精品一区二区 | 一区在线视频观看 | 99r精品在线 | 精品专区| 亚洲午夜在线 | 羞羞视频免费网站 | 久久天天躁狠狠躁夜夜躁2014 | 一区二区日本 | 青娱乐国产视频 | 午夜精品久久久久久久久久久久久 | 国产精品18久久久久久首页狼 | 国产黄色大片 | 国产综合一区二区 | 精品香蕉一区二区三区 | 国产激情在线视频 | 日韩欧美在线观看视频 | 91精品一区二区三区久久久久久 | 一区二区三区日本 | 国产精品久久av | 国产xxx护士爽免费看 | 国产羞羞视频 | 色就是色网站 | 日本激情在线 | 久久国 | www婷婷| 欧美成人手机在线 | 精品一区二区在线观看 | 欧美日韩中文国产一区发布 | 国产男女免费视频 | 亚洲免费视频网址 | h色视频在线观看 | 宅男lu666噜噜噜在线观看 | 午夜资源 | 欧洲毛片| 欧美一级精品片在线看 | 国内精品成人 | 久久久国产一区二区三区 | 久久一精品 | 日本一区二区不卡 | 国产成人精品一区二区三区四区 | 欧美专区在线 | 2018天天操夜夜操 | 成人男女激情免费视频 | 国产精品毛片一区二区在线看 | 精品国产乱码一区二区三区 | 色偷偷噜噜噜亚洲男人 | 国产一级特黄毛片在线毛片 | 国产精品不卡 | 久久一二三区 | www.中文字幕 | 高清成人 | 国产精品国产三级国产aⅴ无密码 | 美女久久久 | 成人一区二区三区 | 欧美成人高清视频 | 不卡一区二区三区四区 | 一二三四区视频在线观看 | 久久人人av | 日本精品在线 | 激情久久久久 | 亚洲一级黄色 | 免费成人高清在线视频 | 国产综合亚洲精品一区二 | 日韩天堂| 日韩视频精品在线 | 亚洲欧美日韩天堂 | 蜜桃视频在线观看www社区 | 久久视频精品 | 欧美在线视频一区二区 | 91免费看片网站 | 国产精品免费看 | 黄色地址 | 精品免费视频 | 亚洲啊v | 亚洲一区二区中文字幕 | 国产色在线 | 一区二区三区四区在线 | 欧美久久一级特黄毛片 | 国产三区在线视频 | 色性网| 99精品全国免费观看视频软件 | 精品成人佐山爱一区二区 | 成人观看免费视频 | 欧美精品一区二区三区在线 | 国产精品久久久久久久久久久新郎 | 久久精品在线视频 | 欧美日韩一区二区在线观看 | 国产免费av网站 | 日韩在线播放一区二区 | 国产一级片播放 | 一区二区三区在线 | 中文字幕在线观看一区二区三区 | 久久久久久国产精品 | 在线观看精品自拍私拍 | 视频福利一区 | 国产免费一区二区 | 99久久精品免费 | 自拍偷拍视频网站 | 国产精品久久免费视频 | 国产视频一区二区三区四区 | 免费午夜视频 | 国产日韩欧美一区二区在线观看 | 在线观看你懂的视频 | 亚洲国产精品综合久久久 | 国产精品国产精品国产专区不片 | 亚洲 欧美 精品 | 三级视频在线观看 | 91色视频在线观看 | 黄色网址av | 精品日韩在线 | 日韩在线视频一区 | 欧美一级黄色片网站 | 国产精品久久久久久久午夜片 | 日韩视频免费看 | 激情一区 | 国产成人精品av | 涩涩视频在线看 | 日韩一区二区三区在线播放 | 日韩最新网址 | 欧美日韩精品一区二区 | 国产视频一区二区 | 一级女性全黄久久生活片免费 | 性视频网站免费 | 九九在线视频 | 国产精品久久av | 日韩av一区二区在线观看 | 欧美日韩国产在线播放 | 国产日韩精品一区二区 | 亚洲三级在线观看 | 国产一区二区三区久久久久久久久 | 人人澡人人草 | 国产高清在线精品一区二区三区 | 日韩精品一区二区三区中文字幕 | 亚洲精品久久久久久一区二区 | 色综合免费 | av中文字幕在线播放 | 日产一区二区 | 国产欧美在线 | 亚洲免费一区二区 | 久久久精品亚洲 | 日韩国产欧美一区 | 不卡在线一区 | 天堂影院一区二区 | 日韩一片 | 日本一区二区三区视频免费看 | 91一区二区 | 影视在线观看 | 欧美污污 | 91影院 | 免费黄色毛片视频 | 久久亚洲精品国产一区 | 久草成人 | 91婷婷射| 久久亚洲精品裙底抄底 | 99re免费视频精品全部 | 国产91精品在线 | 四虎影院最新网站 | 久视频在线观看 | 欧美日韩国产在线 | 色综合久久久久久久久久久 | 欧美一区二区三区在线 | 狠狠操夜夜操天天操 | 玖玖玖视频| 国产欧美综合一区二区三区 | 国产成人视屏 | 久久久精品影院 | 成人高清视频在线观看 | 中文字幕91| 亚洲精品一区二区 | 伊人激情av一区二区三区 | 波多野结衣一区在线观看 | 久草在线视频网 | 国产成人精品久久 | 黄色a视频| 男女视频免费看 | 国产精品久久久久一区二区三区 | 国产精品一区二区av | 成人午夜毛片 | 国产中文字幕在线观看 | 国产精品欧美一区二区三区 | 天堂综合网 | 精品在线视频观看 | 在线小视频| 在线观看毛片网站 | 国产精品亚洲天堂 | 成人福利视频网 | 精品久久久久一区二区国产 | 日韩久久精品 | 日韩在线一区二区三区 | 午夜伦理影院 | 久久国产精品久久久久久 | www.色94色.com| 欧美亚洲国产一区 | 在线观看成人高清 | 日本在线观看网站 | 亚洲日本欧美日韩高观看 | 国产黄色大片 | 久久久久久久久久久久久九 | 日韩中文字幕一区二区 | 99re6在线 | 欧美精品a∨在线观看不卡 欧美日韩中文字幕在线播放 | 一区二区三区在线视频播放 | 国产一级免费视频 | 亚洲一区二区三区在线 | 亚洲欧美激情精品一区二区 | 久久6 | 日韩在线不卡一区 | 久久免费精品视频 | 国产成人精品久久二区二区91 | 亚洲一区二区三区四区的 | a黄视频 | 午夜激情福利视频 | 欧美在线一区二区三区 | 看毛片网站 | 欧美三级视频 | 国产精品久久在线观看 | 亚洲欧洲视频 | 美女又黄又免费 | 亚洲精品久久久一区二区三区 | 亚洲精彩视频在线观看 | 超碰人人爱 | 国产日韩欧美精品 | av成人在线观看 | 国产黄色在线观看 | 国产成人在线一区二区 | 成人一区二区三区在线观看 | 欧美wwwsss9999 | 在线视频国产一区 | 黄网在线免费观看 | 草草草久久久 | 欧美free性丝袜xxxxhd | 久久久久久久久久一区二区 | 玖玖精品 | 国产精品亚洲一区 | 91精品国产欧美一区二区成人 | 99re6在线视频精品免费 | 午夜影院免费版 | 另类免费视频 | 欧美第一页 | 久久激情综合 | 91黄在线观看| 三级视频网站 | 亚洲va中文字幕 | 久久99爱视频 | 在线视频成人永久免费 | 日本欧美国产 | 亚洲日本中文 | 日韩另类 | 久久成人免费视频 | 国产日韩欧美一区二区 | 91久久久www播放日本观看 | av综合站 | 夜夜夜操| 久久精品视频网站 | 日韩理伦片在线观看视频播放 | 欧美成人精品在线观看 | 午夜精品久久久久久久久久久久久 | 欧美一级在线 | 亚洲天堂电影网 | 一区二区三区免费在线 | 欧美日韩在线视频免费 | 无码日韩精品一区二区免费 | 欧美二三区 | 国产一区二区三区欧美 | 国产精品久久国产精品 | 欧美一级裸体视频 | 在线观看欧美一区二区三区 | 欧美 日韩 在线播放 | 91精品久久久久久久久久 | 午夜一区二区三区 | 欧美不卡一区二区三区 | 黄色大片视频网站 | 日韩一区二区三区在线视频 | 国内精品国产成人国产三级粉色 | 综合自拍偷拍 | 国产精品亚洲欧美日韩一区在线 | 国内成人免费视频 | 国产视频精品在线观看 | 欧美精品日韩 | 中文在线一区 | 狠狠操夜夜操天天操 | 国产伦精品一区二区三区高清 | 天天综合永久入口 | 欧美一区二区三区视频 | 亚洲视频在线观看 | 亚洲精品aaa | 亚洲成人伦理 | 亚洲福利一区二区 | 国产成人免费视频网站视频社区 | 在线a视频 | 国产色| 日韩精品免费视频 | 九九国产 | 欧美激情欧美激情在线五月 | 日韩免费网站 | 亚洲精品午夜aaa久久久 | 国内精品在线视频 | 成人av观看| 太平公主一级艳史播放高清 | 色一级| 亚洲一级毛片 | 拍拍无遮挡人做人爱视频免费观看 | 国产人成免费视频 | 国产精品第一国产精品 | 精品欧美黑人一区二区三区 | 精品国产一区二区国模嫣然 | av一区在线观看 | 成年人网站在线免费看 | 成人午夜在线 | 精品少妇一区二区三区日产乱码 | 最新黄色网址在线播放 | 中文字幕精品一区久久久久 | 91在线精品秘密一区二区 | 久久99深爱久久99精品 | 国产精品久久免费观看spa | 精品欧美日韩 | 中文字幕日韩在线 | 在线精品亚洲 | 国产高清在线精品一区二区三区 | 日韩三级视频 | 理论片87福利理论电影 | 亚洲一区二区三区四区五区午夜 | 成人日韩 | 亚洲一区二区视频 | 婷婷久久五月天 | 日韩毛片在线视频 | 成人精品国产一区二区4080 | 日韩国产精品视频 | 日韩一区二区三区在线 | 在线免费观看毛片 | 国外成人在线视频 | 精品国产高清一区二区三区 | 精品视频免费在线 | 欧美午夜精品久久久久久蜜 | 91久久 | 精品久久一二三区 | 操操操av| 国产在线观看二区 | 久久久精品 | 精品成人av | 欧美一区二区三区精品 | 色狠狠一区 | 亚洲一区二区三区爽爽爽爽爽 | 激情图区在线观看 | 欧美一级片在线 | 精品久久久久久久久久久 | 日韩一区电影 | 黄色片网站在线看 | 国产精品久久久久久久久久久久久 | 亚洲天天干 | 天堂中文视频在线观看 | 日韩在线看片 | 97久久精品午夜一区二区 | 亚洲高清电影 | 欧美二区三区 | 中国电影黄色一级片免费观看 | 亚洲人网站 | 久久久久国产一区 | 久久欧美高清二区三区 | av黄色在线免费观看 | 一区二区精品在线观看 | 免费看黄视频网站 | 视频一区二区中文字幕 | 国产精品欧美一区二区三区 | 99视频在线 | 国产精品中文字幕在线播放 | 中文字幕在线观看视频一区 | 一区自拍 | 亚洲一区视频 | 欧美一区在线看 | 久久久精品国产 | 午夜精品在线 | 欧美一区在线看 | 青青草av | 精品欧美一区二区在线观看视频 | 久久精品一区二区三区四区 | 欧美日韩视频网站 | 精品国产乱码久久久久久1区2区 | 成人午夜精品 | a中文在线视频 | 人人插人人干 | 亚洲精品一区中文字幕乱码 | 亚洲精品一区二区三区在线看 | av在线成人 | 精品久久国产 | 国产视频一区二区三区四区 | 日韩成人免费 | 国产精品成人国产乱一区 | 国产色| 日韩精品视频在线 | 日韩欧美视频一区 | 成人久久 | 激情久久久 | 亚洲性视频网站 | 欧美成年黄网站色视频 | 午夜免费福利影院 | 亚洲综合二区 | 国产精品不卡视频 | 久久伊人亚洲 | 中文字幕本久久精品一区 | 精品二三区 | 国产精品一区亚洲二区日本三区 | 日韩免费视频中文字幕 | 午夜在线小视频 | 亚洲免费视频网 | 午夜小电影 | 91精品视频在线播放 | jlzzxxxx18hd护士 | 黄在线免费观看 | 日韩成人在线视频 | 激情久久久久 | 欧美激情高清 | 黄网站免费在线 | 免费人成电影 | 久久国产一区视频 | 成年免费观看视频 | 久久国产视屏 | 奇米一区二区 | 欧美亚洲一区二区三区 | 精品一区在线 | 精品视频久久 | 日韩国产在线 | 高清成人 | 久久亚洲一区二区 | 日韩欧美在线视频播放 | 国产玖玖 | 国产一区二区三区四区在线观看 | 亚洲成人免费电影 | 久久九九视频 | 久久久精品国产 | 久久久久一区二区三区 | 日韩精品一二三 | 天天操夜夜操av | 亚洲视频一区二区三区四区 | 中字一区 | 欧美日韩一区二区三区在线观看 | 99精品久久久国产一区二区三 | 日韩一本 | h片在线 | 日本中文字幕一区二区 | 国产精品午夜电影 | 欧美成人影院在线 | 国产精品永久免费自在线观看 | www.you日本| 99精品久久 | 久久综合久久综合久久综合 | 欧美 亚洲 一区 | av片在线观看网站 | 午夜免费观看网站 | 国产精品久久久久久久久久99 | 亚洲资源站 | 久久一区二区三 | 欧美日韩一区二区在线 | 久精品视频 | 日韩欧美在线观看 | 黄色大片免费网址 | 中文字幕在线视频第一页 | 99久久精品一区二区成人 | 国产精品天天干 | 国产午夜精品福利 | 免费欧美视频 | 日本久久99| 四影虎影ww4hu55.com | 日本美女一区二区 | 国产精品国产 | 亚洲一区中文字幕 | 99精品国产在热久久 | 综合久久国产九一剧情麻豆 | 一区中文字幕 | 国产视频第一页 | 欧美日韩一区二区中文字幕 | 91综合网| 91精品国产日韩91久久久久久 | 久久婷婷国产麻豆91天堂 | 日本午夜在线 | 久久这里只有精品首页 | 91国产精品| 久草福利资源 | 国产视频久久久久久久 | 欧美99| 欧美成人在线免费观看 | 成人亚洲精品久久久久软件 | 国产一区二区视频在线 | av在线影院 | 超碰人人操| 99re在线视频| 色综久久| 国产精品69久久久久水密桃 | 一级视频在线观看 | 91九色视频在线 | 久久99久久99精品 | 日韩一区精品视频 | 在线看片日韩 | 日韩视频在线免费观看 | 视频一区二 | 91免费版在线观看 | www.成人国产 | 在线免费毛片 | 成人av播放 | 色综合久 | 黄色片在线免费看 | 国产一区在线不卡 | 欧日韩在线视频 | 国产在线小视频 |