您的位置:首页 > 移动开发 > Android开发

Android 关于判断用户滑动方向

2017-03-22 10:40 162 查看
最近公司遇到一个交互,是对一个控件实现左右滑动以及上下滑动,左右滑动直接用了ViewPager,但是此时遇到一个问题,就是不知道用户是进行左右还是上下的操作。百度查了好多,都是在UP的时候进行判断,但是这样就做不到交互了,于是自己写了一个代码如下(完整代码就不贴了,因为没有写一个Demo,是直接在公司项目中写的):

效果图如下:



/**
* 默认是上下滑动
* true:上下滑动
* false:左右滑动
*/
boolean slide = true;
private float translationY;
private float dy;
float stratY;
float downY;
float downX;
boolean hasMoved = false;// 判断视图是否被移动
int xToMove;// 视图所要被移动的距离,默认200
float dx;
/**
* 是否决定什么滑动若不决定则不做操作
*/
boolean direction = false;

private void setListener() {
rcv_transit_path_planninng_list_detail.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
return false;
}
});
ll_item_transit_path_planning_map_parent.setOnTouchListener(
new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
//判断用户滑动方向
View parent = (View) view.getParent();
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
ll_item_transit_path_planning_map_parent.getViewPager().dispatchTouchEvent(motionEvent);
stratY = motionEvent.getRawY();
downY = motionEvent.getY();
downX = motionEvent.getX();
if (hasMoved) {
stratY = stratY - xToMove;
} else {
view.onTouchEvent(motionEvent);// 当视图没有被移动,返回事件,使点击事件可用。
}

break;
case MotionEvent.ACTION_MOVE:
float moveY = motionEvent.getRawY();
float deltaY = moveY - stratY;

dy = motionEvent.getY() - downY;
dx = motionEvent.getX() - downX;

translationY = parent.getTranslationY();
int translationEndY = screenHeight - DrawUtil.dip2px(getContext(), 207);

Log.e("TAG", dx + "===dx");
Log.e("TAG", dy + "===dy");

if (!direction) {
direction = judgeDirection();
} else {
if (direction && !slide) {
//进入后代表已经确定滑动方向为左右滑动
ll_item_transit_path_planning_map_parent.getViewPager().dispatchTouchEvent(motionEvent);
} else {
//进入后代表已经确定滑动方向 上下滑动
if (dy > 0) {
//下移
if (translationY <= translationEndY) {
setTranslationY(parent, deltaY);
}
} else {
//上移
if (translationY >= DrawUtil.dip2px(getContext(), 5)) {
setTranslationY(parent, deltaY);
}
}
}
}

break;
case MotionEvent.ACTION_UP:

if (direction && !slide) {
//进入后代表已经确定滑动方向为左右滑动
ll_item_transit_path_planning_map_parent.getViewPager().dispatchTouchEvent(motionEvent);
} else {
deltaY = motionEvent.getRawY() - stratY;
int height = sv_transit_path_planning_map.getHeight() - DrawUtil.dip2px(getContext(), 140);
boolean swap = false;
Log.e("TAG", deltaY + "=deltaY");
Log.e("TAG", height + "=height");

if ((deltaY < (height / 2) && hasMoved)
|| (deltaY > (height / 2) && !hasMoved)) {
swap = true;
}

if (swap) {
if (!hasMoved) {
generateRevealAnimate(parent, xToMove);
hasMoved = true;
} else {
generateRevealAnimate(parent, 0);
hasMoved = false;
}
} else {
if (hasMoved) {
generateRevealAnimate(parent, xToMove);
} else {
generateRevealAnimate(parent, 0);
}
}
}

slide = true;
direction = false;

break;
}

return true;
}
});
}

/**
* 判断用户滑动方向
*
* @return
*/
private boolean judgeDirection() {

if ((Math.abs(dx) - Math.abs(dy)) > 50) {
//左右滑动
slide = false;
return true;
} else if ((Math.abs(dy) - Math.abs(dx)) > 50) {
//上下滑动
slide = true;
return true;
}
return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: