日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 滑动菜单框架--SwipeMenuListView框架完全解析

發(fā)布時間:2025/3/15 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 滑动菜单框架--SwipeMenuListView框架完全解析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

SwipeMenuListView(滑動菜單)

A swipe menu for ListView.--一個非常好的滑動菜單開源項目。

Demo

?

一、簡介

看了挺長時間的自定義View和事件分發(fā),想找一個項目練習(xí)下。。正好印證自己所學(xué)。

在github上找到了這個項目:SwipeMenuListView這的真不錯,對事件分發(fā)和自定義View都很有啟發(fā)性,雖然還有點小瑕疵,后面說明。想了解滑動菜單怎么實現(xiàn)的同學(xué),這篇文章絕對對你有幫助,從宏觀微觀角度詳細(xì)分析了每個文件。

項目地址:https://github.com/baoyongzhang/SwipeMenuListView/tree/b00e0fe8c2b8d6f08607bfe2ab390c7cee8df274?版本:b00e0fe 它的使用很簡單只需要三步,在github上就可以看懂就不占用篇幅啦,本文只分析原理。另外如果你看代碼感覺和我不一樣,看著困難的話,可以看我加了注釋的:http://download.csdn.net/detail/jycboy/9667699

先看兩個圖:有一個大體的了解

?這是框架中所有的類。

1.下面的圖是視圖層次:

上面的圖中:SwipeMenuLayout是ListView中item的布局,分左右兩部分,一部分是正常顯示的contentView,一部分是滑出來的menuView;滑出來的SwipeMenuView繼承自LinearLayout,添加view時,就是橫向添加,可以橫向添加多個。

2.下面的圖是類圖結(jié)構(gòu):

上面是類之間的調(diào)用關(guān)系,類旁邊注明了類的主要作用。

二、源碼分析

SwipeMenu?、SwipeMenuItem是實體類,定義了屬性和setter、getter方法,看下就行。基本上源碼的注釋很清楚。

2.1?SwipeMenuView?: 代碼中注釋的很清楚

