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

HarmonyOS自定義控件之Material風格的下拉刷新

開發 前端 OpenHarmony
Ohos-MaterialRefreshLayout是一個自定義Material風格下拉刷新控件,支持設置水波紋效果,支持下拉刷新侵入式和非侵入式,初始化自動刷新及上滑加載更多,支持刷新頭部自定義圖案,上拉加載更多等。

[[420946]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

介紹

Ohos-MaterialRefreshLayout是一個自定義Material風格下拉刷新控件,支持設置水波紋效果,支持下拉刷新侵入式和非侵入式,初始化自動刷新及上滑加載更多,支持刷新頭部自定義圖案,上拉加載更多等。該控件一般配合ListContainer使用,因涉及事件分發操作,本庫中使用了三方控件NestedListContainer、事件分發等方便處理事件攔截分發事件。

效果圖:

自定義控件結構

MaterialRefreshLayout控件,首先初始化設置頭部、腳部布局,在手勢下滑時顯示頭部布局,動態設置頭部高度,展示下拉刷新效果,在頁面底部向上滑動時顯示腳部布局,展示上拉加載更多效果,松手時圖形即開始旋轉動畫。

下拉圓形轉動風格MaterialRefreshLayout

1.MaterialRefreshLayout包含自定義頭部布局MaterialHeaderView和腳部布局MaterialFooterView。

2.頭部MaterialHeaderView包含圓形轉動條CircleProgressBar和下拉波紋MaterialWaveView。

3.腳部布局MaterialFooterView同頭部結構一致,包含圓形轉動條CircleProgressBar和下拉波紋MaterialWaveView。

4.CircleProgressBar包含有自定義圖形的MaterialProgressDrawable,設置圓形的轉動圖案。

下拉自定義笑臉風格MaterialRefreshLayout

1.MaterialRefreshLayout包含SunLayout頭部布局和腳部布局MaterialFooterView。

2.SunLayout頭部包含滾動短線SunLineView和笑臉SunFaceView。

3.當有手勢下滑時,自定義短線SunLineView,開始旋轉動畫,監聽刷新動作,在onSizeChanged中動態改變圖形大小。

4.當手勢向下滑動時,自定義笑臉圖形SunFaceView,監聽刷新動作,在onSizeChanged中動態改變圖形大小。

代碼實現解讀

首先在攔截事件中根據手指的滑動距離,設置自定義頭部布局MaterialHeaderView可見,底部向上滑動時,當滑到頁面底部,設置腳部布局MaterialFooterView可見。

事件分發onInterceptTouchEvent中設置頭、腳布局可見

在攔截事件onInterceptTouchEvent中,手指移動TouchEvent.POINT_MOVE時,根據滑動距離及是否是在頭部的滑動,設置頭部自定義headerview是否顯示,再根據向上滑動距離是否小于0及是否滑動到底部加載底部footerview。代碼如下:

  1. case TouchEvent.POINT_MOVE: 
  2.             float currentY = ev.getPointerPosition(0).getY(); 
  3.             Float dy= new BigDecimal(currentY).subtract(new BigDecimal(mTouchY)).floatValue(); 
  4.             if (dy > 0 && !canChildScrollUp()) { 
  5.                 if (mMaterialHeaderView != null) { 
  6.                    mMaterialHeaderView.setVisibility(Component.VISIBLE); 
  7.                     mMaterialHeaderView.onBegin(this); 
  8.                 } else if (mSunLayout != null) { 
  9.                     mSunLayout.setVisibility(Component.VISIBLE); 
  10.                     mSunLayout.onBegin(this); 
  11.                 } 
  12.                 return true
  13.             } else if (dy < 0 && !canChildScrollDown() && isLoadMore) { 
  14.                 if (mMaterialFooterView != null && !isLoadMoreing) { 
  15.                     soveLoadMoreLogic(); 
  16.                 } 
  17.                 return false
  18.             } 
  19.             break; 

上一步完成后,緊接著就是在觸摸事件中動態設置頭部布局高度,水波紋高度,滑到最大距離時,設置為控件本身高度。

事件觸摸onTouchEvent中設置高度

在觸摸事件onTouchEvent中,當手指下滑,onTouchEvent中設置頭部自定義headerview的高度,隨著下滑距離增加,動態設置水波紋高度,當頭部為侵入式時,設置component向下平移。代碼如下:

  1. case TouchEvent.POINT_MOVE: 
  2.             mCurrentY = e.getPointerPosition(0).getY(); 
  3.             float dy = new BigDecimal(mCurrentY).subtract(new BigDecimal(mTouchY)).floatValue(); 
  4.             dy = Math.min(mWaveHeight * 2, dy); 
  5.             dy = Math.max(0, dy); 
  6.             if (mChildView != null) { 
  7.                 float offsetY = dy / 2; 
  8.                 float fraction = offsetY / mHeadHeight; 
  9.                 if (mMaterialHeaderView != null) { 
  10.                     mMaterialHeaderView.setHeight((int) offsetY); 
  11.                     mMaterialHeaderView.postLayout(); 
  12.                     mMaterialHeaderView.onPull(this, fraction); 
  13.                 } else if (mSunLayout != null) { 
  14.                     mSunLayout.setHeight((int) offsetY); 
  15.                     mSunLayout.postLayout(); 
  16.                     mSunLayout.startSunLineAnim(this); 
  17.                     mSunLayout.onPull(this, fraction); 
  18.                 } 
  19.                 if (!isOverlay) 
  20.                     mChildView.setTranslationY(offsetY); 
  21.             } 

在松手時,監聽抬起事件TouchEvent.PRIMARY_POINT_UP,當頭部headerview高度大于原有高度時,將頭部設置為刷新中狀態,代碼如下:

  1. if (mMaterialHeaderView.getLayoutConfig().height > mHeadHeight) { 
  2.     updateListener(); 
  3.     mMaterialHeaderView.setHeight((int) mHeadHeight); 
  4.     mMaterialHeaderView.postLayout(); 
  5. }  

再接下來就是完成自定義頭部控件的布局,并在下拉接口方法中設置下拉時的縮放,透明度等狀態。

自定義頭部MaterialHeaderView

自定義MaterialHeaderView由MaterialWaveView和CircleProgressBar兩個自定義Component組合成,實現MaterialHeadListener接口。

onBegin方法中設置materialWaveView的起始狀態,circleProgressBar縮放大小,透明度等。代碼如下:

  1. @Override 
  2. public void onBegin(MaterialRefreshLayout materialRefreshLayout) { 
  3.     if (materialWaveView != null) { 
  4.         materialWaveView.onBegin(materialRefreshLayout); 
  5.     } 
  6.     if (circleProgressBar != null) { 
  7.         circleProgressBar.setScaleX(0.001f); 
  8.         circleProgressBar.setScaleY(0.001f); 
  9.         circleProgressBar.onBegin(materialRefreshLayout); 
  10.     } 
  11.  } 

 onPull方法中設置materialWaveView的下拉狀態,circleProgressBar縮放大小,透明度等。代碼如下:

  1. @Override 
  2. public void onPull(MaterialRefreshLayout materialRefreshLayout, float fraction) { 
  3.     if (materialWaveView != null) { 
  4.         materialWaveView.onPull(materialRefreshLayout, fraction); 
  5.     } 
  6.     if (circleProgressBar != null) { 
  7.         circleProgressBar.onPull(materialRefreshLayout, fraction); 
  8.         float a = Util.limitValue(1, fraction); 
  9.         circleProgressBar.setScaleX(a); 
  10.         circleProgressBar.setScaleY(a); 
  11.         circleProgressBar.setAlpha(a); 
  12.     } 

 設置刷新中onRefreshing狀態。代碼如下:

  1. @Override 
  2. public void onRefreshing(MaterialRefreshLayout materialRefreshLayout) { 
  3.     if (materialWaveView != null) { 
  4.         materialWaveView.onRefreshing(materialRefreshLayout); 
  5.     } 
  6.     if (circleProgressBar != null) { 
  7.         circleProgressBar.onRefreshing(materialRefreshLayout); 
  8.     } 

 onComlete刷新完成后自定義Component的狀態初始化,代碼如下:

  1. @Override 
  2.  public void onComlete(MaterialRefreshLayout materialRefreshLayout) { 
  3.    if (materialWaveView != null) { 
  4.        materialWaveView.onComlete(materialRefreshLayout); 
  5.    } 
  6.    if (circleProgressBar != null) { 
  7.        circleProgressBar.onComlete(materialRefreshLayout); 
  8.        circleProgressBar.setTranslationY(0); 
  9.        circleProgressBar.setScaleX(0); 
  10.        circleProgressBar.setScaleY(0); 
  11.   } 

 頭部布局完成后,接下來就是實現自定義腳部布局實現。

自定義腳部MaterialFooterView

自定義MaterialFooterView由MaterialWaveView和CircleProgressBar兩個自定義Component組合成,實現MaterialHeadListener接口?;就琈aterialHeaderView一致,接口實現方法設置內容相同。

onBegin方法中設置materialWaveView的起始狀態,circleProgressBar縮放1,透明度等。代碼如下:

  1. @Override 
  2. public void onBegin(MaterialRefreshLayout materialRefreshLayout) { 
  3.     if (materialWaveView != null) { 
  4.         materialWaveView.onBegin(materialRefreshLayout); 
  5.     } 
  6.     if (circleProgressBar != null) { 
  7.         circleProgressBar.onBegin(materialRefreshLayout); 
  8.         circleProgressBar.setScaleX(1); 
  9.         circleProgressBar.setScaleY(1); 
  10.     } 

 onPull方法中設置materialWaveView的下拉狀態,circleProgressBar縮放1,透明度等。代碼如下:

  1. @Override 
  2. public void onPull(MaterialRefreshLayout materialRefreshLayout, float fraction) { 
  3.     if (materialWaveView != null) { 
  4.         materialWaveView.onPull(materialRefreshLayout, fraction); 
  5.     } 
  6.     if (circleProgressBar != null) { 
  7.         circleProgressBar.onPull(materialRefreshLayout, fraction); 
  8.         float a = Util.limitValue(1, fraction); 
  9.         circleProgressBar.setScaleX(1); 
  10.         circleProgressBar.setScaleY(1); 
  11.         circleProgressBar.setAlpha(a); 
  12.     } 

 設置刷新中onRefreshing狀態。代碼如下:

  1. @Override 
  2. public void onRefreshing(MaterialRefreshLayout materialRefreshLayout) { 
  3.     if (materialWaveView != null) { 
  4.         materialWaveView.onRefreshing(materialRefreshLayout); 
  5.     } 
  6.     if (circleProgressBar != null) { 
  7.         circleProgressBar.onRefreshing(materialRefreshLayout); 
  8.     } 

 onComlete刷新完成后自定義Component的狀態初始化,代碼如下:

  1. @Override 
  2. public void onComlete(MaterialRefreshLayout materialRefreshLayout) { 
  3.     if (materialWaveView != null) { 
  4.         materialWaveView.onComlete(materialRefreshLayout); 
  5.     } 
  6.     if (circleProgressBar != null) { 
  7.         circleProgressBar.onComlete(materialRefreshLayout); 
  8.         circleProgressBar.setTranslationY(0); 
  9.         circleProgressBar.setScaleX(0); 
  10.         circleProgressBar.setScaleY(0); 
  11.     } 

 頭部、腳部布局都完成后,就開始要完成頭部和腳部布局里面的自定義組件,首先從頭部布局中的自定義組件開始,前面講到頭部由圓形轉動條CircleProgressBar和下拉波紋MaterialWaveView組成,先開始繪制波浪紋MaterialWaveView,實現MaterialHeadListener接口,接口回調中設置組件的狀態。

自定義MaterialWaveView

初始化畫筆設置,添加addDrawTask任務,onDraw方法中繪制下拉區域圖形,并填充顏色,代碼如下:

  1. @Override 
  2. public void onDraw(Component component, Canvas canvas) { 
  3.     path.reset(); 
  4.     paint.setColor(new Color(color)); 
  5.     path.lineTo(0, headHeight); 
  6.     path.quadTo(getEstimatedWidth() / (float) 2, headHeight + waveHeight, getEstimatedWidth(), headHeight); 
  7.     path.lineTo(getEstimatedWidth(), 0); 
  8.     canvas.drawPath(path, paint); 

實現MaterialHeadListener接口,監聽各下拉方法的回調,當有下拉的情形時,改變下拉區域狀態。下拉時在onPull中,設置下拉區域header高度及wave高度。刷新中onRefreshing,加載數值動畫并動態改變wave高度。結束onComlete中,加載數值動畫動態改變head的高度。代碼如下:

下拉時:

  1. @Override 
  2. public void onPull(MaterialRefreshLayout br, float fraction) { 
  3.     setHeadHeight((int) (Util.dip2px(getContext(), DefaulHeadHeight) * Util.limitValue(1, fraction))); 
  4.     setWaveHeight((int) (Util.dip2px(getContext(), DefaulWaveHeight) * Math.max(0, new BigDecimal(fraction).subtract(new BigDecimal(1)).floatValue()))); 
  5.     invalidate(); 

 刷新時:

  1. @Override 
  2. public void onRefreshing(MaterialRefreshLayout br) { 
  3.     setHeadHeight((int) (Util.dip2px(getContext(), DefaulHeadHeight))); 
  4.     int waveHeight = getWaveHeight(); 
  5.     AnimatorValue animator = new AnimatorValue(); 
  6.     animator.setValueUpdateListener(new AnimatorValue.ValueUpdateListener() { 
  7.         @Override 
  8.         public void onUpdate(AnimatorValue animatorValue, float value) { 
  9.             setWaveHeight(getIntValue((1 - (double) value) * waveHeight)); 
  10.             invalidate(); 
  11.         } 
  12.     }); 
  13.     animator.setCurveType(Animator.CurveType.BOUNCE); 
  14.     animator.setDuration(200); 
  15.     animator.start(); 

 結束時: 

  1. @Override 
  2. public void onComlete(MaterialRefreshLayout br) { 
  3.     waveHeight = 0; 
  4.     AnimatorValue animator = new AnimatorValue(); 
  5.     animator.setDuration(200); 
  6.     animator.setValueUpdateListener(new AnimatorValue.ValueUpdateListener() { 
  7.         @Override 
  8.         public void onUpdate(AnimatorValue animatorValue, float value) { 
  9.             headHeight = getIntValue((1 - (double) value) * headHeight); 
  10.             invalidate(); 
  11.         } 
  12.     }); 
  13.     animator.start(); 

上一步完成后接下來開始實現頭部圓形轉動的CircleProgressBar,并設置圖案的自定義ShapeElement圖形,配合手勢操作,下拉時設置圖形動態大小,松手時旋轉刷新。

自定義CircleProgressBar

自定義圓形轉動CircleProgressBar,設置自定義背景MaterialProgressDrawable,實現MaterialHeadListener接口,根據下拉狀態設置圓形MaterialProgressDrawable旋轉角度,釋放手勢時開始動畫,結束后停止旋轉并初始化狀態等。代碼如下:

  1. @Override 
  2. public void onPull(MaterialRefreshLayout materialRefreshLayout, float fraction) { 
  3.     if (mProgressDrawable != null
  4.         mProgressDrawable.setProgressRotation(fraction); 
  5.     invalidate(); 
  6.  
  7. @Override 
  8. Public void onRefreshing(MaterialRefreshLayout materialRefreshLayout) { 
  9.     if (mProgressDrawable != null) { 
  10.         mProgressDrawable.onStart(); 
  11.     } 
  12.  
  13. @Override 
  14. public void onComlete(MaterialRefreshLayout materialRefreshLayout) { 
  15.     if (mProgressDrawable != null) { 
  16.         mProgressDrawable.onStop(); 
  17.     } 
  18.     setVisibility(Component.INVISIBLE); 

 自定義MaterialProgressDrawable設置CircleProgressBar的背景

首先構造方法中初始化圓形Ring和旋轉動畫,設置畫筆顏色,寬度,大小,在drawToCanvas中繪制圓形Ring, 當有手勢操作時調用onStart方法中的旋轉動畫,開始旋轉。在Ring類draw方法中,根據起始旋轉角度繪制圓形圈圈及三角箭頭,代碼如下:

  1. public void draw(Canvas c, Rect bounds) { 
  2.         final RectFloat arcBounds = mTempBounds; 
  3.         arcBounds.modify(bounds); 
  4.         arcBounds.left = new BigDecimal(arcBounds.left).add(new BigDecimal(mStrokeInset)).floatValue(); 
  5.         arcBounds.top = new BigDecimal(arcBounds.top).add(new BigDecimal(mStrokeInset)).floatValue(); 
  6.         arcBounds.right = new BigDecimal(arcBounds.right).subtract(new BigDecimal(mStrokeInset)).floatValue(); 
  7.         arcBounds.bottom = new BigDecimal(arcBounds.bottom).subtract(new BigDecimal(mStrokeInset)).floatValue(); 
  8.  
  9. ​        final float startAngle = new BigDecimal(mStartTrim).add(new BigDecimal(mRotation)).floatValue() * 360; 
  10. ​        final float endAngle = new BigDecimal(mEndTrim).add(new BigDecimal(mRotation)).floatValue() * 360; 
  11. ​        float sweepAngle = new BigDecimal(endAngle).subtract(new BigDecimal(startAngle)).floatValue(); 
  12.  
  13. ​        mPaint.setColor(Color.RED); 
  14. ​        c.drawArc(arcBounds, new Arc(startAngle, sweepAngle, false), mPaint); 
  15. ​        drawTriangle(c, startAngle, sweepAngle, bounds); 
  16.  
  17. ​        if (mAlpha < 255) { 
  18. ​            mCirclePaint.setColor(new Color(mBackgroundColor)); 
  19. ​            mCirclePaint.setAlpha(255 - mAlpha); 
  20. ​            c.drawCircle(bounds.getCenterX(), bounds.getCenterY(), bounds.getWidth() / (float) 2, 
  21. ​                    mCirclePaint); 
  22. ​        } 
  23. ​    } 

 上述基本上就完成了Material風格下拉刷新帶水波紋,帶轉動progressbar的實現步驟,緊接著講一講下拉自定義笑臉的另外一種刷新風格,實際上就是重新定義了刷新頭部的圖形,在這里也可以自己嘗試替換成其它不同的圖形。

自定義頭部SunLayout布局

自定義頭部SunLayout由SunFaceView和SunLineView組成,SunFaceView為自定義笑臉,SunLineView為自定義笑臉周圍短線。SunLayout實現了MaterialHeadListener接口,開始狀態onBegin時縮放從零到有,下拉onPull時,設置SunView和LineView的大小,縮放等。代碼如下:

自定義頭部SunLayout由SunFaceView和SunLineView組成,SunFaceView為自定義笑臉,SunLineView為自定義笑臉周圍短線。SunLayout實現了MaterialHeadListener接口,開始狀態onBegin時縮放從零到有,下拉onPull時,設置SunView和LineView的大小,縮放等。代碼如下:

開始時:

  1. @Override 
  2. public void onBegin(MaterialRefreshLayout materialRefreshLayout) { 
  3.     setScaleX(0.001f); 
  4.     setScaleY(0.001f); 

 下拉時:

  1. @Override 
  2. public void onPull(MaterialRefreshLayout materialRefreshLayout, float fraction) { 
  3.     float a = Util.limitValue(1, fraction); 
  4.     if (a >= 0.7) { 
  5.         mLineView.setVisibility(VISIBLE); 
  6.     } else { 
  7.         mLineView.setVisibility(HIDE); 
  8.     } 
  9.     mSunView.setPerView(mSunRadius, a); 
  10.     mLineView.setLineWidth(mLineWidth); 
  11.     setScaleX(a); 
  12.     setScaleY(a); 
  13.     setAlpha(a); 
  •  自定義笑臉SunFaceView
  • 自定義短線SunLineView

SunLineView繼承Component實現Component.DrawTask, Component.EstimateSizeListener接口,構造方法中初始化Paint,onEstimateSize中測量寬高,onDraw中繪制線條,代碼如下:

測量時:

  1. @Override 
  2. public boolean onEstimateSize(int widthMeasureSpec, int heightMeasureSpec) { 
  3.     HiLog.info(Contants.LABEL, "onMeasure"); 
  4.     int widthMode = EstimateSpec.getMode(widthMeasureSpec); 
  5.     int widthSize = EstimateSpec.getSize(widthMeasureSpec); 
  6.     int heightMode = EstimateSpec.getMode(heightMeasureSpec); 
  7.     int heightSize = EstimateSpec.getSize(heightMeasureSpec); 
  8.     int width; 
  9.     int height; 
  10.     if (widthMode == EstimateSpec.PRECISE) { 
  11.         width = widthSize; 
  12.     } else { 
  13.         width = (mSunRadius + mFixLineHeight + mLineHeight) * 2 + getPaddingRight() + getPaddingLeft(); 
  14.     } 
  15.     if (heightMode == EstimateSpec.PRECISE) { 
  16.         height = heightSize; 
  17.     } else { 
  18.         height = (mSunRadius + mFixLineHeight + mLineHeight) * 2 + getPaddingTop() + getPaddingBottom(); 
  19.     } 
  20.     setEstimatedSize(width, height); 
  21.     mWidth = width; 
  22.     mHeight = height; 
  23.     return false

畫線條:

  1. private void drawLines(Canvas canvas) { 
  2.     for (int i = 0; i <= 360; i++) { 
  3.         if (i % mLineLevel == 0) { 
  4.             mLineLeft = mWidth / 2 - mLineWidth / 2; 
  5.             mLineTop = mHeight / 2 - mSunRadius - mFixLineHeight; 
  6.             mLineBottom = mLineTop + mLineHeight; 
  7.         } 
  8.         canvas.save(); 
  9.         canvas.rotate(i, mWidth / (float) 2, mHeight / (float) 2); 
  10.         canvas.drawLine(mLineLeft, mLineTop, mLineLeft, mLineBottom, mLinePaint); 
  11.         canvas.restore(); 
  12.     } 

代碼參考

https://gitee.com/chinasoft5_ohos/Ohos-MaterialRefreshLayout

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-08-16 14:45:38

鴻蒙HarmonyOS應用

2021-08-25 10:14:51

鴻蒙HarmonyOS應用

2021-09-06 14:58:23

鴻蒙HarmonyOS應用

2015-02-11 17:49:35

Android源碼自定義控件

2021-08-11 14:29:20

鴻蒙HarmonyOS應用

2013-04-19 10:14:24

2009-08-06 09:18:01

ASP.NET自定義控ASP.NET控件開發

2009-06-08 20:13:36

Eclipse自定義控

2009-07-31 10:23:09

ASP.NET源碼DateTimePic

2021-12-24 15:46:23

鴻蒙HarmonyOS應用

2017-02-17 09:37:12

Android自定義控件方法總結

2011-08-18 09:44:33

iPhone SDK儀表控件UIDialView

2022-07-15 16:45:35

slider滑塊組件鴻蒙

2021-10-26 10:07:02

鴻蒙HarmonyOS應用

2022-06-30 14:02:07

鴻蒙開發消息彈窗組件

2009-08-06 17:52:45

ASP.NET控件開發自定義控件

2022-06-20 15:43:45

switch開關鴻蒙

2009-08-03 13:34:06

自定義C#控件

2009-08-03 13:39:46

C#自定義用戶控件

2009-09-03 13:34:03

.NET自定義控件
點贊
收藏

51CTO技術棧公眾號

中日韩av电影| 亚洲日本精品视频| 看免费黄色录像| 国产极品人妖在线观看| 免费视频亚洲| 亚洲人成影院在线观看| 97成人超碰免| 亚洲午夜精品一区二区三区| 国产精品111| 啪啪av大全导航福利综合导航| 成人av综合一区| 中文字幕欧美日韩| 黄色免费观看视频网站| 国产美女无遮挡永久免费| 在线日韩网站| 欧美日韩人人澡狠狠躁视频| 99电影在线观看| 国产毛片欧美毛片久久久| av剧情在线观看| 国产在线精品一区二区夜色| 亚洲欧洲国产伦综合| av无码久久久久久不卡网站| 中文字幕一区二区三区免费看| 女一区二区三区| 午夜激情久久久| 亚洲自拍偷拍色图| 久久久久久视频| 一呦二呦三呦国产精品| 日韩午夜激情视频| 日韩人妻一区二区三区蜜桃视频| 一级黄色大片网站| 欧美呦呦网站| 欧美性xxxx极品高清hd直播| 久久99精品久久久久子伦| 精品深夜av无码一区二区老年| 免费精品一区二区三区在线观看| 亚洲色图.com| 日本视频一区在线观看| 亚洲第一网站在线观看| 国产成人三级| 欧美日韩一区二区三区免费看| 日韩精品一区二区三区四区五区 | 欧美色图五月天| 日韩精品专区在线影院重磅| 久久福利一区二区| 精品人妻一区二区三区三区四区 | 超碰在线一区| 精品福利樱桃av导航| 九色91国产| 亚洲精品综合网| 国产日韩欧美一区在线| 精品无人国产偷自产在线| 热久久精品国产| 337p日本欧洲亚洲大胆鲁鲁| 久久精品av麻豆的观看方式| 超碰97人人做人人爱少妇| 日日夜夜精品视频免费观看| 在线播放免费av| 成人免费视频免费观看| 国产91成人video| 懂色av蜜桃av| 亚洲三级av| 色八戒一区二区三区| 亚洲一区二区自拍偷拍| 成人高潮成人免费观看| 国产老妇另类xxxxx| 97欧美精品一区二区三区| www.色多多| 少妇高潮一区二区三区99| 欧美日韩一本到| 成人不卡免费视频| 日本在线影院| 国产日产欧美一区二区视频| 91精品久久久久久综合乱菊| 久久免费视频99| 国内精品美女在线观看| 国产亚洲精品美女久久久| 妖精视频在线观看| 日韩大片欧美大片| 中文字幕在线播放不卡一区| 国产不卡一区二区在线播放| 国产精品国产精品88| 中文一区一区三区免费在线观看| 日韩av在线精品| 涩涩网站在线看| 国产精品1区在线| 91福利国产成人精品照片| 黄色av免费在线播放| 亚洲精品天堂| |精品福利一区二区三区| 免费在线成人av| 亚洲成人中文字幕在线| 99久免费精品视频在线观看| 91免费电影网站| 天天综合久久综合| 国产精品五区| 国产精品亚洲综合天堂夜夜| 日本高清www免费视频| 在线成人直播| 26uuu另类亚洲欧美日本一| 日本妇乱大交xxxxx| 性欧美暴力猛交另类hd| 欧美激情高清视频| 天天摸日日摸狠狠添| 午夜欧美精品| 欧美成年人在线观看| 天堂资源在线视频| 精品亚洲成人| 国产午夜精品一区二区三区| 国产高清视频免费在线观看| 大片网站久久| 久久人人爽人人爽人人片av高清| 激情小说中文字幕| 在线观看国产精品入口| 欧美一级淫片播放口| 国产精品视频一二区| 男女激情视频一区| 国产精品免费一区豆花| 亚洲免费黄色网址| 国产欧美三级| 亚洲最大av在线| 国产三级在线看| 国产日产欧美精品一区二区三区| 日韩欧美一级在线| 成人在线中文| 欧美日韩激情一区二区三区| gai在线观看免费高清| 欧美大片1688网站| 欧美日韩三级一区二区| 偷偷色噜狠狠狠狠的777米奇| 欧美wwwwww| 欧美日韩福利电影| 国产精品成人国产乱| 激情综合网av| 成人女人免费毛片| 无码精品人妻一区二区| 91看片淫黄大片一级在线观看| 久久精品一二三区| 日本色护士高潮视频在线观看| 欧美日韩一区二区三区四区五区 | 亚洲中文字幕一区二区| 国产真实乱对白精彩久久| 日韩中文字幕一区二区| 亚洲欧洲日本韩国| 精品视频免费看| 黄瓜视频污在线观看| 99国产精品99久久久久久粉嫩| 国产91精品不卡视频| 高h放荡受浪受bl| 99久久精品免费看国产| 97人人香蕉| 亚洲日本香蕉视频| 午夜私人影院久久久久| 午夜福利三级理论电影| 亚洲美女久久| 欧亚精品中文字幕| 91久久精品国产91性色69| 欧美高清在线一区二区| 9久久婷婷国产综合精品性色 | 免费黄网站在线| 一区二区三区在线视频观看| 日日摸日日碰夜夜爽无码| 91看片一区| 日韩免费视频一区二区| 久久高清内射无套| 国产成人av资源| 日本午夜一区二区三区| 日韩在线免费| 在线视频日本亚洲性| 亚洲字幕av一区二区三区四区| 国产精品盗摄一区二区三区| 永久免费黄色片| 欧美日本成人| 国产精品视频免费在线| 嫩草在线视频| 欧美哺乳videos| 午夜影院黄色片| 九一久久久久久| 欧美日韩无遮挡| 男女在线观看视频| 欧美视频一二三区| 久久精品女同亚洲女同13| 亚洲视频成人| 亚洲精品国产精品国自产观看| 波多野结衣中文在线| 日韩大陆欧美高清视频区| 波多野结衣网站| 亚洲九九爱视频| 午夜免费福利在线| 午夜先锋成人动漫在线| 久久午夜a级毛片| 欧美综合视频在线| 一区二区三区在线观看国产 | 国产亚洲欧洲997久久综合 | 国产无限制自拍| 亚洲国产综合在线观看| 久久久久久久久网站| 国产精品久久久久久69| 香蕉成人啪国产精品视频综合网| 一色道久久88加勒比一| 国内精品久久久久影院薰衣草| 久久久久免费看黄a片app| 日韩精品一区二区三区免费观看| 欧美在线一级视频| 91社区在线| 日韩精品欧美国产精品忘忧草| 国产一区二区三区黄片| 欧美丝袜一区二区| 成人观看免费视频| 国产一区二区视频在线播放| 国产69精品久久久久久久| 欧美wwwww| 成人黄色免费片| 在线看片福利| 欧美疯狂xxxx大交乱88av| 成人高清网站| 亚洲美女视频网站| 老熟妇仑乱一区二区av| 久久精品亚洲一区二区三区浴池| 欧美v在线观看| 欧美激情1区2区| 亚州欧美一区三区三区在线| 国产精品伊人| 菠萝蜜影院一区二区免费| 亚洲中文字幕在线观看| 一本色道久久加勒比精品| 国产成人无码精品久久二区三| 国产成人精品亚洲日本在线桃色 | 一区在线免费观看| 国产精品我不卡| 欧美巨大丰满猛性社交| 久久成人精品电影| 在线日本视频| 中文国产成人精品| 狠狠v欧美ⅴ日韩v亚洲v大胸| 欧美亚洲日本国产| 亚洲成熟少妇视频在线观看| 黄色精品在线看| 国产成人无码精品| 亚洲va天堂va国产va久| 久久久.www| 一区二区三区精品在线观看| 中文文字幕文字幕高清| 亚洲欧美日韩综合国产aⅴ| www.av蜜桃| 亚洲黄色影院| 日韩精品极品视频在线观看免费| 亚洲电影一级片| 免费一区二区三区| 欧美男gay| 五月天综合网| 色综合咪咪久久网| 自拍偷拍一区二区三区| 高潮按摩久久久久久av免费| 茄子视频成人在线| 中文字幕乱码中文乱码51精品| 国色天香2019中文字幕在线观看| 白白色在线观看| 91精品国产一区| 亚洲wwww| 国产日韩亚洲欧美| 91色在线看| 97在线视频一区| 欧美人体一区二区三区| 国产精品久久久久久久久久免费 | 亚洲动漫在线观看| 日本一区二区三区免费观看| 色婷婷综合网| 337p亚洲精品色噜噜狠狠p| 国内精品福利| 免费欧美一级视频| 喷白浆一区二区| 福利视频一二区| 校园激情久久| 浓精h攵女乱爱av| 国产乱理伦片在线观看夜一区| 亚洲天堂av网站| 国产在线精品视频| 极品白嫩的小少妇| 久久精品水蜜桃av综合天堂| 亚洲女同二女同志奶水| 亚洲黄色片在线观看| 国产成人无码一区二区三区在线| 一本到不卡精品视频在线观看| 中文字幕一区二区三区四区免费看 | 亚洲春色在线| 欧美黄在线观看| www.国产区| 国产精品小仙女| 瑟瑟视频在线观看| 不卡av电影在线播放| a毛片毛片av永久免费| 成人免费在线播放视频| 一级片免费网址| 欧美精品一二三四| 日韩一级在线视频| 欧美高清一级片在线| 十八禁一区二区三区| 欧美精品一区二区在线播放 | zzzwww在线看片免费| 久久激情五月丁香伊人| 成人免费在线电影| 美女精品一区二区| 成人在线看视频| 精品一区中文字幕| 人人妻人人澡人人爽人人精品 | 免费成人av在线| 日本少妇xxxx| 亚洲精品第一国产综合野| 在线免费观看国产精品| 日韩一区二区免费在线电影| 国产大学生校花援交在线播放 | 欧美电影h版| 粉嫩av四季av绯色av第一区| 日韩久久精品网| 青青青在线播放| 中日韩视频在线观看| 一二三av在线| 欧美国产精品一区| 毛片基地在线观看| 欧美小视频在线观看| 亚洲第一精品网站| 久久精品视频播放| 欧美不卡高清一区二区三区| 精品一区二区三区自拍图片区| 天堂综合网久久| 国产一二三区在线播放| 欧美日韩视频一区二区三区| 日本a级片在线播放| 美女视频网站黄色亚洲| 少妇按摩一区二区三区| 亚洲 欧美综合在线网络| wwwav网站| 久久国产精品久久精品| 伊人久久大香| 国产精品一区二区三区免费观看| 888久久久| 成年人午夜视频在线观看 | 精品毛片网大全| 黄色av网站免费在线观看| 欧美成aaa人片在线观看蜜臀| 亚洲精品777| 欧美日韩在线免费观看视频| 亚洲视频日本| 日本55丰满熟妇厨房伦| 亚洲男人的天堂在线aⅴ视频| 一级二级三级视频| 日日狠狠久久偷偷四色综合免费| 日韩漫画puputoon| 亚洲成人a**址| 麻豆成人免费电影| 亚洲精品自拍视频在线观看| 亚洲国产精品久久不卡毛片| 少妇久久久久久久| 一区二区三区四区精品| 在线中文字幕-区二区三区四区 | 这里视频有精品| 日本黄大片在线观看| 成人精品一区二区三区四区 | 欧洲一区二区三区在线| 99久久精品无免国产免费| 久久成人av网站| 国产一区二区三区不卡av| 青青草精品视频在线| 26uuu国产在线精品一区二区| 无码人妻精品一区二区三区9厂| 国产小视频91| 激情综合五月| 一本久道高清无码视频| 久久久亚洲欧洲日产国码αv| 国产免费a视频| 久久中文字幕在线| 成人精品毛片| 黄色片久久久久| 综合久久久久久| 少妇又色又爽又黄的视频| 日韩av电影在线网| 国产成人一二片| 黑人糟蹋人妻hd中文字幕| 国产蜜臀av在线一区二区三区| 国产在线欧美在线| 精品一区二区三区三区| 免费成人毛片| 日韩视频免费播放| 亚洲国产高清在线| 好吊色一区二区| 国产成人亚洲精品| 中文字幕一区二区av | 欧美精品色婷婷五月综合| 中文字幕欧美区| 欧美 日韩 中文字幕| 国产成人综合久久| 欧美韩国一区| 成人性生交大免费看| 91精品一区二区三区久久久久久| 电影av在线| 国产精品久久久对白| 热久久国产精品| 日本中文字幕在线免费观看| 视频在线一区二区|