android-自定义下拉刷新(touch事件处理),下拉松开处理和接口的定义,刷新效果的实现

思路:

一:

1.自定义ListView实现下拉刷新,RefreshView,必须重新带有两个参数的构造方法

2.在构造方法里面,把实现刷新控件添加

   自定义ProgressBar

3.下拉刷新控件隐藏和显示的原理

    View.setPadding(0,-控件,0,0);//完全隐藏

    View.setPadding(0,0,0,0);//完全显示

    View.setPadding(0,-控件,0,0);//2倍高显示

4.拖动实现隐藏和显示头部控件

  a.重新onTouchEvent()

  b.计算滑动的距离

   float distanceY = endY - startY;

   int paddingTop = -控件高 + distanceY;

  c.设置效果

二:

自定义类RefreshListView和布局文件

自定义ProgressBar样式progressbar.xml

布局文件代码如下:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="0"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="360">
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:innerRadiusRatio="2.5"
        android:shape="ring"
        android:thicknessRatio="15"
        android:useLevel="false">
        <!--界面-->
        <gradient
            android:centerColor="#88ff0000"
            android:endColor="#ffffff"
            android:startColor="#ff0000"
            android:type="sweep" />
        <!--为了让其动起来,因为是旋转动画嘛,所以外层套一个rotate-->

    </shape>
</rotate>
说明一下个人理解:android:useLevel="false",说明:true若隐若现,false一直显示

/**
 * 作者:created by ${冯仕江}
 * 时间:on 2019/6/20
 * QQ号:764760811
 * 微信:18785461074
 * 作用:自定义下拉刷新的ListView
 */
public class RefreshListView extends ListView {
    /**
     * 下拉刷新和顶部轮播图(先不加入)
     */
    private LinearLayout headerView;
    //下拉刷新控件
    private View ll_down_refresh;
    private ImageView iv_arrow;
    private ProgressBar pb_status;
    private TextView tv_status;
    private TextView tv_time;


    public RefreshListView(Context context) {
        this(context,null);
    }

    public RefreshListView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public RefreshListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initHeaderView(context);
    }

    private void initHeaderView(Context context) {
        headerView = (LinearLayout) View.inflate(context, R.layout.refresh_header,null);
        ll_down_refresh = headerView.findViewById(R.id.ll_down_refresh);
        iv_arrow = headerView.findViewById(R.id.iv_arrow);
        pb_status = headerView.findViewById(R.id.pb_status);
        tv_status = headerView.findViewById(R.id.tv_status);
        tv_time = headerView.findViewById(R.id.tv_time);
    }
}

然后把

换成RefreshListView

再然后将ListView换成com.example.beijing.view.RefreshListView

但是运行后看不到没有,怎么回事?

因为没有添加头,需要在内部添加

代码如下:

/**
 * 作者:created by ${冯仕江}
 * 时间:on 2019/6/20
 * QQ号:764760811
 * 微信:18785461074
 * 作用:自定义下拉刷新的ListView
 */
public class RefreshListView extends ListView {
    ........

    private void initHeaderView(Context context) {
       ..........
        //添加ListView头,因为是内部所以RefreshListView.this.可省略
        RefreshListView.this.addHeaderView(headerView);
    }
}

默认隐藏下拉刷新控件:

实现下拉拖动显示下拉刷新控件

重写onTouchEvent方法

 

/**
 * 作者:created by ${冯仕江}
 * 时间:on 2019/6/20
 * QQ号:764760811
 * 微信:18785461074
 * 作用:自定义下拉刷新的ListView
 */
public class RefreshListView extends ListView {
    。。。。。。。
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return super.onTouchEvent(ev);
    }
}

然后:

private float startY = -1;//记录起始坐标参数,默认-1
@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()){
        case MotionEvent.ACTION_DOWN:
            //按下记录起始坐标
            startY = ev.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            //初始化
            if (startY == -1){
                startY = ev.getY();
            }
            //2.滑动的时候来到新的坐标
            float endY = ev.getY();
            //3.计算滑动的距离
            float distanceY = endY - startY;
            if (distanceY > 0){//下拉
                int paddingTop = (int) (-pullDownRefreshHeight + distanceY);
                ll_down_refresh.setPadding(0,paddingTop,0,0);
            }
            break;
        case MotionEvent.ACTION_UP://重新记录
            startY = -1;
            break;
        default:
            break;
    }
    return super.onTouchEvent(ev);
}

刷新的效果实现:

思路:

 

第二点切换状态在case MotionEvent.ACTION_MOVE:里面

代码如下:

case MotionEvent.ACTION_MOVE:
    //初始化
    if (startY == -1){
        startY = ev.getY();
    }
    //如果是正在刷新,就不让再刷新
    if (CURRENTSTATUS == REFRESHING){
        break;
    }
    //2.滑动的时候来到新的坐标
    float endY = ev.getY();
    //3.计算滑动的距离
    float distanceY = endY - startY;
    if (distanceY > 0){//下拉
        int paddingTop = (int) (-pullDownRefreshHeight + distanceY);
        if (paddingTop < 0 && CURRENTSTATUS != PULL_DOWN_REFRESH){
            //下拉刷新状态
            CURRENTSTATUS = PULL_DOWN_REFRESH;
            //更新状态
            refreshViewState();
        }else if(paddingTop > 0 && CURRENTSTATUS != RELEASE_REFRESH){
            //手动刷新状态
            CURRENTSTATUS = RELEASE_REFRESH;
            //更新状态
            refreshViewState();
        }
        ll_down_refresh.setPadding(0,paddingTop,0,0);
    }
    break;

case MotionEvent.ACTION_UP://放手进入UP,重新记录
    startY = -1;
    if (CURRENTSTATUS == PULL_DOWN_REFRESH){
        ll_down_refresh.setPadding(0,-pullDownRefreshHeight,0,0);//完全隐藏
    }else if(CURRENTSTATUS == RELEASE_REFRESH){
        //设置状态为正在刷新
        CURRENTSTATUS = REFRESHING;
        //放手的时候
        refreshViewState();
        ll_down_refresh.setPadding(0,0,0,0);//完全显示
        //回调接口
    }
    break;

设置下拉箭头动画

public RefreshListView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    .....
    //做下拉刷新箭头的动画
    initAnimation();
}

 

private void initAnimation() {
    upAnimation = new RotateAnimation(0,-180,RotateAnimation.RELATIVE_TO_SELF,0.5f,RotateAnimation.RELATIVE_TO_SELF,0.5f);
    upAnimation.setDuration(500);//设置动画播放时间
    upAnimation.setFillAfter(true);//停留在旋转之后的状态

    downAnimation = new RotateAnimation(-180,-360,RotateAnimation.RELATIVE_TO_SELF,0.5f,RotateAnimation.RELATIVE_TO_SELF,0.5f);
    downAnimation.setDuration(500);//设置动画播放时间
    downAnimation.setFillAfter(true);//停留在旋转之后的状态
}

下拉刷新松开处理和接口的定义

1.在RefreshListView内部添加代码如下:

/**
 * 监听控件的刷新
 */
public interface OnRefreshListener{
    //当下拉刷新的时候回调这个方法
    public void onPullDownRefresh();
}
public OnRefreshListener mOnRefreshListener;
//设置监听刷新,由外界设置
public void setOnRefreshListener(OnRefreshListener l){
    this.mOnRefreshListener = l;
}

2.调用接口,在事件源,在up的时候

3.在其它方法中的使用:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kenadc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值