最简单的刷新和加载控件

因为 只是基础功能 所以比较简单。说下实现基础吧 控制头布局和子布局的translationY 。
首先是初始化

 mHeadView = new Head(context);
        mHeadView.measure(0, 0);
        mLayoutHeight = mHeadView.getMeasuredHeight();
        addView(mHeadView);
        mHeadView.setTranslationY(-mLayoutHeight);
        mHeadView.changeStatus(Head.Status.pull_to_refresh);
        mFootView = new Foot(context);
        LayoutParams footParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        footParams.gravity = Gravity.BOTTOM;
        addView(mFootView);
        mFootView.setLayoutParams(footParams);
        mFootView.changeStatus(Foot.Status.pull_to_load);
        mFootView.setTranslationY(mLayoutHeight);
        setBackgroundColor(getResources().getColor(android.R.color.white));

如上 讲头布局设置一个负的translation使之隐藏,底布局同理
然后是拦截

 if (mHeadView.getTranslationY() == 0 || mFootView.getTranslationY() == 0) {
            return false;
        }
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mLastY = ev.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                float curY = ev.getRawY();
                float dy = curY - mLastY;
                if (dy > 0 && !ViewCompat.canScrollVertically(child, -1)) {
                    isPullUp = true;
                    return true;
                }
                if (dy < 0 && !ViewCompat.canScrollVertically(child, 1)) {
                    isPullUp = false;
                    return true;
                }
                mLastY = curY;
                break;
        }

在子布局不能滑动的时候拦截
处理自身的move事件

  float curY = event.getRawY();
                float dy = curY - mLastY;
                if (isPullUp) {
                    float headTranslationY = mHeadView.getTranslationY();
                    headTranslationY += dy;
                    mHeadView.setTranslationY(headTranslationY);

                    float childTranslationY = child.getTranslationY();
                    childTranslationY += dy;
                    child.setTranslationY(childTranslationY);
                } else {
                    float footTranslationY = mFootView.getTranslationY();
                    footTranslationY += dy;
                    mFootView.setTranslationY(footTranslationY);
                    float childTranslationY = child.getTranslationY();
                    childTranslationY += dy;
                    child.setTranslationY(childTranslationY);
                }
                mLastY = curY;
                break;

手指抬起的操作
if (isPullUp) {
if (mHeadView.getTranslationY() > 0) {
mHeadView.setTranslationY(0);
child.setTranslationY(mLayoutHeight);
mHeadView.changeStatus(Head.Status.refreshing);
if (listener != null) listener.onRefresh();
} else {
resetHead();
}
} else {
if (mFootView.getTranslationY() < mLayoutHeight) {
mFootView.setTranslationY(0);
child.setTranslationY(-mLayoutHeight);
mFootView.changeStatus(Foot.Status.loading);
if (listener != null) listener.onLoadMore();
} else {
resetFoot();
}
}
核心代码就是上面了
全部代码请看github (https://github.com/fanyaopeng/CommonRefresh)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如需要源代码,请发邮件给我。动态库中提供获取作者的Email接口函数 public: //功能:获取作者邮箱 //输入:无 //输出:无 //返回:作者信息 CString GetAutherEmail(); //功能:判断输入的节点句柄是否存在 //参数:[in] hItem 节点句柄 //返回:true节点存在,false节点不存在 bool FindItemExist(HTREEITEM hItem); //功能:设置一个节点字体颜色 //参数:[in] hItem 节点句柄 // [in] clrText 节点字体颜色 //返回:true设置字体颜色成功,false设置字体颜色失败 //注:内部不包含刷新 bool SetItemTextColor(HTREEITEM hItem, COLORREF clrText); //功能:获取一个节点字体颜色 //参数:[in] hItem 节点句柄 // [out] clrText 节点字体颜色 //返回:true获取字体颜色成功,false获取字体颜色失败 //注:内部不包含刷新 bool GetItemTextColor(HTREEITEM hItem, COLORREF &clrText;); //功能:设置扩展按钮的边框颜色 //参数:[in] clrButtonBorder 扩展按钮的边框颜色 //返回:无 //注:内部包含刷新 void SetExpandedButtonBorder(COLORREF clrButtonBorder); //功能:设置扩展按钮的十字颜色 //参数:[in] clrButtonCross 扩展按钮的十字颜色 //返回:无 //注:内部包含刷新 void SetExpandedButtonCross(COLORREF clrButtonCross); //功能:刷新背景 //输入:无 //输出:无 void RedrawTreeCtrl(); //功能:设置画线的样式 //输入:[in] nPenStyle 画线样式 // [in] nWidth 画线宽度 // [in] crColor 画线颜色 //返回:无 //注:内部包含刷新 void SetPenLineStyle(int nPenStyle, int nWidth, COLORREF crColor); protected: //功能:判断输入的节点句柄是否存在 //参数:[in] hItem 节点句柄 //返回:true节点存在,false节点不存在 bool FindChildItemExist(HTREEITEM hParantItem, HTREEITEM hItem); //功能:绘制文字 //参数:[in] pDC 设备DC //返回:无 void OnDrawText(CDC *pDC); //功能:绘制一个节点文字 //参数:[in] pDC 设备DC // [in] hItem 节点句柄 //返回:true成功,false失败 bool OnDrawItemText(CDC *pDC, HTREEITEM hItem); //功能:绘制展开按钮 //参数:[in] pDC 设备DC //返回:无 void OnDrawButton(CDC *pDC); //功能:绘制一个节点展开按钮 //参数:[in] pDC 设备DC // [in] hItem 节点句柄 //返回:true成功,false失败 bool OnDrawItemButton(CDC *pDC, HTREEITEM hItem); //功能:绘制一个节点展开按钮(节点展开) //参数:[in] pDC 设备DC // [in] hItem 节点句柄 //返回:true成功,false失败 bool OnDrawItemButtonExpanded(CDC *pDC, HTREEITEM hItem); //功能:绘制一个节点展开按钮(节点未展开) //参数:[in] pDC 设备DC // [in] hItem 节点句柄 //返回:true成功,false失败 bool OnDrawItemButtonNotExpanded(CDC *pDC, HTREEITEM hItem); //功能:绘制节点连接线 //参数:[in] pDC 设备DC //返回:无 void OnDrawLines(CDC *pDC); //功能:绘制根节点连接线 //参数:[in] pDC 设备DC //返回:无 void OnDrawItemLines(CDC *pDC, HTREEITEM hItem); private: //功能:获取画线的区域(排除扩展按钮的区域) //参数:无 //返回:创建的画线的区域 void CreateRgnForDrawLines(CRgn &rgnDraw;);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值