如过程图:
内容区域是一个可滑动区域(内容会超过1屏幕),业务需求是: 当内容为顶端时,向下滑动可以使得抽屉收回。
这个任务乍看起来很麻烦,其实很简答。当然这个简单是相对于找到好的办法去解决该问题而说的。
SlidingDrawer基础知识就不再普及了,说下具体实现的思路。
解决 如何判定内容区域就是在顶端?
方法: Content 的布局是一个Listview,里面有2个item,Item1是一个不可见的,大小为1px的View。 用于标识当前可见View,在ListView中设置滑动监听,在OnScroll里有参数 firstVisibleItem 来用于告诉你,当前显示的是第几个item。
如下:
lv.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// Log.e("",""+ firstVisibleItem);
// TODO Auto-generated method stub
if(firstVisibleItem==0){
flag = true;
}else{
flag = false ;
}
}
});
}
同时,我设置了一个Flag用于标识,当Item1可见时,就是在Listview的顶端。再向下滑动的时候,同时关闭SlidingDrawer
OnTouchListener lvOnTouchListener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
y = event.getY();
break ;
case MotionEvent.ACTION_MOVE:
final float preY = y;
float nowY = event.getY();
int deltaY = (int) (preY - nowY);
// Log.e("deltaY", ""+deltaY);
if(deltaY<0 && flag){
sd.animateClose();
}
break;
default:
break;
}
return false;
}
};
sd.animateClose();