自定义view系列(4)--判断滑动方向的ListView
2016-09-04 12:17
1136 查看
使用ListView时.现在一些流行的应用会根据ListView实时的滑动方向来显示或隐藏一些布局,比如知乎,掘金等应用.
判断ListView的滑动方向其实不难,只需要在它的OnScrollListener中进行相应的操作即可,网上也有很多教程,但是这样做很麻烦,因为有些ListView的Item很高,当ListView的多次滑动距离没有超过一个Item的高度时,判断是向上滑动还是向下滑动会有问题.想解决这个问题,还得再判断滑动的距离有没有超过一个item的高度,并且这种方式还有其他问题需要解决,所以实现起来很麻烦.
而采用自定义view的方式,监听ListView的OnTouchEvent,实现起来会更简单.代码如下:
使用方式和普通的ListView没有任何区别,你只需要设置一下滑动方向的监听即可.然后在向上滑动或向下滑动的回调监听中,隐藏或显示我们的布局即可.
效果图如下:
其实也可以直接使用普通的ListView,然后注册它的OnTouchEvent事件,然后把上面的逻辑拷贝一份也是一样的效果,代码就不贴了.不过个人认为还是自定义view的方式比较好一点,可以降低与Activity的耦合度,代码看起来更清爽直观.
判断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的耦合度,代码看起来更清爽直观.
相关文章推荐
- 判断listview滑动方向的代码片段
- 【Android】ListView监听上下滑动(设置滚动监听判断ListView的滚动方向同时获取屏幕高度、ListView实际高度,判断是否需要展示返回顶部按钮(具体逻辑请看代码--附有详细注释)。
- DrawerLayout 中listView 滑动不好控制(竖直滑动和水平方向滑动判断)
- 更全面地判断ListView滑动方向
- 判断ScrollView滑动的方向
- Android自定义组件系列【15】——四个方向滑动的菜单实现
- 判断滑动方向UITableView
- Android自定义组件系列【15】——四个方向滑动的菜单实现
- javascript开发系列---仿listview实现div上下滑动
- Android 如何判断ListView的滚动方向
- 通过OnTouchEvent(Motionevent event)判断手指滑动方向
- IOS中判断UIScrollerView滑动的方向
- android判断viewpager滑动方向
- Android 判断手势的滑动方向
- listView优化,是否滑动,第一行,最后一行判断,判断何时要加载图片
- iOS study Day19 - 滑动方向判断
- 利用监听事件做一个判断是在x方向还有y方向上面的判断,判断在屏幕上滑动的趋势
- uitableview scrollview 判断滑动方向
- 移动应用滑动屏幕方向判断解决方案
- 移动应用滑动屏幕方向判断解决方案,JS判断手势方向