/*** 橫向的LinearLayout,就是整個swipemenu的父布局* 主要定義了添加Item的方法及Item的屬性設(shè)置* @author baoyz* @date 2014-8-23* */ public class SwipeMenuView extends LinearLayout implements OnClickListener {private SwipeMenuListView mListView;private SwipeMenuLayout mLayout;private SwipeMenu mMenu;private OnSwipeItemClickListener onItemClickListener;private int position;public int getPosition() {return position;}public void setPosition(int position) {this.position = position;}public SwipeMenuView(SwipeMenu menu, SwipeMenuListView listView) {super(menu.getContext());mListView = listView;mMenu = menu; //// MenuItem的list集合List<SwipeMenuItem> items = menu.getMenuItems();int id = 0;//通過item構(gòu)造出View添加到SwipeMenuView中for (SwipeMenuItem item : items) {addItem(item, id++);}}/*** 將 MenuItem 轉(zhuǎn)換成 UI控件,一個item就相當(dāng)于一個垂直的LinearLayout,* SwipeMenuView就是橫向的LinearLayout,*/private void addItem(SwipeMenuItem item, int id) {//布局參數(shù)LayoutParams params = new LayoutParams(item.getWidth(),LayoutParams.MATCH_PARENT);LinearLayout parent = new LinearLayout(getContext());//設(shè)置menuitem的id,用于后邊的點擊事件區(qū)分item用的parent.setId(id);parent.setGravity(Gravity.CENTER);parent.setOrientation(LinearLayout.VERTICAL);parent.setLayoutParams(params);parent.setBackgroundDrawable(item.getBackground());//設(shè)置監(jiān)聽器parent.setOnClickListener(this);addView(parent); //加入到SwipeMenuView中,橫向的if (item.getIcon() != null) {parent.addView(createIcon(item));}if (!TextUtils.isEmpty(item.getTitle())) {parent.addView(createTitle(item));}}//創(chuàng)建imgprivate ImageView createIcon(SwipeMenuItem item) {ImageView iv = new ImageView(getContext());iv.setImageDrawable(item.getIcon());return iv;}/*根據(jù)參數(shù)創(chuàng)建title*/private TextView createTitle(SwipeMenuItem item) {TextView tv = new TextView(getContext());tv.setText(item.getTitle());tv.setGravity(Gravity.CENTER);tv.setTextSize(item.getTitleSize());tv.setTextColor(item.getTitleColor());return tv;}@Override/*** 用傳來的mLayout判斷是否打開* 調(diào)用onItemClick點擊事件*/public void onClick(View v) {if (onItemClickListener != null && mLayout.isOpen()) {onItemClickListener.onItemClick(this, mMenu, v.getId());}}public OnSwipeItemClickListener getOnSwipeItemClickListener() {return onItemClickListener;}/*** 設(shè)置item的點擊事件* @param onItemClickListener*/public void setOnSwipeItemClickListener(OnSwipeItemClickListener onItemClickListener) {this.onItemClickListener = onItemClickListener;}public void setLayout(SwipeMenuLayout mLayout) {this.mLayout = mLayout;}/*** 點擊事件的回調(diào)接口*/public static interface OnSwipeItemClickListener {/*** onClick點擊事件中調(diào)用onItemClick* @param view 父布局* @param menu menu實體類* @param index menuItem的id*/void onItemClick(SwipeMenuView view, SwipeMenu menu, int index);} }

**SwipeMenuView?就是滑動時顯示的View,看他的構(gòu)造函數(shù)SwipeMenuView(SwipeMenu menu, SwipeMenuListView listView)?;遍歷Items:menu.getMenuItems();調(diào)用addItem方法向?SwipeMenuView中添加item。

在addItem方法中:每一個item都是一個LinearLayout?。

2.2?SwipeMenuLayout?:

這個類代碼有點長,我們分成三部分看,只粘貼核心代碼,剩下的看一下應(yīng)該就懂啦。

public class SwipeMenuLayout extends FrameLayout {private static final int CONTENT_VIEW_ID = 1;private static final int MENU_VIEW_ID = 2;private static final int STATE_CLOSE = 0;private static final int STATE_OPEN = 1;//方向private int mSwipeDirection;private View mContentView;private SwipeMenuView mMenuView;。。。。。public SwipeMenuLayout(View contentView, SwipeMenuView menuView) {this(contentView, menuView, null, null);}public SwipeMenuLayout(View contentView, SwipeMenuView menuView,Interpolator closeInterpolator, Interpolator openInterpolator) {super(contentView.getContext());mCloseInterpolator = closeInterpolator;mOpenInterpolator = openInterpolator;mContentView = contentView;mMenuView = menuView;//將SwipeMenuLayout設(shè)置給SwipeMenuView,用于判斷是否打開mMenuView.setLayout(this);init();}private void init() {setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));mGestureListener = new SimpleOnGestureListener() {@Overridepublic boolean onDown(MotionEvent e) {isFling = false;return true;}@Override//velocityX這個參數(shù)是x軸方向的速率,向左是負(fù)的,向右是正的public boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {// TODOif (Math.abs(e1.getX() - e2.getX()) > MIN_FLING&& velocityX < MAX_VELOCITYX) {isFling = true;}Log.i("tag","isFling="+isFling+" e1.getX()="+e1.getX()+" e2.getX()="+e2.getX()+" velocityX="+velocityX+" MAX_VELOCITYX="+MAX_VELOCITYX);// Log.i("byz", MAX_VELOCITYX + ", velocityX = " + velocityX);return super.onFling(e1, e2, velocityX, velocityY);}};mGestureDetector = new GestureDetectorCompat(getContext(),mGestureListener);。。。。LayoutParams contentParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);mContentView.setLayoutParams(contentParams);if (mContentView.getId() < 1) {//noinspection ResourceTypemContentView.setId(CONTENT_VIEW_ID);}//noinspection ResourceTypemMenuView.setId(MENU_VIEW_ID);mMenuView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));addView(mContentView);addView(mMenuView);}

 從上邊的init方法中可以看出SwipeMenuLayout由兩部分組成,分別是用戶的 item View 和 menu View 。手指的時候滑動的操作是通過?SimpleOnGestureListener?來完成的。

?

/*** 滑動事件,用于外邊調(diào)用的接口* 這是一個對外暴露的API,而調(diào)用這個API的是SwipeMenuListView,那么MotionEvent是SwipeMenuListView的MotionEvent* @param event* @return*/public boolean onSwipe(MotionEvent event) {mGestureDetector.onTouchEvent(event);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mDownX = (int) event.getX();//記下點擊的x坐標(biāo)isFling = false;break;case MotionEvent.ACTION_MOVE:// Log.i("byz", "downX = " + mDownX + ", moveX = " + event.getX());int dis = (int) (mDownX - event.getX());if (state == STATE_OPEN) {//當(dāng)狀態(tài)是open時,dis就是0Log.i("tag", "dis = " + dis);//這個值一直是0//DIRECTION_LEFT = 1 || DIRECTION_RIGHT = -1dis += mMenuView.getWidth()*mSwipeDirection;//mSwipeDirection=1Log.i("tag", "dis = " + dis + ", mSwipeDirection = " + mSwipeDirection);}Log.i("tag", "ACTION_MOVE downX = " + mDownX + ", moveX = " + event.getX()+", dis="+dis);swipe(dis);break;case MotionEvent.ACTION_UP://判斷滑動距離,是打開還是關(guān)閉//在這里,如果已經(jīng)有一個item打開了,此時滑動另外的一個item,還是執(zhí)行這個方法,怎么改進?if ((isFling || Math.abs(mDownX - event.getX()) > (mMenuView.getWidth() / 2)) &&Math.signum(mDownX - event.getX()) == mSwipeDirection) {Log.i("tag", "ACTION_UP downX = " + mDownX + ", moveX = " + event.getX());// opensmoothOpenMenu();} else {// closesmoothCloseMenu();return false;}break;}return true;}public boolean isOpen() {return state == STATE_OPEN;}/*** 滑動dis的距離,把mContentView和mMenuView都滑動dis距離* @param dis*/private void swipe(int dis) {if(!mSwipEnable){return ;}//left is positive;right is negativeif (Math.signum(dis) != mSwipeDirection) {//left=1;right =-1dis = 0; //不滑動} else if (Math.abs(dis) > mMenuView.getWidth()) {//大于它的寬度,dis就是mMenuView.getWidth()dis = mMenuView.getWidth()*mSwipeDirection;}//重新設(shè)置布局,不斷左移(或者右移),mContentView.layout(-dis, mContentView.getTop(),mContentView.getWidth() -dis, getMeasuredHeight());if (mSwipeDirection == SwipeMenuListView.DIRECTION_LEFT) {//1//同上重新設(shè)置menuview的布局,畫圖很清晰mMenuView.layout(mContentView.getWidth() - dis, mMenuView.getTop(),mContentView.getWidth() + mMenuView.getWidth() - dis,mMenuView.getBottom());} else {mMenuView.layout(-mMenuView.getWidth() - dis, mMenuView.getTop(),- dis, mMenuView.getBottom());}}/*** 更新狀態(tài)state = STATE_CLOSE;* 關(guān)閉menu*/public void smoothCloseMenu() {state = STATE_CLOSE;if (mSwipeDirection == SwipeMenuListView.DIRECTION_LEFT) {mBaseX = -mContentView.getLeft();//滑動mMenuView.getWidth()的距離,正好隱藏掉mCloseScroller.startScroll(0, 0, mMenuView.getWidth(), 0, 350);} else {mBaseX = mMenuView.getRight();mCloseScroller.startScroll(0, 0, mMenuView.getWidth(), 0, 350);}postInvalidate();}public void smoothOpenMenu() {if(!mSwipEnable){return ;}state = STATE_OPEN;if (mSwipeDirection == SwipeMenuListView.DIRECTION_LEFT) {mOpenScroller.startScroll(-mContentView.getLeft(), 0, mMenuView.getWidth(), 0, 350);Log.i("tag","mContentView.getLeft()="+mContentView.getLeft()+", mMenuView="+mMenuView.getWidth());//-451,就是移動的距離dis,-(downX-moveX)//mContentView.getLeft()=-540, mMenuView=540 ,這倆的絕對值是相等的,完全正確!哈哈·} else {mOpenScroller.startScroll(mContentView.getLeft(), 0, mMenuView.getWidth(), 0, 350);}//在非ui thread中調(diào)用這個方法,使視圖重繪postInvalidate();}。。。 }

上面主要的方法是onSwipe和swipe這兩個方法,主要邏輯是:onSwipe是暴漏給外面調(diào)用的API,

在SwipeMenuListView的onTouchEvent事件處理方法中調(diào)用了onSwipe;而swipe就是把mContentView和mMenuView都滑動dis距離?。

?

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//寬度是無限擴展的,高度是指定的mMenuView.measure(MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(getMeasuredHeight(), MeasureSpec.EXACTLY));}protected void onLayout(boolean changed, int l, int t, int r, int b) {mContentView.layout(0, 0, getMeasuredWidth(),mContentView.getMeasuredHeight());if (mSwipeDirection == SwipeMenuListView.DIRECTION_LEFT) {//左滑//相對于父view,以左邊和上邊為基準(zhǔn),隱藏在右邊mMenuView.layout(getMeasuredWidth(), 0,getMeasuredWidth() + mMenuView.getMeasuredWidth(),mContentView.getMeasuredHeight());} else { //右滑,隱藏在左邊mMenuView.layout(-mMenuView.getMeasuredWidth(), 0,0, mContentView.getMeasuredHeight());}}

 上面的onMeasure、onLayout方法就是自定義View中經(jīng)常重寫的方法,在onMeasure是測量view的大小,這里把寬度類型設(shè)置為UNSPECIFIED,可以無限擴展。 onLayout是在view的大小測量之后,把view放到父布局的什么位置,代碼里可以看出根據(jù)滑動方向吧menuView隱藏在左邊(或右邊)。

2.3 SwipeMenuAdapter

public class SwipeMenuAdapter implements WrapperListAdapter,OnSwipeItemClickListener {private ListAdapter mAdapter;private Context mContext;private SwipeMenuListView.OnMenuItemClickListener onMenuItemClickListener;public SwipeMenuAdapter(Context context, ListAdapter adapter) {mAdapter = adapter;mContext = context;}。。。。/*** 添加滑動時的顯示的菜單* 在這里可以看出每一個Item都是一個SwipeMenuLayout*/public View getView(int position, View convertView, ViewGroup parent) {SwipeMenuLayout layout = null;if (convertView == null) {View contentView = mAdapter.getView(position, convertView, parent);//item的viewSwipeMenu menu = new SwipeMenu(mContext); //創(chuàng)建SwipeMenumenu.setViewType(getItemViewType(position));createMenu(menu); //測試的,可以先不管SwipeMenuView menuView = new SwipeMenuView(menu,(SwipeMenuListView) parent);menuView.setOnSwipeItemClickListener(this);SwipeMenuListView listView = (SwipeMenuListView) parent;layout = new SwipeMenuLayout(contentView, menuView,listView.getCloseInterpolator(),listView.getOpenInterpolator());layout.setPosition(position);} else {layout = (SwipeMenuLayout) convertView;layout.closeMenu();layout.setPosition(position);View view = mAdapter.getView(position, layout.getContentView(),parent);}if (mAdapter instanceof BaseSwipListAdapter) {boolean swipEnable = (((BaseSwipListAdapter) mAdapter).getSwipEnableByPosition(position));layout.setSwipEnable(swipEnable);}return layout;}//這個方法在創(chuàng)建時,重寫啦,在這里是測試的,可以不管。public void createMenu(SwipeMenu menu) {// Test Code。。。。。。}/*** OnSwipeItemClickListener的回掉方法* 這個方法在該類創(chuàng)建時,重寫啦。*/public void onItemClick(SwipeMenuView view, SwipeMenu menu, int index) {if (onMenuItemClickListener != null) {onMenuItemClickListener.onMenuItemClick(view.getPosition(), menu,index);}}。。。。//省略了不重要的 }

  

2.4 核心類:SwipeMenuListview,

這個代碼很長,看的時候需要耐心。

public class SwipeMenuListView extends ListView {private static final int TOUCH_STATE_NONE = 0;private static final int TOUCH_STATE_X = 1;private static final int TOUCH_STATE_Y = 2;public static final int DIRECTION_LEFT = 1; //方向public static final int DIRECTION_RIGHT = -1;private int mDirection = 1;//swipe from right to left by defaultprivate int MAX_Y = 5;private int MAX_X = 3;private float mDownX;private float mDownY;private int mTouchState;private int mTouchPosition;private SwipeMenuLayout mTouchView;private OnSwipeListener mOnSwipeListener;//創(chuàng)建menuItem的private SwipeMenuCreator mMenuCreator;//menuItem的item點擊事件private OnMenuItemClickListener mOnMenuItemClickListener;private OnMenuStateChangeListener mOnMenuStateChangeListener;private Interpolator mCloseInterpolator; //動畫變化率private Interpolator mOpenInterpolator;//----added in myself--下面這兩行是我自己加的,//你如果下下來代碼demo運行下你會發(fā)現(xiàn),當(dāng)一個item已經(jīng)滑開時,滑動另外的item,此時原來打開的item沒有關(guān)閉,可以看下QQ的側(cè)滑,它是關(guān)閉的,我這里就稍微修改了下。private int mOldTouchPosition = -1;private boolean shouldCloseMenu;//--------public SwipeMenuListView(Context context) {super(context);init();}public SwipeMenuListView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}public SwipeMenuListView(Context context, AttributeSet attrs) {super(context, attrs);init();}//初始化變量private void init() {MAX_X = dp2px(MAX_X);MAX_Y = dp2px(MAX_Y);mTouchState = TOUCH_STATE_NONE;}@Override/*** 對參數(shù)adapter進行了一次包裝,包裝成SwipeMenuAdapter*/public void setAdapter(ListAdapter adapter) {super.setAdapter(new SwipeMenuAdapter(getContext(), adapter) {@Overridepublic void createMenu(SwipeMenu menu) {if (mMenuCreator != null) {mMenuCreator.create(menu);}}@Overridepublic void onItemClick(SwipeMenuView view, SwipeMenu menu,int index) {boolean flag = false;if (mOnMenuItemClickListener != null) {flag = mOnMenuItemClickListener.onMenuItemClick(view.getPosition(), menu, index);}//再次點擊list中的item關(guān)閉menuif (mTouchView != null && !flag) {mTouchView.smoothCloseMenu();}}});}。。。。。@Override//攔截事件,判斷事件是點擊事件還是滑動事件public boolean onInterceptTouchEvent(MotionEvent ev) {//在攔截處處理,在滑動設(shè)置了點擊事件的地方也能swip,點擊時又不能影響原來的點擊事件int action = ev.getAction();switch (action) {case MotionEvent.ACTION_DOWN:mDownX = ev.getX();mDownY = ev.getY();boolean handled = super.onInterceptTouchEvent(ev);mTouchState = TOUCH_STATE_NONE; //每次Down都把狀態(tài)變?yōu)闊o狀態(tài)//返回item的positionmTouchPosition = pointToPosition((int) ev.getX(), (int) ev.getY());//得到那個點擊的item對應(yīng)的view,就是SwipeMenuLayoutView view = getChildAt(mTouchPosition - getFirstVisiblePosition());//只在空的時候賦值 以免每次觸摸都賦值,會有多個open狀態(tài)if (view instanceof SwipeMenuLayout) {//如果有打開了 就攔截.mTouchView是SwipeMenuLayout//如果兩次是一個mTouchView,更新mTouchView;如果不是一個view,就攔截返回trueif (mTouchView != null && mTouchView.isOpen() && !inRangeOfView(mTouchView.getMenuView(), ev)) {Log.i("tag","Listview中的onInterceptTouchEvent ACTION_DOWN。");return true;}mTouchView = (SwipeMenuLayout) view;mTouchView.setSwipeDirection(mDirection);//默認(rèn)是left=1}//如果摸在另外一個view,攔截此事件if (mTouchView != null && mTouchView.isOpen() && view != mTouchView) {handled = true;}if (mTouchView != null) {mTouchView.onSwipe(ev);}return handled;case MotionEvent.ACTION_MOVE: //MOVE時攔截事件,在onTouch中進行處理float dy = Math.abs((ev.getY() - mDownY));float dx = Math.abs((ev.getX() - mDownX));if (Math.abs(dy) > MAX_Y || Math.abs(dx) > MAX_X) {//每次攔截的down都把觸摸狀態(tài)設(shè)置成了TOUCH_STATE_NONE 只有返回true才會走onTouchEvent 所以寫在這里就夠了if (mTouchState == TOUCH_STATE_NONE) {if (Math.abs(dy) > MAX_Y) {mTouchState = TOUCH_STATE_Y;} else if (dx > MAX_X) {mTouchState = TOUCH_STATE_X;if (mOnSwipeListener != null) {mOnSwipeListener.onSwipeStart(mTouchPosition);}}}return true;}}return super.onInterceptTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent ev) {if (ev.getAction() != MotionEvent.ACTION_DOWN && mTouchView == null)return super.onTouchEvent(ev);int action = ev.getAction();switch (action) {case MotionEvent.ACTION_DOWN: //這個DOWN事件的前提是已經(jīng)攔截事件啦,所以可能的情況時:1.該menu已經(jīng)滑出來,再點擊左邊的item區(qū)域//2.menu已經(jīng)滑出來,點擊了其他的item//3.滑動item時,先DOWN在MOVELog.i("tag","Listview中的onTouchEvent ACTION_DOWN。是否點擊了另一個item");int oldPos = mTouchPosition; //這里設(shè)計不合理,onInterceptTouchEvent之后直接調(diào)用的這個事件,mTouchPosition是一樣的if(mOldTouchPosition == -1){//-1 is the original valuemOldTouchPosition = mTouchPosition;}mDownX = ev.getX();mDownY = ev.getY();mTouchState = TOUCH_STATE_NONE;mTouchPosition = pointToPosition((int) ev.getX(), (int) ev.getY());//list中//這里改了,pldPos沒有用,改為mOldTouchPositionif (mTouchPosition == mOldTouchPosition && mTouchView != null&& mTouchView.isOpen()) {mTouchState = TOUCH_STATE_X; //x方向(橫著)滑開//調(diào)用SwipeMenuLayout的onSwipe()事件接口mTouchView.onSwipe(ev);Log.i("tag","Listview中的onTouchEvent ACTION_DOWN。滑動了或點擊了另一個item");return true;}if(mOldTouchPosition != mTouchPosition){ //when the DOWN position is different//shouldCloseMenu = true;mOldTouchPosition = mTouchPosition;}View view = getChildAt(mTouchPosition - getFirstVisiblePosition());//已經(jīng)有一個menu滑開了,此時如果點擊了另一個item//這個方法永遠(yuǎn)執(zhí)行不到!if (mTouchView != null && mTouchView.isOpen()) {//關(guān)閉swipeMenumTouchView.smoothCloseMenu();mTouchView = null;// return super.onTouchEvent(ev);// try to cancel the touch eventMotionEvent cancelEvent = MotionEvent.obtain(ev);cancelEvent.setAction(MotionEvent.ACTION_CANCEL);onTouchEvent(cancelEvent); //取消事件,時間結(jié)束//進行menu close的回掉if (mOnMenuStateChangeListener != null) {mOnMenuStateChangeListener.onMenuClose(oldPos);}return true;}if (view instanceof SwipeMenuLayout) {mTouchView = (SwipeMenuLayout) view;mTouchView.setSwipeDirection(mDirection);}if (mTouchView != null) {mTouchView.onSwipe(ev);}break;case MotionEvent.ACTION_MOVE://有些可能有header,要減去header再判斷mTouchPosition = pointToPosition((int) ev.getX(), (int) ev.getY()) - getHeaderViewsCount();//如果滑動了一下沒完全展現(xiàn),就收回去,這時候mTouchView已經(jīng)賦值,再滑動另外一個不可以swip的view//會導(dǎo)致mTouchView swip 。 所以要用位置判斷是否滑動的是一個viewif (!mTouchView.getSwipEnable() || mTouchPosition != mTouchView.getPosition()) {break;}float dy = Math.abs((ev.getY() - mDownY));float dx = Math.abs((ev.getX() - mDownX));if (mTouchState == TOUCH_STATE_X) { //X方向的話if (mTouchView != null) {mTouchView.onSwipe(ev); //調(diào)用滑動事件}getSelector().setState(new int[]{0});ev.setAction(MotionEvent.ACTION_CANCEL);super.onTouchEvent(ev);//事件結(jié)束return true;} else if (mTouchState == TOUCH_STATE_NONE) {//DOWN事件后的Moveif (Math.abs(dy) > MAX_Y) {mTouchState = TOUCH_STATE_Y;} else if (dx > MAX_X) {mTouchState = TOUCH_STATE_X;if (mOnSwipeListener != null) {mOnSwipeListener.onSwipeStart(mTouchPosition);}}}break;case MotionEvent.ACTION_UP: //關(guān)閉了menuLog.i("tag","onTouchEvent事件的ACTION_UP");if (mTouchState == TOUCH_STATE_X) {if (mTouchView != null) {Log.i("tag","onTouchEvent事件的ACTION_UP 為什么沒有關(guān)閉");boolean isBeforeOpen = mTouchView.isOpen();//調(diào)用滑動事件mTouchView.onSwipe(ev);boolean isAfterOpen = mTouchView.isOpen();if (isBeforeOpen != isAfterOpen && mOnMenuStateChangeListener != null) {if (isAfterOpen) {mOnMenuStateChangeListener.onMenuOpen(mTouchPosition);} else {mOnMenuStateChangeListener.onMenuClose(mTouchPosition);}}if (!isAfterOpen) {mTouchPosition = -1;mTouchView = null;}}if (mOnSwipeListener != null) {//進行滑動結(jié)束的回掉mOnSwipeListener.onSwipeEnd(mTouchPosition);}ev.setAction(MotionEvent.ACTION_CANCEL);super.onTouchEvent(ev);return true;}break;}return super.onTouchEvent(ev);}public void smoothOpenMenu(int position) {if (position >= getFirstVisiblePosition()&& position <= getLastVisiblePosition()) {View view = getChildAt(position - getFirstVisiblePosition());if (view instanceof SwipeMenuLayout) {mTouchPosition = position;if (mTouchView != null && mTouchView.isOpen()) {mTouchView.smoothCloseMenu();}mTouchView = (SwipeMenuLayout) view;mTouchView.setSwipeDirection(mDirection);mTouchView.smoothOpenMenu();}}}/*** 可以進去看源代碼,就是將不同的單位統(tǒng)一轉(zhuǎn)換成像素px,這里是dp->px* @param dp* @return*/private int dp2px(int dp) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,getContext().getResources().getDisplayMetrics());}public static interface OnMenuItemClickListener {boolean onMenuItemClick(int position, SwipeMenu menu, int index);}public static interface OnSwipeListener {void onSwipeStart(int position);void onSwipeEnd(int position);}public static interface OnMenuStateChangeListener {void onMenuOpen(int position);void onMenuClose(int position);}。。。。 }

這個類中最重要的邏輯就是關(guān)于事件的判斷和分發(fā),什么時候攔截事件,不同的事件對應(yīng)什么操作。如果對事件分發(fā)不清楚的同學(xué),可以在網(wǎng)上找找相關(guān)的博客,也可以看我的后續(xù)博客,應(yīng)該這兩天的事。

在這里分析SwipeMenuListView的事件分發(fā)邏輯:核心就是SwipeMenuListView中item的點擊事件和滑動事件的處理。當(dāng)滑動時SwipeMenuListView攔截事件,自己處理,記住這個邏輯看代碼就一目了然了。下面是我畫的一個事件分發(fā)流程圖:

觸摸事件是一個事件序列:ACTION_DOWN->ACTION_MOVE->....ACTION_MOVE->ACTION_UP. 以ACTION_DOWN開始,以ACTION_UP結(jié)束。

下邊是我的一個打印的流程:(自己在代碼中加log)

I/tag: Listview中的onInterceptTouchEvent ACTION_DOWN。view=class com.baoyz.swipemenulistview.SwipeMenuLayout I/tag: onInterceptTouchEvent ACTION_DOWN handled=false I/tag: SwipeMenuLayout onTouchEvent I/tag: Listview中的onTouchEvent ACTION_DOWN。是否點擊了另一個item I/tag: oldPos=1 mTouchPosition=1 I/tag: ACTION_MOVE downX = 987, moveX = 906.69666, dis=80 I/tag: ACTION_MOVE downX = 987, moveX = 855.5785, dis=131 I/tag: ACTION_MOVE downX = 987, moveX = 797.6258, dis=189 I/tag: ACTION_MOVE downX = 987, moveX = 735.9639, dis=251 I/tag: ACTION_MOVE downX = 987, moveX = 666.5104, dis=320 I/tag: ACTION_MOVE downX = 987, moveX = 589.0626, dis=397 I/tag: ACTION_MOVE downX = 987, moveX = 509.15567, dis=477 I/tag: ACTION_MOVE downX = 987, moveX = 431.7224, dis=555 I/tag: ACTION_MOVE downX = 987, moveX = 361.2613, dis=625 I/tag: ACTION_MOVE downX = 987, moveX = 319.70398, dis=667 I/tag: onTouchEvent事件的ACTION_UP I/tag: onTouchEvent事件的ACTION_UP 為什么沒有關(guān)閉 I/tag: isFling=true e1.getX()=987.08606 e2.getX()=319.70398 velocityX=-4122.911 MAX_VELOCITYX=-1500 I/tag: ACTION_UP downX = 987, moveX = 319.70398 I/tag: mContentView.getLeft()=-540, mMenuView=540

?三、存在的問題

1.如果你下下來框架運行了,你會發(fā)現(xiàn)一個問題:

? 當(dāng)ListView的一個item已經(jīng)滑開,假設(shè)為item1;此時滑動另外一個的item,叫它item2;

? 這種情況下item1不會關(guān)閉,item2當(dāng)然也不會打開。

? 這種效果并不好,我在代碼中已經(jīng)修改了這個問題。具體代碼,我已經(jīng)標(biāo)明。

2.就是下面的這段代碼:在SwipeMenuListView的onTouchEvent(MotionEvent ev)的ACTION_DOWN中,這段代碼永遠(yuǎn)不會執(zhí)行到,因為?onTouchEvent和onInterceptTouchEvent?對應(yīng)的一個MotionEvent。

mTouchPosition ==oldPos?永遠(yuǎn)相等。

//這個方法永遠(yuǎn)執(zhí)行不到!作者的愿意是當(dāng)mTouchPosition != oldPos時CloseMenu,但是按照這個代碼這兩個值是永遠(yuǎn)相等的,//因為對應(yīng)的是一個MotionEvent當(dāng)然就相等啦if (mTouchView != null && mTouchView.isOpen()) {//關(guān)閉swipeMenumTouchView.smoothCloseMenu();//mTouchView = null;// return super.onTouchEvent(ev);// try to cancel the touch eventMotionEvent cancelEvent = MotionEvent.obtain(ev);cancelEvent.setAction(MotionEvent.ACTION_CANCEL);onTouchEvent(cancelEvent); //取消事件,時間結(jié)束//進行menu close的回掉if (mOnMenuStateChangeListener != null) {mOnMenuStateChangeListener.onMenuClose(oldPos);}return true;}

在代碼中我已經(jīng)修改了這個問題。目前已經(jīng)在github上提交給原作者啦。

轉(zhuǎn)載請注明出處:http://www.cnblogs.com/jycboy/p/SwipeMenuListView.html

?

轉(zhuǎn)載于:https://www.cnblogs.com/jycboy/p/SwipeMenuListView.html

總結(jié)

以上是生活随笔為你收集整理的Android 滑动菜单框架--SwipeMenuListView框架完全解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

亚洲一区二区三区精品在线观看 | 久久九九影院 | 亚洲欧美日韩一二三区 | 日韩高清不卡一区二区三区 | 中文字幕av播放 | 国产精品成人一区二区三区吃奶 | 国产性天天综合网 | 欧美一区在线观看视频 | 永久免费毛片在线观看 | 国产五月婷婷 | 91精品国产综合久久福利不卡 | 精品一区二区免费 | 中日韩三级视频 | 久久综合久久综合久久综合 | 人人精品久久 | 免费观看的黄色 | 免费看的黄色录像 | 视频在线播放国产 | 中文字幕日韩精品有码视频 | 欧洲一区二区在线观看 | 精品久久久久久久久久岛国gif | 国产精品久久久久久久久久久久 | 狠狠躁18三区二区一区ai明星 | 国产精品一区二区av | 午夜在线免费观看 | 精品亚洲一区二区 | 天堂av网站| 欧美一级视频一区 | 久久成人亚洲欧美电影 | 99爱视频| 欧美久久久久久久久久久 | 一区二区三区在线观看中文字幕 | 婷婷在线免费视频 | 精品女同一区二区三区在线观看 | 精品视频免费在线 | 国产成人61精品免费看片 | 国产精品亚洲片夜色在线 | 天天爱天天操天天干 | 亚洲精品在线视频 | 97色噜噜| 午夜国产在线观看 | 久久久久精 | 欧美一级特黄aaaaaa大片在线观看 | 久久草视频 | 日韩国产欧美视频 | av电影不卡在线 | 人人爽人人片 | 精品视频在线免费 | 中文字幕在线观看第一区 | 日韩欧美精品一区二区三区经典 | 亚洲一区二区三区毛片 | 久久国产精品99久久久久久进口 | 久久综合九色综合欧美就去吻 | 久久精品国产精品 | 欧美色噜噜噜 | 日韩四虎 | 2022国产精品视频 | 日韩激情精品 | 久久在线视频精品 | 国产成人精品一区二区三区免费 | 日韩三级成人 | 狠狠色丁香婷婷综合久小说久 | 91最新网址 | 亚洲精品国精品久久99热一 | 欧美日韩高清一区二区三区 | 午夜精品久久久久久久久久久久久久 | 婷婷综合影院 | 日本h视频在线观看 | 日批视频 | 亚洲午夜在线视频 | 国产高清久久 | 激情网五月婷婷 | av线上免费看 | 日韩经典一区二区三区 | 欧美激情综合五月色丁香 | 成人黄在线| 日韩a在线看| 国产精品九九视频 | 特级毛片在线 | 911国产精品| 91福利影院在线观看 | 九九热视频在线免费观看 | 91在线九色 | 一本色道久久精品 | 久久精品在线免费观看 | 91精品国自产在线观看欧美 | 九九久久久久久久久激情 | 天天伊人网 | 99精品福利| 超碰人人草 | 91插插视频 | 蜜臀av免费一区二区三区 | 99久热| 日韩一区二区三区高清免费看看 | 欧美日韩国产一二 | www黄色软件 | 在线成人免费电影 | 色婷婷狠 | 亚洲1区 在线 | 色婷婷亚洲综合 | 久久婷亚洲五月一区天天躁 | 国产中文字幕视频 | 亚洲国内精品 | 一区 在线 影院 | 国产精品 日韩精品 | 天天草天天插 | 97超碰免费 | 国产黄色a | 高清av免费一区中文字幕 | 久久精品99视频 | 国产私拍在线 | 天天射天天搞 | 国产91小视频 | 亚洲九九 | 丁香影院在线 | 911国产精品| 综合色久 | 亚洲午夜久久久久久久久 | 高清有码中文字幕 | 激情久久小说 | 中文字幕免费一区 | 国产糖心vlog在线观看 | 日日噜噜噜噜夜夜爽亚洲精品 | 夜夜看av| 亚洲天天综合网 | 欧美日韩后 | 国产视频中文字幕 | 欧美日韩精品电影 | 99热精品在线观看 | 天天添夜夜操 | 精品a视频| 国内一级片在线观看 | 欧美日韩国产综合网 | 久久影院一区 | 国产精品久99 | 国产精品一区二区在线看 | 国产成人精品亚洲a | av日韩精品| av中文电影 | 成人免费视频网址 | 91亚洲精品视频 | 西西www4444大胆在线 | 91麻豆精品国产91 | 五月天婷婷狠狠 | 国产又粗又猛又黄又爽 | 91亚色视频在线观看 | 97视频资源 | 免费av成人在线 | 国产成人高清 | 国产精品久久久久影院 | 天天在线视频色 | 亚洲最新av网站 | 人人澡澡人人 | 中文字幕 91 | 国产福利精品在线观看 | 黄色片网站 | 久久综合九色综合久99 | 在线观看日韩av | 久久女同性恋中文字幕 | 网站在线观看你们懂的 | 久久99精品久久只有精品 | 久久免费电影 | 亚洲三级影院 | 成人在线播放免费观看 | 日韩.com | 国产精品久久久久久久午夜片 | 四虎国产精品免费观看视频优播 | 99久久久久免费精品国产 | 亚洲精品中文在线 | 精品一二区 | 521色香蕉网站在线观看 | 久久69av| 日韩激情在线 | 国产在线va | 国产成人精品在线 | 一区二区视频欧美 | 欧美精品999 | 日韩免费b | 五月婷在线视频 | 在线观看国产日韩欧美 | 久久久久久久久久久久久国产精品 | 亚洲精品一区二区久 | 在线免费观看成人 | 日韩大陆欧美高清视频区 | 中文字幕视频播放 | 欧美性色19p | 黄色毛片观看 | 国产97视频| www九九热 | 国产成人久久 | 在线免费视频你懂的 | 欧美日韩后 | 色综合久久网 | 国产精品久久久久久久7电影 | 午夜精品视频在线 | 国产日韩中文字幕在线 | 在线视频app | 成人免费观看大片 | 又黄又爽又无遮挡的视频 | 国产区第一页 | 日韩av电影一区 | 日本不卡123区 | 国产精品激情在线观看 | 精品久久久久久亚洲综合网 | 久久免费的精品国产v∧ | 国产精品国产三级国产不产一地 | 国产精品不卡视频 | 在线视频a | 日韩18p| 91久久国产自产拍夜夜嗨 | av电影久久 | 在线观看色视频 | 久久久精品欧美一区二区免费 | 91精品国产自产在线观看永久 | 操操操日日日干干干 | 欧美伦理一区二区 | 久久成人午夜 | 精品国产视频在线 | 国产视频资源在线观看 | 国产精品观看在线亚洲人成网 | 亚洲精品色婷婷 | 欧美成人精品欧美一级乱黄 | 国产精品18久久久久久vr | 中文字幕三区 | 99精品美女 | 国产一级黄大片 | 国产精品av免费 | 亚洲综合黄色 | 亚洲视频一 | 一级免费看 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产精品手机在线播放 | 国产在线不卡 | 欧美在线日韩在线 | 日本丶国产丶欧美色综合 | 91污在线观看| a级黄色片视频 | 国产精品久久电影网 | 色亚洲网| 视频国产一区二区三区 | 免费成人av | 国产一区在线免费观看视频 | 97视频在线免费 | 国产成人在线免费观看 | 96久久精品| 日韩高清在线看 | 欧美精品少妇xxxxx喷水 | 欧美日韩在线视频一区二区 | 四虎4hu永久免费 | 一色屋精品视频在线观看 | 四虎在线影视 | 手机看片午夜 | 麻豆久久一区二区 | 午夜91在线 | 欧美日韩一区二区三区不卡 | 成人免费在线观看入口 | 中文字幕色播 | 在线成人免费电影 | 中文字幕丝袜一区二区 | 一区二区观看 | 99热在线精品观看 | 亚洲激情在线 | 色播激情五月 | 五月激情站 | 欧美日韩在线免费观看 | 久久国语露脸国产精品电影 | 高清视频一区 | 一区二区视 | 亚洲一区久久久 | 亚洲精品中文字幕视频 | 免费av免费观看 | 免费的黄色的网站 | 免费av网址大全 | av免费片 | 91超在线| 精品视频一区在线 | 999超碰| 午夜狠狠操| 国产精品高潮在线观看 | 91视频电影| 园产精品久久久久久久7电影 | 国产精品一区二区在线观看 | 久久久久国产a免费观看rela | 狠狠ri| 欧美精品久久久久性色 | 91豆花在线| 色吊丝在线永久观看最新版本 | 啪啪免费视频网站 | 久久新视频 | 国产一级在线免费观看 | 成人h视频在线播放 | 国产精品大片在线观看 | 日韩网站在线免费观看 | 天天躁日日躁狠狠躁 | www久久国产 | 天天操天天操天天 | 激情av在线播放 | 九色免费视频 | 69精品在线观看 | 国产成人精品一区二区在线 | 九九热视频在线 | 国产精品 亚洲精品 | 久久伊人精品天天 | 亚洲一级黄色 | 91精品国自产在线 | 国产超碰在线观看 | 久久国产网 | 国内99视频 | 久久综合国产伦精品免费 | 日韩超碰 | 五月亚洲婷婷 | 在线免费黄色av | 99这里只有精品视频 | 91视频电影 | 欧美久久久久久久久久久久久 | 九九免费在线看完整版 | 美女啪啪图片 | 一区二区三区www | 亚洲视频www | 欧美日韩国产在线 | 97看片吧 | 在线观看亚洲免费视频 | 精品国偷自产在线 | 日韩一区精品 | 国产精品亚洲成人 | 久久久精品日本 | 国产色区 | 精品99免费 | 国产 日韩 欧美 自拍 | 日韩高清毛片 | 超碰公开97| 久热av| 狠狠狠色丁香婷婷综合久久88 | 国产福利a | 91手机视频在线 | 久久免费影院 | 四虎影院在线观看av | 亚洲综合一区二区精品导航 | 国产精品v a免费视频 | 在线观看深夜视频 | 国产 在线 日韩 | 午夜久久久久久久久 | 国产一区二区三区久久久 | 97香蕉久久国产在线观看 | 激情网五月 | 欧美色图另类 | 国产1区在线观看 | 国产精品999久久久 久产久精国产品 | 欧美日本啪啪无遮挡网站 | 色综合天天综合网国产成人网 | 日韩av一卡二卡三卡 | 国产破处精品 | 免费福利片2019潦草影视午夜 | 久久久久激情 | 国产五月色婷婷六月丁香视频 | 国产又粗又猛又色又黄网站 | 免费视频99 | 久久av电影 | 国产成人在线看 | 国产亚洲成人网 | 97免费中文视频在线观看 | 天天操天天摸天天爽 | 伊人狠狠色丁香婷婷综合 | 国产视频在线播放 | 五月色婷 | 亚洲一级国产 | 日韩av网址在线 | 亚洲激情六月 | 丁香五月缴情综合网 | 香蕉视频久久久 | 亚洲成人黄色在线观看 | 91中文在线视频 | 91大神精品视频在线观看 | 日本在线观看中文字幕 | 日本性动态图 | 日本精品一区二区在线观看 | 波多野结衣一区二区三区中文字幕 | 亚洲v欧美v国产v在线观看 | 五月天开心 | 欧美xxxxx在线视频 | 国产精品第54页 | 国产精品毛片久久久 | 91精品专区 | av高清在线观看 | 久久在线视频精品 | 91自拍视频在线观看 | 久久这里只有精品9 | 中文有码在线 | 狠狠色丁香九九婷婷综合五月 | 黄色av免费看 | 超碰公开在线观看 | 超级av在线 | 麻花传媒mv免费观看 | 色妞久久福利网 | 天天色天天操天天爽 | 91久色蝌蚪 | 国产精品a久久久久 | 中文字幕在线观看第三页 | av色综合| 欧美成人在线网站 | 国产一区二区在线视频观看 | 香蕉视频日本 | 嫩小bbbb摸bbb摸bbb | 国产精品美女在线观看 | www.啪啪.com | 午夜12点| 亚洲国产高清视频 | 国产剧情av在线播放 | 亚洲精品色 | 精品人妖videos欧美人妖 | 日韩精品中文字幕av | 国产精品成久久久久 | 综合久久五月天 | 91在线www | 亚洲免费在线观看视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲欧美视频在线 | 西西大胆免费视频 | 99免费观看视频 | 久久久99精品免费观看乱色 | 9色在线视频 | 操碰av| 亚洲毛片在线观看. | 久久成年人网站 | 免费视频一二三 | 国产精品毛片久久 | 超碰com| 国产在线观看午夜 | 婷婷久久网 | 香蕉视频色 | 久久国产精品电影 | 日韩国产精品久久 | 四虎影视成人永久免费观看亚洲欧美 | 久久永久免费 | 成人91在线观看 | 97超视频免费观看 | 国产精品成人自产拍在线观看 | 欧美黑吊大战白妞欧美 | 午夜国产一区二区 | 日韩免费三区 | 免费三级骚| 国产精品美女免费看 | 国产午夜影院 | 久久国产综合视频 | 亚洲国产中文字幕在线观看 | 中文字幕在线看 | 色射色 | 亚洲精品啊啊啊 | 亚洲精品在线一区二区 | 久久久久久久久国产 | 人人射av | 极品嫩模被强到高潮呻吟91 | 狠狠色丁香婷婷综合久小说久 | 日本在线中文在线 | 婷婷激情久久 | 一区二区三区国产欧美 | 99久久婷婷国产精品综合 | 丝袜精品视频 | 国产精品综合久久久久 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 国产成人免费观看久久久 | 99久久精品国产毛片 | 99精品国产成人一区二区 | 中文字幕第 | 日日夜夜精品免费 | 日本久草电影 | 97超级碰 | 91tv国产成人福利 | 久久久久免费网站 | 三级av网| 在线视频观看成人 | 欧美一区二区三区在线观看 | 99精品久久只有精品 | 女人久久久久 | 91欧美在线| 99视频精品在线 | 黄色大片免费网站 | 国产精品成人在线观看 | 成人黄色电影免费观看 | 日本中文字幕网址 | 丝袜+亚洲+另类+欧美+变态 | 日日爽夜夜爽 | 日本久久久亚洲精品 | 麻豆一区在线观看 | 欧美日韩视频观看 | 国产成人久久 | 久久精品aaa | 欧洲亚洲精品 | 久久99国产精品自在自在app | 一区二区电影在线观看 | 伊人天堂久久 | x99av成人免费 | 欧美一区二区三区在线 | 国产精品视频 | 久草在线在线精品观看 | 日韩中文字幕视频在线观看 | va视频在线 | 99热超碰在线 | 中文日韩在线 | 亚洲国产免费网站 | 久久久精品欧美一区二区免费 | 中文超碰字幕 | 日韩在线观看精品 | 九九日韩 | 成人宗合网 | 伊人婷婷激情 | 国产最新在线视频 | 美女黄视频免费看 | 国产精品片 | 日韩av成人在线 | 视频精品一区二区三区 | 超碰激情在线 | 探花视频在线观看+在线播放 | 国产一区二区在线看 | 欧美日韩国产一区二区在线观看 | 色综合久久88 | 91禁看片 | 国产在线一区二区 | 欧美日韩一区二区三区在线免费观看 | 久久精品xxx| 国产色一区 | 免费观看的av网站 | 99精品免费久久久久久久久日本 | 亚洲激精日韩激精欧美精品 | 久久人人爽爽 | 欧美少妇xxx | 欧美另类视频 | 一级c片| 亚洲精品国偷拍自产在线观看 | 五月婷婷激情五月 | 国产中文字幕在线观看 | 91视频成人免费 | 五月婷在线播放 | 久久成人亚洲欧美电影 | 亚洲区另类春色综合小说校园片 | 国产热re99久久6国产精品 | 中文字幕在线观看第三页 | 国产xx视频| 在线观看亚洲免费视频 | 国产婷婷一区二区 | 在线免费高清视频 | 97超碰人人爱 | 麻花豆传媒一二三产区 | 天天操天天色天天射 | www·22com天天操| 麻豆久久一区二区 | 91亚洲精品久久久中文字幕 | 久久伊人操 | 婷婷色影院 | 欧美欧美 | 国产精品一区二区白浆 | 精品国产视频在线观看 | 精品久久久久免费极品大片 | 日韩精品在线免费播放 | 欧美国产日韩一区二区三区 | www.五月天激情 | 久久久国产精品一区二区中文 | 国产在线不卡精品 | 免费亚洲黄色 | 亚洲国产精品成人女人久久 | 91视频麻豆视频 | 夜夜骑日日 | 国产你懂的在线 | 波多野结衣在线中文字幕 | 人人精品久久 | 国产精品一区二区视频 | 日韩精品中文字幕在线不卡尤物 | 亚洲精品综合在线观看 | 天天操综合 | 99精品视频在线观看播放 | 国产精品一级视频 | 精品视频免费观看 | 免费三级影片 | 中文永久免费观看 | av在线激情 | 又黄又刺激视频 | 99婷婷 | 欧美午夜精品久久久久久浪潮 | 国产精品热视频 | 欧美综合在线视频 | 久久爱影视i | 亚洲精品久久久蜜臀下载官网 | 国产精品va视频 | 亚洲综合精品在线 | www.香蕉视频 | 亚洲精品在线免费 | 国产精品大尺度 | 四虎国产精品免费观看视频优播 | 国产一区二区综合 | 欧美视频国产视频 | 最近日本字幕mv免费观看在线 | 欧美日韩网站 | 天天干,天天操,天天射 | 色婷婷 亚洲 | 天天操天天爽天天干 | 麻豆视传媒官网免费观看 | 国产精品美乳一区二区免费 | 精品福利av | 久久精品99久久久久久2456 | 日韩免费不卡av | 六月丁香婷| 蜜桃视频成人在线观看 | 国产精品久久 | 亚洲综合成人在线 | 国产免费资源 | 亚洲在线视频免费 | 亚洲婷婷网 | av中文字幕在线观看网站 | 久草在线费播放视频 | 91香蕉视频 mp4 | 婷婷久久一区二区三区 | 久久精品观看 | 久久综合九色九九 | av在线网站免费观看 | 国产精品黑丝在线观看 | 日本中文字幕视频 | 成人中心免费视频 | 国产高清视频在线播放 | 免费观看的av网站 | 一区av在线播放 | 日韩综合视频在线观看 | 久久在线播放 | 国产精品久久99综合免费观看尤物 | 久久久精选 | 精品在线小视频 | 国产黄色一级片在线 | 91看片淫黄大片91 | 国产一区私人高清影院 | 日日爽天天 | 亚洲91av| 天海翼一区二区三区免费 | 天堂资源在线观看视频 | 国产一区二区免费在线观看 | www.国产在线观看 | 成年人毛片在线观看 | 欧美一级性 | 中文字幕av影院 | 精品日本视频 | wwxxxx日本 | 天天射天天色天天干 | 久久久 激情| 亚洲黑丝少妇 | 精品一区二区三区香蕉蜜桃 | 精品国产电影一区 | 国产夫妻性生活自拍 | 国产福利小视频在线 | 波多野结衣在线观看一区二区三区 | 婷婷久久亚洲 | 91精品久| 五月天久久久久久 | 亚洲桃花综合 | 日韩欧美国产激情在线播放 | www久久| 久久国产精品免费观看 | 国产三级精品三级在线观看 | 久久久一本精品99久久精品66 | 在线免费观看黄色 | 在线中文字母电影观看 | 色www永久免费| 免费在线观看日韩视频 | 久久久综合电影 | 欧美日韩国产一二三区 | 欧美激情综合五月色丁香 | 最新中文在线视频 | 四虎永久网站 | 国产精品久久久久久久久久久久午夜片 | 日日爽日日操 | 国产精品24小时在线观看 | 久热久草 | 色婷婷狠狠五月综合天色拍 | 亚洲一区视频在线播放 | 日韩免费成人av | 在线免费观看黄 | 亚洲视频综合在线 | 久久专区 | 午夜三级毛片 | 国产一级电影在线 | 国产欧美精品一区二区三区四区 | 国产精品一区欧美 | 狠狠色狠狠色综合系列 | 99爱精品视频 | 在线看日韩 | 亚洲人天堂 | 一本色道久久精品 | 国产午夜精品一区二区三区在线观看 | 808电影| 免费在线观看黄 | 成人欧美日韩国产 | 国产专区欧美专区 | 国产视频精品免费播放 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 一区精品在线 | 中文字幕在 | 狠狠色丁香婷婷综合久久片 | 久久综合九色综合久久久精品综合 | 少妇性bbb搡bbb爽爽爽欧美 | 正在播放国产一区 | www.五月激情.com | 亚洲精品一区二区三区在线观看 | 久久影视一区 | 国产黄色免费 | 在线观看免费观看在线91 | 久久久久久久久久毛片 | 精品在线播放视频 | 深夜福利视频一区二区 | 日韩免费中文字幕 | 亚洲 欧洲 国产 日本 综合 | 久久久黄视频 | 国产免费久久 | 国产视频综合在线 | 日本免费久久高清视频 | 亚洲欧洲精品一区二区 | 欧美日韩中文字幕视频 | 中文字幕 91 | 免费av黄色 | 天天操天天谢 | 日日激情 | 水蜜桃亚洲一二三四在线 | 在线观看中文字幕网站 | 成人黄色短片 | 国产香蕉视频在线观看 | 婷婷在线色| 日韩av成人在线 | 国产一区福利在线 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 激情五月五月婷婷 | 亚洲免费精彩视频 | 怡红院av | 日韩动漫免费观看高清完整版在线观看 | 国产一级视频免费看 | 天天做天天爱天天综合网 | 亚洲精品日韩一区二区电影 | 亚洲国产日韩一区 | 深爱五月激情五月 | 人人添人人澡人人澡人人人爽 | 国产伦理一区二区三区 | 日本久久免费电影 | 碰超在线观看 | 国产精品久久久久久久久久免费看 | 国产精品久久久久亚洲影视 | 亚洲视频电影在线 | 五月激情丁香婷婷 | 久久久久久久久免费视频 | 欧美激情第八页 | 日韩视频1区 | www.超碰| 日本中文字幕网 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 99视屏 | 国产精品国产亚洲精品看不卡 | 天天摸日日摸人人看 | 色婷婷啪啪免费在线电影观看 | 亚洲 欧美 变态 国产 另类 | 综合五月婷婷 | 亚洲精品美女久久17c | av丝袜在线| 国产精品久久久久久久久久东京 | 免费久久久 | 99视频在线精品 | 最新国产在线视频 | 亚洲国产日韩一区 | www.com久久久| 中文在线字幕免费观看 | www色com| 福利视频网址 | 人人干人人爽 | 久久草网站 | 色综合天天狠天天透天天伊人 | 国产成人一区二区三区 | 黄色一及电影 | 91亚洲永久精品 | 国产人成免费视频 | 久草影视在线观看 | 美女精品在线观看 | 国产精品国产三级国产专区53 | 国产在线观看你懂得 | 黄色录像av| 免费观看成人网 | 国产精品日韩在线播放 | 国产精品麻豆视频 | 免费看的黄色片 | 日批视频在线 | 国产精品女同一区二区三区久久夜 | 国产精品久久久久久久久久免费 | 午夜精品久久久 | 狠狠色丁香婷婷综合基地 | 激情片av| 欧美久久九九 | 免费在线观看av网站 | 久久久久久美女 | 一区二区中文字幕在线 | 91视频三区 | 国产美女主播精品一区二区三区 | 天天干天天碰 | 国产馆在线播放 | 日韩在线免费看 | 最近中文字幕免费视频 | 精品国产一区二区三区四区vr | 操操操日日 | 久久九九影视 | 激情综合五月天 | 日韩精品中文字幕在线 | 国产福利91精品一区二区三区 | 久99久视频 | 欧美在线aaa | av三级av| 日韩精品一区二区免费视频 | 婷婷干五月 | 欧美影片 | 夜夜躁日日躁狠狠久久av | 亚洲一区二区三区四区在线视频 | 国产精品手机视频 | 日韩av资源在线观看 | 韩日精品中文字幕 | 免费在线观看视频一区 | 91在线www | 精品黄色片 | 不卡精品 | 久久五月婷婷综合 | 毛片无卡免费无播放器 | 91久久久久久久 | 免费在线观看黄色网 | 亚洲久久视频 | 国产xxxx性hd极品 | 麻豆成人精品 | 一区二区三区在线视频111 | 在线观看精品一区 | 国产亚洲91 | 91av在线不卡| 久久精品毛片 | 懂色av一区二区三区蜜臀 | 日韩天天干 | 国产精品久久久久久久久久久久久 | 蜜臀av网站| 日韩久久久久久久久 | 亚洲精品在线网站 | 久久99热精品这里久久精品 | 欧美狠狠色 | 在线99视频 | 成人久久18免费 | 一区二区精品 | 久久免费99精品久久久久久 | 国产精品18久久久久久不卡孕妇 | 国产日韩精品在线观看 | 国产一区二区影院 | 亚洲视频axxx | 91香蕉视频污在线 | 日韩在线视频网址 | 97色在线观看免费视频 | 亚洲精品动漫在线 | 国产精品色婷婷视频 | 国产精品 999 | 最新免费中文字幕 | 久久视频这里只有精品 | 久久久久亚洲精品国产 | www.eeuss影院av撸 | 日本精品在线看 | 欧美a视频| 一二区精品 | 成人黄色小说在线观看 | 黄色av网站在线观看免费 | adc在线观看 | 96在线 | 成 人 a v天堂 | 成人久久久久久久久久 | 天天操天天色综合 | 中文字幕一区二区在线播放 | 五月婷婷香蕉 | 国产精品久久久久999 | 92精品国产成人观看免费 | 三上悠亚一区二区在线观看 | 福利视频一二区 | 国产我不卡 | 偷拍福利视频一区二区三区 | 91丝袜美腿 | 一级a性色生活片久久毛片波多野 | 久久 地址| 一区二区三区国产欧美 | 果冻av在线| 亚洲免费av电影 | 天堂av在线中文在线 | 91成人午夜 | 国产午夜一区二区 | 成人sm另类专区 | 国产精品一区二区三区四 | 色婷婷综合在线 | 天天综合成人 | 开心激情综合网 | 免费电影播放 | 成人九九视频 | 婷婷国产一区二区三区 | 国内精品久久久久影院日本资源 | 国产精品中文字幕在线 | 亚洲欧美经典 | 国产高h视频 | 欧美日韩精品久久久 | 日韩视频在线不卡 | 国产精品一区二区你懂的 | 在线电影91 | 99久久99视频 | 丁香花在线视频观看免费 | 免费在线精品视频 | 婷婷精品国产欧美精品亚洲人人爽 | 久久综合色天天久久综合图片 | 夜色资源网 | 免费看一级特黄a大片 | 黄色视屏免费在线观看 | 国产精品久久久久久久久毛片 | 黄色免费大片 | 日韩理论片中文字幕 | 国产成人一区二区三区免费看 | 少妇超碰在线 | 人人舔人人爽 | 欧美精品一区在线 | 91在线入口| 久久国产一区二区 | 亚洲综合在 | 中文国产在线观看 | 综合久久一本 | 久久久久久国产精品美女 | 国产区在线 | 中文字幕无吗 | 免费在线激情视频 | 亚洲精品在线国产 | 日韩在线观看中文字幕 | 亚洲视频免费视频 | 婷婷丁香导航 | 超碰在线人人草 | 国产精品毛片久久久久久久久久99999999 | 国内精品福利视频 | 国产小视频免费在线网址 | 国产免费又粗又猛又爽 | 婷婷在线视频 | 欧美日韩精品电影 | 精品视频中文字幕 | 激情久久影院 | 在线看v片 | 日韩av在线免费看 | 久久综合久久综合久久 | 久久av中文字幕片 | 精品国产美女 | 免费av黄色 | 黄色大片入口 | 国产欧美精品在线观看 | 美女黄网站视频免费 | 狠狠操综合网 | 欧美有色 | 999毛片 | 悠悠av资源片 | 日韩久久在线 | 午夜久久美女 | 麻豆免费视频网站 | 久久96| av丝袜制服| www.五月激情.com | 色综合久久88色综合天天6 | www.天天操.com | 久久香蕉电影网 | 日日夜夜天天 | 欧美日韩一区二区三区在线免费观看 | 欧美a在线免费观看 | 亚洲国产免费网站 | 特级毛片爽www免费版 | 91免费日韩 | 国产精品视频在线观看 | 国产日韩精品在线观看 | 亚洲激情在线观看 | 久草视频在线免费播放 | 国产综合91| 成人黄色毛片视频 | 超碰在线97观看 | 免费福利视频网 | 欧美一级片免费观看 | 天天玩天天操天天射 | 国产亚洲成人网 | 99这里有精品 | 国产亚洲一区二区三区 | 五月婷婷综 | 久久超碰免费 | 国产日韩中文字幕在线 | 97国产超碰在线 | 国产第一福利 | 中文字幕 二区 | 久久国产精彩视频 | 欧美夫妻性生活电影 | 中文字幕 国产专区 | 欧美伦理电影一区二区 | 日韩在线观看小视频 | 91成人黄色 | 久久亚洲精品国产亚洲老地址 | 国产手机视频在线观看 | 免费看黄色小说的网站 | 久久婷婷一区二区三区 | 国产在线中文 | 国产精品久久综合 | 99r在线播放 | 日韩在线首页 | av 在线观看|