百度出来的感觉不明觉厉好深奥….自己整理了一下思路实现了..
通过getRawY来判断是否正在下拉及处理事件
作于下拉头的Layout,通过setLayoutParams动态设置Height
要判断是否处于最顶部
新建一个布局…包含一个ListView和一个headerLayout,将header设置为gone,不显示出来;
然后就该上代码了,备注应该够详细了….
public class domeView extends LinearLayout implements OnTouchListener{
float currentY=0; //这是当前触摸的Y坐标
float downY = 999999; //这是开始触摸的Y坐标
ListView list; //ListView
RelativeLayout header; //HeaderLayout 下拉头
TextView text; // 下拉头里的View
int headerMaxHeight = 200; //下拉头最大高度
public domeView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.view_dome,this);
/**
* 先给ListView里加点数据
**/
list = (ListView) findViewById(R.id.HeaderList);
String[] s = new String[]{"1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","2","3","4","5","6","7","8","9","10","11","12","13","14","15"};
ArrayAdapter adapter = new ArrayAdapter(context,android.R.layout.simple_list_item_1, s);
if(! isInEditMode()){
list.setAdapter(adapter);
}
/**
* 因为本身是实现于OnTouchListener接口,所以set this就好了
**/
list.setOnTouchListener(this);
header = (RelativeLayout) findViewById(R.id.HeaderLayout);
text = (TextView) findViewById(R.id.HeaderText);
}
@Override
/**
* OnTouch监听事件
**/
public boolean onTouch(View v, MotionEvent event) {
/**
* event.getAction()是获得当前的触摸状态;
* ACTION_DOWN是刚触摸屏幕
* ACTION_MOVE是触摸并移动
* ACTION_UP是离开触摸
**/
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
/**
* getFirstVisiblePosition表示获取ListView上当前屏幕上
* 可见的第一个Item序号,然后通过第一个Item的getTop判断
* 是否已经在顶部
**/
if(list.getFirstVisiblePosition() == 0 && list.getChildAt(0).getTop()==0){
downY = event.getRawY();//获取第一次触摸的Y坐标
}
break;
case MotionEvent.ACTION_MOVE:
currentY = event.getRawY(); //获取当前的Y坐标
/**
* 判断当前坐标是否大于第一次坐标,是则说明正在下
* 拉,继续判断是否处于顶部,是才处理事件
**/
if(currentY > downY && list.getFirstVisiblePosition() == 0 && list.getChildAt(0).getTop()==0){
int changeHeight = (int) (currentY - downY);
changeHeaderHeight((int) (currentY-downY));
return true;
}
break;
case MotionEvent.ACTION_UP:
/**
* 这里放刷新数据的处理事件,松手完就要隐藏啦
* **/
changeHeaderHeight(0);
break;
}
return false;
}
private void changeHeaderHeight(int height) {
if(height == 0 && header.getVisibility() != View.GONE){
header.setVisibility(View.GONE);
changeHeaderHeight(1);
return;
//如果设置为0则表示将header设置为不可视
}
if(header.getVisibility() != View.VISIBLE){
header.setVisibility(View.VISIBLE);
//更改height的时候要判断现在是否可视..若不可视得将其设置为可视
}
if(height > headerMaxHeight){
//如果要设置的height超过最大的height处理...
changeHeaderHeight(headerMaxHeight);
text.setText("松开立刻刷新");
return;
}
else if(height <= 0){
//值<=0就表示要隐藏啦
changeHeaderHeight(0);
return;
}
else{
text.setText("下拉刷新");
}
/**
* 先getLayoutParams修改height再setLayoutParams即可达到修改height的目的
**/
android.view.ViewGroup.LayoutParams lp = header.getLayoutParams();
lp.height = height;
header.setLayoutParams(lp);
}
}
最终差不多就是这样的效果..应该差不多了把
http://www.hoimk.com/learn-note/73.html