前面的章节实现了滑动时候第一个选项移动的功能。那么我们要实现滑动那个项目就移动那个项目的功能。其实这个功能很简单,就是在SwipeMenuListView的onTouchEvent函数里将移动分给正确的SwipeMenuLayout对象。采用positionToPosition函数实现,代码如下。
@Override
public boolean onTouchEvent(MotionEvent ev) {
View view;
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
// mDownX = ev.getX();
// mDownY = ev.getY();
Log.i(TAG, "Action Down");
// Log.i(TAG, "down x is "+mDownX + " down y is "+ mDownY);
break;
case MotionEvent.ACTION_MOVE:
float dx=Math.abs(mDownX- ev.getX());
float dy = Math.abs(mDownY - ev.getY());
// Log.i(TAG, "on touch move x "+ev.getX() +" y "+ev.getY());
// Log.i(TAG, "dx "+dx+" dy "+dy);
if(dx > MAX_X){
// Log.i(TAG, "enough offset!");
}
mTouchPosition = pointToPosition((int)ev.getX(),(int)ev.getY());
view = getChildAt(mTouchPosition - getFirstVisiblePosition());
if(view instanceof SwipeMenuLayout){
mTouchView =(SwipeMenuLayout)view;
mTouchView.onSwipe(ev);
}
Log.i(TAG,"Action Move");
break;
// return true;
case MotionEvent.ACTION_UP:
Log.i(TAG, "ACtion Up");
mTouchPosition = pointToPosition((int)ev.getX(),(int)ev.getY());
view = getChildAt(mTouchPosition - getFirstVisiblePosition());
if(view instanceof SwipeMenuLayout){
mTouchView =(SwipeMenuLayout)view;
mTouchView.onSwipe(ev);
}
break;
default:
break;
}
return super.onTouchEvent(ev);
}
}
通过上述代码就可以实现该功能了。
上面会出现当你滑动出一个item范围外,会导致其它项目滑动。为了解决这个问题,我们必须记录下按下时候的item位置,当滑动出这个位置时候不响应。首先在SwipeMenuLayout添加一个记录position的变量,添加getter和setter方法。另外修改SwipeMenuListView的OnTouchEvent响应,记录按下时候的位置,在Move里面判断是否出界代码如下。
@Override
public boolean onTouchEvent(MotionEvent ev) {
View view;
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
int oldPosition = mTouchPosition;
Log.i(TAG, "Action Down");
mTouchPosition = pointToPosition((int)ev.getX(),(int)ev.getY());
view = getChildAt(mTouchPosition - getFirstVisiblePosition());
if(view instanceof SwipeMenuLayout){
mTouchView =(SwipeMenuLayout)view;
mTouchView.setPosition(mTouchPosition);
}
break;
case MotionEvent.ACTION_MOVE:
float dx=Math.abs(mDownX- ev.getX());
float dy = Math.abs(mDownY - ev.getY());
mTouchPosition = pointToPosition((int)ev.getX(),(int)ev.getY());
if(mTouchPosition != mTouchView.getPosition())
{
break;
}
if(dx > MAX_X){
// Log.i(TAG, "enough offset!");
}
if(mTouchView != null){
mTouchView.onSwipe(ev);
}
Log.i(TAG,"Action Move");
break;
// return true;
case MotionEvent.ACTION_UP:
Log.i(TAG, "ACtion Up");
if(mTouchView != null){
mTouchView.onSwipe(ev);
}
break;
default:
break;
}
return super.onTouchEvent(ev);
}
这样再滑动就不会出现滑动一次,两个项目会动。
下面来实现菜单隐藏,滑动出现的功能。其实这个应该很简单,我们只须在没有触摸的时候画到屏幕外面,滑动时候画到屏幕内来。