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

擼起袖子自己寫一個Android通用刷新控件

移動開發 Android
項目中我們經常有上拉、下拉刷新的需求,幾乎所有的listView、RecyclerView都會伴隨著上拉、下拉刷新的需求,如果我們使用一些開源控件,換了控件我們就要更新,現在我們自己擼起袖子寫一個通用的刷新控件

項目中我們經常有上拉、下拉刷新的需求,幾乎所有的listView、RecyclerView都會伴隨著上拉、下拉刷新的需求,如果我們使用一些開源控件,換了控件我們就要更新,現在我們自己擼起袖子寫一個通用的刷新控件

擼起袖子自己寫一個Android通用的刷新控件

思路:

  • 寫一個繼承RelativeLayout的RefreshLayout
  • 添加頭尾控件作為刷新控件
  • 通過事件分發來進行刷新操作
  • 通過動畫來控制控件移動

目的:讓他的所有子控件都可以使用,哪怕是一個TextView 

  1. public class RefreshLayout extends RelativeLayout { 
  2.  
  3.     /** 
  4.      * 滑動控件時拉去的速度比例 
  5.      */ 
  6.     private final int V_REFRESH = 2; 
  7.     /** 
  8.      * 是否是刷新過程 
  9.      * true 是 
  10.      * false 不是 
  11.      * 為false的時候才可以進行刷新 
  12.      */ 
  13.     private boolean mIsRefreshDuring; 
  14.     /** 
  15.      * 可以進下拉刷新 
  16.      */ 
  17.     private boolean mCanDownPull; 
  18.     /** 
  19.      * 可以進行上拉刷新 
  20.      */ 
  21.     private boolean mCanUpPull; 
  22.     /** 
  23.      * 判斷觸摸后是否是初次移動 
  24.      */ 
  25.     private boolean mIsFirstMove; 
  26.     /** 
  27.      * y軸呢平移的距離 
  28.      */ 
  29.     private int mDistanceY; 
  30.     /** 
  31.      * 刷新接口對象 
  32.      */ 
  33.     private OnRefresh mOnRefresh; 
  34.     /** 
  35.      * 用于控制事件攔截的變量 
  36.      */ 
  37.     private boolean mCanIntercept; 
  38.     private int mTouchSlop; 
  39.     private int mDistance; 
  40.     private LayoutParams mHeaderParams; 
  41.     private View mHeaderView; 
  42.     private View mFootView; 
  43.     private int mHeaderMaxHeight; 
  44.     private int mStartY; 
  45.     private LayoutParams mFootParams; 
  46.     private int mFootMaxHeight; 
  47.     private PullCallBack mCallBack; 
  48.     private View mChildView; 
  49.     private ObjectAnimator mAnimator; 
  50.  
  51.     public RefreshLayout(Context context) { 
  52.         super(context); 
  53.         initData(); 
  54.     } 
  55.  
  56.     public RefreshLayout(Context context, AttributeSet attrs) { 
  57.         super(context, attrs); 
  58.         initData(); 
  59.     } 
  60.  
  61.     public RefreshLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
  62.         super(context, attrs, defStyleAttr); 
  63.         initData(); 
  64.     } 
  65.  
  66.     /** 
  67.      * 必須讓頭尾控件實現的接口 
  68.      */ 
  69.     public interface HeadAndFootCallBack { 
  70.         //設置屬性 
  71.         void setAttribute(); 
  72.  
  73.         //開始刷新 
  74.         void startPull(); 
  75.  
  76.         //停止刷新 
  77.         void stopPull(); 
  78.     } 
  79.  
  80.     /** 
  81.      * 必須讓被拖動的控件子類實現 
  82.      */ 
  83.     public interface PullCallBack { 
  84.         boolean canDownPull(); 
  85.  
  86.         boolean canUpPull(); 
  87.     } 
  88.  
  89.     private void initData() { 
  90.         //不調用該方法不能進行繪制 
  91.         setWillNotDraw(false); 
  92.     } 
  93.  
  94.     /** 
  95.      * 下拉刷新完成后必須使用該方法 
  96.      */ 
  97.     public void downPullFinish() { 
  98.         mAnimator.setFloatValues(mChildView.getTranslationY(), 0); 
  99.         mAnimator.start(); 
  100.         ((HeadAndFootCallBack) mHeaderView).stopPull(); 
  101.     } 
  102.  
  103.     /** 
  104.      * 上拉完成后必須調用該方法 
  105.      */ 
  106.     public void upPullFinish() { 
  107.         mAnimator.setFloatValues(mChildView.getTranslationY(), 0); 
  108.         mAnimator.start(); 
  109.         ((HeadAndFootCallBack) mFootView).stopPull(); 
  110.     } 
  111.  
  112.     /** 
  113.      * 自動下拉刷新 
  114.      */ 
  115.     public void autoDownPullForHead() { 
  116.         postDelayed(new Runnable() { 
  117.             @Override 
  118.             public void run() { 
  119.                 mCanDownPull = true
  120.                 mCanUpPull = false
  121.                 mAnimator.setFloatValues(10, mHeaderMaxHeight); 
  122.                 mAnimator.start(); 
  123.                 ((HeadAndFootCallBack) mHeaderView).startPull(); 
  124.                 mOnRefresh.onDownPullRefresh(); 
  125.             } 
  126.         }, 500); 
  127.     } 
  128.  
  129.     /** 
  130.      * 自動下拉刷新 
  131.      */ 
  132.     public void autoUpPullForHead() { 
  133.         postDelayed(new Runnable() { 
  134.             @Override 
  135.             public void run() { 
  136.                 mCanDownPull = false
  137.                 mCanUpPull = true
  138.                 mAnimator.setFloatValues(0, mFootMaxHeight); 
  139.                 mAnimator.start(); 
  140.                 ((HeadAndFootCallBack) mFootView).startPull(); 
  141.                 mOnRefresh.onUpPullRefresh(); 
  142.             } 
  143.         }, 500); 
  144.     } 
  145.  
  146.     @Override 
  147.     public boolean onInterceptTouchEvent(MotionEvent ev) { 
  148.         return mCanIntercept; 
  149.     } 
  150.  
  151.     @Override 
  152.     public boolean onTouchEvent(MotionEvent event) { 
  153.         return true
  154.     } 
  155.  
  156.     @Override 
  157.     public boolean dispatchTouchEvent(MotionEvent event) { 
  158.         Log.e("shen""mIsRefreshDuring=" + mIsRefreshDuring); 
  159.         if (mIsRefreshDuring)/*如果正在進行刷新將不會獲取MotionEvent*/ { 
  160.             return super.dispatchTouchEvent(event); 
  161.         } 
  162.         switch (event.getAction()) { 
  163.             case MotionEvent.ACTION_DOWN: 
  164.                 mStartY = (int) event.getY(); 
  165.                 initPull(); 
  166.                 break; 
  167.             case MotionEvent.ACTION_MOVE: 
  168.                 if (event.getPointerCount() == 1) { 
  169.                     int moveY = (int) event.getY(); 
  170.                     mDistanceY = (moveY - mStartY) / V_REFRESH; 
  171.                     if (!mIsFirstMove && mDistanceY != 0 && mDistanceY < mTouchSlop) { 
  172.                         mCanDownPull = mDistanceY > 0; 
  173.                         mCanUpPull = !mCanDownPull; 
  174.                         mIsFirstMove = true
  175.                     } 
  176.                     if (mCanDownPull && mCallBack.canDownPull()) { 
  177.                         upDataForDownPull();//下拉刷新 
  178.                         mChildView.setEnabled(false); 
  179.                         mCanIntercept = true
  180.                     } 
  181.                     if (mCanUpPull && mCallBack.canUpPull()) { 
  182.                         upDataForUpPull();//上拉加載 
  183.                         mChildView.setEnabled(false); 
  184.                         mCanIntercept = true
  185.                     } 
  186.                     mStartY = moveY; 
  187.                 } 
  188.                 break; 
  189.             case MotionEvent.ACTION_UP: 
  190.                 mIsRefreshDuring = true
  191.                 mIsFirstMove = false
  192.                 if (mHeaderParams.height >= mHeaderMaxHeight)/*可以下拉刷新*/ { 
  193.                     ((HeadAndFootCallBack) mHeaderView).startPull(); 
  194.                     mOnRefresh.onDownPullRefresh(); 
  195.                 } else if (mFootParams.height >= mFootMaxHeight)/*可以上拉刷新*/ { 
  196.                     ((HeadAndFootCallBack) mFootView).startPull(); 
  197.                     mOnRefresh.onUpPullRefresh(); 
  198.                 } else if (mHeaderParams.height > 0 && mHeaderParams.height < mHeaderMaxHeight)/*不能進行下拉刷新,收回*/ { 
  199.                     releaseForDownFinished(); 
  200.                 } else if (mFootParams.height > 0 && mFootParams.height < mFootMaxHeight)/*不能進行下拉刷新,收回*/ { 
  201.                     releaseForUpFinished(); 
  202.                 } else { 
  203.                     mIsRefreshDuring = false
  204.                     mCanIntercept = false
  205.                 } 
  206.                 break; 
  207.         } 
  208.         super.dispatchTouchEvent(event); 
  209.         return true
  210.     } 
  211.  
  212.     /** 
  213.      * 每次進行觸摸都需要進行初始化 
  214.      */ 
  215.     private void initPull() { 
  216.         mCanDownPull = false
  217.         mCanUpPull = false
  218.     } 
  219.  
  220.     /** 
  221.      * 不需要進行上拉刷新 
  222.      */ 
  223.     private void releaseForUpFinished() { 
  224.         mAnimator.setFloatValues(mChildView.getTranslationY(), 0); 
  225.         mAnimator.start(); 
  226.     } 
  227.  
  228.     /** 
  229.      * 不需要進行下拉刷新 
  230.      */ 
  231.     private void releaseForDownFinished() { 
  232.         mAnimator.setFloatValues(mChildView.getTranslationY(), 0); 
  233.         mAnimator.start(); 
  234.     } 
  235.  
  236.     /** 
  237.      * 上拉時處理手勢 
  238.      */ 
  239.     private void upDataForUpPull() { 
  240.         if (mDistanceY != 0) { 
  241.             mFootParams.height -= mDistanceY; 
  242.             if (mFootParams.height <= 0) { 
  243.                 mFootParams.height = 0; 
  244.             } 
  245.             if (mFootParams.height >= mFootMaxHeight) { 
  246.                 mFootParams.height = mFootMaxHeight; 
  247.             } 
  248.             mChildView.setTranslationY(-mFootParams.height); 
  249.             mFootView.requestLayout(); 
  250.         } 
  251.     } 
  252.  
  253.     /** 
  254.      * 下拉時處理手勢 
  255.      */ 
  256.     private void upDataForDownPull() { 
  257.         if (mDistanceY != 0) { 
  258.             mHeaderParams.height += mDistanceY; 
  259.             if (mHeaderParams.height >= mHeaderMaxHeight) { //*** 
  260.                 mHeaderParams.height = mHeaderMaxHeight; 
  261.             } 
  262.             if (mHeaderParams.height <= 0) { //最小 
  263.                 mHeaderParams.height = 0; 
  264.             } 
  265.             mChildView.setTranslationY(mHeaderParams.height); 
  266.             mHeaderView.requestLayout(); 
  267.         } 
  268.     } 
  269.  
  270.     @Override 
  271.     protected void onAttachedToWindow() { 
  272.         super.onAttachedToWindow(); 
  273.     } 
  274.  
  275.     @Override 
  276.     protected void onFinishInflate() { 
  277.         super.onFinishInflate(); 
  278.         //加載頭 
  279.         mHeaderView = getChildAt(0); 
  280.         if (!(mHeaderView instanceof HeadAndFootCallBack)) { 
  281.             new IllegalStateException("HeaderView必須實現HeadAndFootCallBack接口"); 
  282.         } 
  283.         ((HeadAndFootCallBack) mHeaderView).setAttribute(); 
  284.         mHeaderParams = (LayoutParams) mHeaderView.getLayoutParams(); 
  285.         mHeaderParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
  286.  
  287.         //加載尾 
  288.         mFootView = getChildAt(2); 
  289.         if (!(mFootView instanceof HeadAndFootCallBack)) { 
  290.             new IllegalStateException("FootView必須實現HeadAndFootCallBack接口"); 
  291.         } 
  292.         ((HeadAndFootCallBack) mFootView).setAttribute(); 
  293.         mFootParams = (LayoutParams) mFootView.getLayoutParams(); 
  294.         mFootParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
  295.  
  296.         mChildView = getChildAt(1); 
  297.         if (!(mChildView instanceof HeadAndFootCallBack)) { 
  298.             new IllegalStateException("ChildView必須實現PullCallBack接口"); 
  299.         } 
  300.         mCallBack = (PullCallBack) getChildAt(1); 
  301.  
  302.         //設置動畫 
  303.         mAnimator = ObjectAnimator.ofFloat(mChildView, "translationY", 0); 
  304.         mAnimator.setInterpolator(new DecelerateInterpolator()); 
  305.         mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
  306.             @Override 
  307.             public void onAnimationUpdate(ValueAnimator animation) { 
  308.                 int translationY = (int) mChildView.getTranslationY(); 
  309.                 if (mCanUpPull) { //從移動到的位置往下滑 
  310.                     mFootParams.height = Math.abs(translationY); 
  311.                     mFootView.requestLayout(); 
  312.                 } else if (mCanDownPull) { 
  313.                     mHeaderParams.height = Math.abs(translationY); 
  314.                     mHeaderView.requestLayout(); 
  315.                 } 
  316.                 Log.e("shen""translationY=" + translationY); 
  317.                 Log.e("shen""mHeaderParams.height=" + mHeaderParams.height); 
  318.                 if (translationY == 0) { 
  319.                     mChildView.setEnabled(true); 
  320.                     mDistanceY = 0; //重置 
  321.                     mIsRefreshDuring = false; //重置 
  322.                     mCanIntercept = false
  323.                 } else { 
  324.                     mIsRefreshDuring = true
  325.                 } 
  326.             } 
  327.         }); 
  328.     } 
  329.  
  330.     @Override 
  331.     protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
  332.         super.onSizeChanged(w, h, oldw, oldh); 
  333.         mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop(); 
  334.         mDistance = mTouchSlop * 5; 
  335.         //設置下拉頭初始屬性 
  336.         mHeaderMaxHeight = mHeaderParams.height; 
  337.         mHeaderParams.height = 0; 
  338.         mHeaderView.requestLayout(); 
  339.         //設置上拉尾初始屬性 
  340.         mFootMaxHeight = mFootParams.height; 
  341.         mFootParams.height = 0; 
  342.         mFootView.requestLayout(); 
  343.     } 
  344.  
  345.     /** 
  346.      * 下拉/上拉事件監聽 
  347.      */ 
  348.     public interface OnRefresh { 
  349.         /** 
  350.          * 下拉刷新 
  351.          */ 
  352.         void onDownPullRefresh(); 
  353.  
  354.         /** 
  355.          * 上拉加載 
  356.          */ 
  357.         void onUpPullRefresh(); 
  358.     } 
  359.  
  360.     public void setOnRefresh(OnRefresh onRefresh) { 
  361.         mOnRefresh = onRefresh; 
  362.     } 
  363.  

