您的位置:首页 > 其它

自定义view系列(4)--判断滑动方向的ListView

2016-09-04 12:17 1136 查看
使用ListView时.现在一些流行的应用会根据ListView实时的滑动方向来显示或隐藏一些布局,比如知乎,掘金等应用.

判断ListView的滑动方向其实不难,只需要在它的OnScrollListener中进行相应的操作即可,网上也有很多教程,但是这样做很麻烦,因为有些ListView的Item很高,当ListView的多次滑动距离没有超过一个Item的高度时,判断是向上滑动还是向下滑动会有问题.想解决这个问题,还得再判断滑动的距离有没有超过一个item的高度,并且这种方式还有其他问题需要解决,所以实现起来很麻烦.

而采用自定义view的方式,监听ListView的OnTouchEvent,实现起来会更简单.代码如下:

package com.lanma.lostandfound.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;
import android.widget.ListView;

/**
* 作者 qiang_xi on 2016/9/3 18:03.
*/
public class DirectionListView extends ListView {
private OnScrollDirectionListener mListener;
private float startY = 0;//按下时y值
private int mTouchSlop;//系统值

public DirectionListView(Context context) {
this(context, null);
}

public DirectionListView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public DirectionListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
startY = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
if (Math.abs(ev.getY() - startY) > mTouchSlop) {
if (ev.getY() - startY >= 0) {
mListener.onScrollDown();
} else {
mListener.onScrollUp();
}
}
startY = ev.getY();
break;
}
return super.onTouchEvent(ev);
}

public void setOnScrollDirectionListener(OnScrollDirectionListener listener) {
this.mListener = listener;
}

public interface OnScrollDirectionListener {
//向上滑动
void onScrollUp();

//向下滑动
void onScrollDown();
}
}


使用方式和普通的ListView没有任何区别,你只需要设置一下滑动方向的监听即可.然后在向上滑动或向下滑动的回调监听中,隐藏或显示我们的布局即可.

效果图如下:



其实也可以直接使用普通的ListView,然后注册它的OnTouchEvent事件,然后把上面的逻辑拷贝一份也是一样的效果,代码就不贴了.不过个人认为还是自定义view的方式比较好一点,可以降低与Activity的耦合度,代码看起来更清爽直观.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息