最近研究了公司的下拉scrollview,自己也写了一个,下拉scrollview比较重要的就是touchevent的处理,我本来想做成百度贴吧那种样式的,但是发现scollview的滑动速度不可更改,默认和手指的滑动速度一样,别说fling函数,这个函数只是当手指离开屏幕之后的滑动距离,而且使用velocitytracker实现的,所以继承scrollview实现的一个下拉刷新scrollview最多只能实现成这样,基本功能完全实现,但就是用户体验不好
手势的处理:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if(ev.getAction() == MotionEvent.ACTION_DOWN){
scrollY = getScrollY();
}
return super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
//由于是子控件先执行ontouchevent,父控件的ontouchevent后执行,所以子控件如果将down事件吃掉
//所以父控件的down事件可能不会执行,所以down事件要在onintercepttouchevent里面捕捉
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
//只有当现在的状态不是正在刷新的时候,才检测状态
if(state != RefreshState.REFRESHING)
checkState();
break;
case MotionEvent.ACTION_UP:
/**
* 当用户再顶部滑动非常快的时候,move只有一次,up也只有一次,这时,state一直为done,
* 所以再up事件的时候也要检查,只有当现在的状态不是正在刷新的时候,才检测状态
*/
if(state != RefreshState.REFRESHING)
checkState();
if(state == RefreshState.RELEASETOREFRESH){
changeState(RefreshState.REFRESHING);
}else if(state == RefreshState.PULLTOREFRESH){
refreshingSuccess();
}else{
}
break;
default:
break;
}
return super.onTouchEvent(ev);
}
接着就是状态改变所对应的文字改变了,注意,再下拉过程中,textview只能visible和invisible,而不能用settext这个函数,应为这个函数会导致卡顿,具体原因没有研究过
switch (state){
case PULLTOREFRESH:
head_animation.setImageResource(R.drawable.refresh1);
pull_to_refresh.setVisibility(View.VISIBLE);
release_to_refresh.setVisibility(View.GONE);
refreshing.setVisibility(View.GONE);
refreshed.setVisibility(View.INVISIBLE);
break;
case RELEASETOREFRESH:
head_animation.setImageResource(R.drawable.refresh2);
pull_to_refresh.setVisibility(View.GONE);
release_to_refresh.setVisibility(View.VISIBLE);
refreshing.setVisibility(View.GONE);
refreshed.setVisibility(View.GONE);
break;
case REFRESHING:
head_animation.setImageResource(R.drawable.refresh_head);
((AnimationDrawable) (((ImageView) head_animation).getDrawable())).start();//启动状态
pull_to_refresh.setVisibility(View.GONE);
release_to_refresh.setVisibility(View.GONE);
refreshing.setVisibility(View.VISIBLE);
refreshed.setVisibility(View.GONE);
((TextView) last_update_time).setText(getResources().getString(R.string.last_update_time) + getCurrentT ime());
refreshing();
break;
case DONE:
head_animation.setImageResource(R.drawable.refresh1);
pull_to_refresh.setVisibility(View.GONE);
release_to_refresh.setVisibility(View.GONE);
refreshing.setVisibility(View.GONE);
refreshed.setVisibility(View.VISIBLE);
default:
break;
}
写的很水,大家笑笑就好