Andriod进阶知识之一,滑动监听也是初学者不得不学习的一项技能。关于滑动,你能想到什么?ScrollView、ListView、GridView、WebView、RecyclerView。。。你是否写过或研究过ScrollView滑动监听的代码呢?其他控件的滑动监听代码是怎么实现的呢?看看下面的效果,是不是很想实现?让我们带着这些疑问,一起进入Android滑动监听的世界吧。
一、ScrollView滑动监听,实现ActionBar显示和隐藏
1、写一个ScrollView滑动监听的接口,供实现滑动监听的Activity实现,代码如下:
public interface ObservableScrollViewCallbacks {
/**
* 滑动过程监听
* @param scrollY 当前滑动位置
* @param firstScoll 是否第一次滑动
* @param dragging 是否滑动中
*/
void onScrollChanged(int scrollY, boolean firstScoll, boolean dragging);
//当按下事件发生时候调用此方法
void onDownMotionEvent();
//滑动的状态
void onUpOrCancleMotionEvent(ScrollState scrollState);
}
滑动状态用Enum枚举类型表示,STOP表示滑动停止,UP表示向上滑动,DOWN表示向下滑动,代码如下:
public enum ScrollState {
STOP,
UP,
DOWN,
}
2、写一个Scrollable接口,供自定义ScrollView控件ObservableScrollView实现,代码如下:
public interface Scrollable {
//接口设置
void setScrollViewCallbacks(ObservableScrollViewCallbacks listener);
//获取Y轴滑动距离
int getCurrentScrollY();
//设置手势拦截
void setTouchInterceptionViewGroup(ViewGroup viewGroup);
}
3、自定义ObservableScrollView,实现Scrollable接口,代码如下:
public class ObservableScrollView extends ScrollView implements Scrollable{
private int mPrevScrollY;
private int mScrollY;
private ScrollState mScrollState;
private boolean mFirstScroll,mDraggging;
private ObservableScrollViewCallbacks callbacks;
public ObservableScrollView(Context context) {
super(context);
}
public ObservableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ObservableScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
mScrollY = t;
if (callbacks != null) {
callbacks.onScrollChanged(t, mFirstScroll, mDraggging);
}
if (mFirstScroll) {
mFirstScroll = false;
}
Log.i("ObservableScrollview",mPrevScrollY +" "+ t);
if(mPrevScrollY < t){
mScrollState = ScrollState.UP;
}else {
mScrollState = ScrollState.DOWN;
}
mPrevScrollY = t;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getActionMasked()){
case MotionEvent.ACTION_DOWN:
mFirstScroll = mDraggging = true;
break;
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mDr