給他添加三個控件,頭尾就是刷新頭、尾,第二個就是正常顯示的控件。必須讓頭尾實現HeadAndFootCallBack接口,來設置屬性,通知開始刷新、結束刷新

難點: 現在來說下開發時遇到的難點

  • 由于判斷在dispatchTouchEvent中,導致如果該控件以及子控件都不消費該事件的話,就會造成事件不會發送到它,因為如果不消費DOWN事件的話,之后所有的事件都不會在進行接收。解決方式,讓該控件onTouchEvent方法消返回true,當子控件不進行事件消費的話,就會返回由該控件消費,不會造成因DOWN事件不消費而無法接收到事件,導致dispatchTouchEvent也不消費事件
  • 動畫,動畫就是我的傷痛,最近在學習估值器

這個控件自認為寫的不錯,通過他可以幫我們學習事件分發、動畫、接口回調,也是有一定的學習意義

 

責任編輯:未麗燕 來源: 安卓巴士
相關推薦

2017-02-20 13:54:04

戴爾

2020-06-02 11:22:23

代碼設計圖系統

2021-10-27 06:49:34

線程池Core函數

2021-06-26 16:24:21

Linux命令系統

2012-07-19 13:49:20

2019-03-21 09:45:20

IM即時通訊CIM

2017-01-18 12:33:58

