android自定义的下拉scrollview

最近研究了公司的下拉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;
}



写的很水,大家笑笑就好

源码下载点我

你可能感兴趣的:(android)