IPv6產業地址

2021-12-30 06:59:27

視頻通話網頁

2020-11-04 07:56:19

工具Linux 翻譯

2022-03-17 15:34:47

printf日志

2021-08-04 11:55:45

Python天氣查詢PySide2

2021-11-26 08:33:51

React組件前端

2020-12-18 09:49:21

鴻蒙HarmonyOS游戲

2021-06-07 12:08:06

iOS Python API

2021-05-14 13:30:17

Mybatis分表插件

2024-02-19 00:00:00

Redis分布式

2016-12-13 17:02:49

androidjava移動應用開發

2019-06-05 15:00:28

Java代碼區塊鏈

2025-09-23 02:11:00

2022-03-01 11:38:51

RPC框架后端
點贊
收藏

51CTO技術棧公眾號

欧美国产日韩亚洲一区| 99精品国产在热久久| 9191成人精品久久| 毛片在线视频观看| 深夜福利视频一区| 久热成人在线视频| 欧美精品videosex性欧美| 欧美无人区码suv| 欧美视频免费看| 亚洲国产成人精品视频| 日韩免费中文专区| 肥臀熟女一区二区三区| 免费视频最近日韩| 欧美一级bbbbb性bbbb喷潮片| 国产第一页精品| 九九热播视频在线精品6| 欧美日韩国产一级| 成年人视频网站免费观看| 精品国产白色丝袜高跟鞋| 91在线免费视频观看| 亚洲一区二区三区久久| 波多野结衣视频网址| 亚洲毛片网站| 久久6免费高清热精品| 国产探花视频在线播放| 西野翔中文久久精品字幕| 日韩午夜av一区| 亚洲另类第一页| 午夜精品成人av| 午夜久久电影网| 色撸撸在线观看| 午夜在线观看视频| 久久久国产综合精品女国产盗摄| 国产精品久久久久久免费观看 | 99久久婷婷| 亚洲午夜av电影| 加勒比一区二区| 另类在线视频| 亚洲国产精品资源| 又大又长粗又爽又黄少妇视频| 少妇精品视频在线观看| 欧美在线影院一区二区| 欧美精品成人网| 在线看的毛片| 欧美日韩在线视频一区| 午夜免费福利小电影| 欧美14一18处毛片| 一区二区三区在线观看动漫| 国产a级片免费看| 黄色免费在线观看| 最近中文字幕一区二区三区| 在线视频亚洲自拍| 免费黄色在线网站| 中文字幕亚洲一区二区av在线| 亚洲欧美成人一区| 免费的黄网站在线观看| 亚洲丝袜美腿综合| 日本xxxxx18| 国产激情在线| 亚洲一线二线三线视频| 欧美成人高潮一二区在线看| 国产精品电影| 欧美午夜丰满在线18影院| 99色精品视频| 国产极品久久久久久久久波多结野 | 亚洲国产婷婷香蕉久久久久久| 精品一区二区三区四区五区六区| 国内精品麻豆美女在线播放视频 | 色综合 综合色| 日韩亚洲在线视频| 色噜噜成人av在线| 欧美一级xxx| japanese在线观看| 精品在线播放| 日韩有码在线视频| 久草免费新视频| 一本色道88久久加勒比精品| 国产精品成人久久久久| 亚洲一区中文字幕永久在线| 国产精品一卡二卡在线观看| 国内一区在线| av大片在线观看| 亚洲在线成人精品| 精品99在线视频| 国产不卡精品| 日韩精品一区二区三区第95| 美国黄色特级片| 亚洲第一伊人| 国产精品久久久久久超碰| 精品区在线观看| 久久嫩草精品久久久久| 亚洲美女自拍偷拍| 九色porny丨国产首页在线| 欧美中文字幕亚洲一区二区va在线| 男人午夜视频在线观看| 欧美综合精品| 久久香蕉频线观| 日本少妇全体裸体洗澡| 美女性感视频久久| 国产一区在线免费观看| 黄色小网站在线观看| 欧美日韩美女视频| 亚洲成人av免费观看| 亚洲午夜久久| 欧美高清性猛交| 国产精品第5页| 成人综合激情网| 亚洲欧美在线网| 韩国主播福利视频一区二区三区| 欧美成人一区二区三区在线观看 | 日本亚洲欧美三级| av综合在线观看| 国产日韩欧美麻豆| 可以看毛片的网址| 国产高清精品二区| 一区二区三区四区精品| 日韩欧美视频在线免费观看| 国产一区二区三区美女| 日本精品一区二区三区视频| 日本大片在线播放| 欧美电影在线免费观看| 亚洲女优在线观看| 性欧美videos另类喷潮| 翡翠波斯猫1977年美国| 免费看美女视频在线网站| 在线免费观看成人短视频| 日本免费福利视频| 亚洲二区免费| 国产精品嫩草在线观看| 色婷婷视频在线观看| 欧美日韩视频不卡| 人妻精品久久久久中文| 老司机亚洲精品| 久久国产精品99久久久久久丝袜 | 亚洲高清免费视频| 日本人dh亚洲人ⅹxx| 午夜国产一区二区| 91精品久久久久久久久久另类| 精品资源在线看| 日本韩国欧美在线| 少妇久久久久久久久久| 米奇777在线欧美播放| 欧美在线视频一区二区三区| 伊伊综合在线| 亚洲人成电影在线| 自拍偷拍18p| 国产欧美一区二区精品性色| 免费日韩视频在线观看| 国产aⅴ精品一区二区三区久久| 91精品国产91久久久久| 日本高清视频www| 欧美日韩国产精品一区| 我和岳m愉情xxxⅹ视频| 免费在线播放第一区高清av| 久久综合一区二区三区| 男人最爱成人网| 亚洲新声在线观看| 中文字字幕在线中文乱码| 中文字幕欧美一| 波多野结衣在线免费观看| 在线一区电影| 国产精品免费观看高清| 亚洲欧洲自拍| 伊人久久男人天堂| 国产乱淫片视频| 亚洲综合图片区| 精品人妻一区二区三区日产乱码卜| 男人的天堂成人在线| 亚洲精品视频一二三| 日韩成人久久| 欧美一级在线亚洲天堂| 亚洲欧美视频一区二区| 日韩免费视频线观看| 日本一二三区不卡| 国产偷v国产偷v亚洲高清| 中文字幕在线观看日| 欧美三级小说| 国产美女99p| 91精品国产66| 久久99国产精品自在自在app| 污视频在线免费观看| 欧美伊人久久久久久久久影院| 免费在线观看黄色小视频| 成人久久18免费网站麻豆| 99re在线视频免费观看| 亚洲91精品| 久久超碰亚洲| 日韩av综合| 国产999精品久久久| 成人福利片网站| 国产婷婷成人久久av免费高清| 一区二区视频在线免费观看| 亚洲va国产天堂va久久en| 最近中文字幕免费视频| 国产精品一卡二| 日韩一级免费在线观看| 欧美va天堂在线| 日本一区二区三区视频免费看| 精品一区二区三区在线观看视频| 欧美一区视频在线| 自由的xxxx在线视频| 亚洲午夜国产成人av电影男同| 亚洲精品无码久久久| 欧美亚洲丝袜传媒另类| 日本系列第一页| 亚洲精品水蜜桃| 国产又黄又粗的视频| 97久久人人超碰| 在线一区二区不卡| 秋霞av亚洲一区二区三| 黄色av网址在线播放| 久久久久久久久国产一区| 欧洲成人一区二区| 美女呻吟一区| 成人影片在线播放| 国产视频一区二| 国产精品无av码在线观看| 超碰成人av| 欧美激情一级欧美精品| 黄网站在线播放| 永久免费看mv网站入口亚洲| 欧美女v视频| 亚洲精品美女在线观看播放| 成 人 黄 色 片 在线播放| 欧美日韩和欧美的一区二区| 久久久精品视频网站| 天天综合网天天综合色| 久久久无码精品亚洲国产| 亚洲欧美一区二区三区久本道91| 午夜黄色福利视频| 国产精品午夜免费| 亚洲欧美va天堂人熟伦| 国产欧美视频在线观看| 欧美老熟妇乱大交xxxxx| 99国产精品国产精品毛片| 大尺度在线观看| 成人动漫在线一区| 免费观看黄网站| 国产成人精品一区二| 一区二区三区四区影院| 国产成人精品免费| 中文字幕人妻熟女在线| 成a人片亚洲日本久久| 黑森林av导航| av爱爱亚洲一区| 欧美bbbbb性bbbbb视频| 久久亚洲一级片| 无码人妻精品一区二区三应用大全| 97se亚洲国产综合自在线不卡 | 中文一区二区在线观看| 精品一区二区6| 亚洲欧洲国产日本综合| 中国毛片直接看| 亚洲一区二区三区精品在线| 久久精品人妻一区二区三区| 亚洲大尺度视频在线观看| 色婷婷在线观看视频| 欧美性少妇18aaaa视频| 精品黑人一区二区三区| 欧美人成免费网站| 国产精品女同一区二区| 日韩欧美黄色影院| 天天干天天草天天射| 精品视频在线播放| av电影在线网| 另类专区欧美制服同性| ****av在线网毛片| 欧美在线www| 久久久久黄色| 国产女主播一区二区三区| 日韩影视高清在线观看| 亚洲精品一卡二卡三卡四卡| 欧美影视一区| 妺妺窝人体色www在线小说| 日韩av二区在线播放| 天天操精品视频| www.av精品| xxxxx99| 亚洲伊人色欲综合网| 自拍偷拍校园春色| 91精品国产手机| 日本又骚又刺激的视频在线观看| 在线精品国产欧美| 国产又色又爽又黄刺激在线视频| 奇米4444一区二区三区| 国产精品亚洲综合在线观看| 精品一区久久| 亚洲国产精品综合久久久| 欧美 丝袜 自拍 制服 另类| 另类调教123区 | 日本中文字幕高清| 国产传媒久久文化传媒| 91成人在线免费视频| 一区二区三区国产| 国产精品乱码一区二区视频| 日韩视频免费观看高清在线视频| 户外极限露出调教在线视频| 欧美成人在线免费| av一区在线| 国产精品一区二区三区观看| 色小子综合网| 国产偷人视频免费| 床上的激情91.| 欧美日韩黄色网| 欧洲精品在线观看| 性感美女一级片| 欧美日本精品在线| 国产精品蜜月aⅴ在线| 精品欧美一区二区三区久久久 | jizzjizz国产精品喷水| 国产精品亚洲一区二区三区妖精| 久久久久久久毛片| 精品久久久久久久久国产字幕| 国产精品毛片久久久久久久av| 亚洲男人的天堂在线| ririsao久久精品一区| 成人亲热视频网站| 日本大胆欧美| 韩国一区二区av| 91视频在线看| www.youjizz.com亚洲| 日韩一级片网址| 秋霞影院午夜丰满少妇在线视频| 日韩免费观看视频| 图片婷婷一区| 国产一区二区网| 成人午夜av电影| 久久久精品视频在线| 制服.丝袜.亚洲.另类.中文| 888av在线| 国产精品精品久久久| 国产一区二区三区91| 99久久久无码国产精品6| 99久久伊人久久99| 日韩欧美大片在线观看| 亚洲精品xxxx| 性欧美18~19sex高清播放| 国产亚洲欧美一区二区| 夜夜精品视频| 国产男女猛烈无遮挡a片漫画 | 久久久久久一二三区| 超碰超碰超碰超碰| 亚洲情综合五月天| 欧美日韩五码| 日韩精品无码一区二区三区| 日韩精品国产精品| 亚洲av成人无码久久精品 | 7m第一福利500精品视频| 国产精品极品在线观看| 欧美精品一区二区三区三州| 99久久综合狠狠综合久久| 欧美h在线观看| 亚洲一区二区国产| 久久av影院| 好吊色视频988gao在线观看| 国产成人综合在线观看| 日韩av在线播| 国产视频久久久久| 电影亚洲一区| 国产免费色视频| 国产电影精品久久禁18| 日本高清www免费视频| 亚洲欧美日韩国产中文| 99久久伊人| 喜爱夜蒲2在线| 成人久久视频在线观看| 久久精品无码av| 最近更新的2019中文字幕| 日韩三级网址| 国产免费一区二区三区视频| 中文字幕免费不卡在线| 国产手机av在线| 97久久精品人人澡人人爽缅北| 免费看成人哺乳视频网站| 天天插天天操天天射| 亚洲精品少妇30p| 色哟哟在线观看| 国产这里只有精品| 精品成人国产| 影音先锋男人在线| 欧美一级淫片007| 性欧美18~19sex高清播放| 一区二区三区视频| zzijzzij亚洲日本少妇熟睡| 中国黄色一级视频| 欧美精品videossex性护士| 自拍亚洲一区| 亚洲AV无码久久精品国产一区| 精品成人久久av| 免费a级人成a大片在线观看| 国产欧美日韩一区二区三区| 全国精品久久少妇| 五月天婷婷丁香| 日日噜噜噜夜夜爽亚洲精品| 精品国产一区二区三区不卡蜜臂 | 在线观看久久久久久| 97一区二区国产好的精华液| 一区二区三区网址| 午夜a成v人精品| 自由的xxxx在线视频|