微信朋友圈我们都经常用,朋友圈的下拉刷新比较有意思,我们今天将要模仿打造微信朋友圈的下拉刷新控件,当然微信的这种刷新设计可能不是最好的,实际项目中你可以用V4包里面的SwipeRefreshView或者Chris Banes的AndroidPullRerfresh,看产品经理的设计。
思路
我们初步分析下,界面上主要有二个控件,一个彩虹状的圆形LoadingView,一个是ListView,那么我大致可以有下面三个步骤:
第一步:需要自定义一个ViewGroup,把上面的2个控件add进来。
第二步:利用ViewDragHelper处理控件拖动。当ListView处于顶部时,如果继续向下拖动,就拦截触摸事件,将触摸事件传递给ViewDragHelper处理,这里比较关键,主要是是否拦截触摸事件的判断条件要处理好,否则如果ListView的点击和滚动事件被我们拦截了,那就悲剧了。
第三步:在ViewDragHelper的拖动回调方法里面,设置listView和彩虹LoadingView的位置,调用requestLayout。
第四步:手势松开后,开始刷新,LoadingView在固定位置做旋转动画。
第五步:如果设置了onRefreshListener,执行onRefresh接口。
第六步:调用stopRefresh,完成刷新,这一步需要控件使用者手动去调用,控件本身不自动触发。
代码实现
public class FriendRefreshView extends ViewGroup{
//圆形指示器
private ImageView mRainbowView;
private ListView mContentView;
//控件宽,高
private int sWidth;
private int sHeight;
private ViewDragHelper mDragHelper;
//contentView的当前top属性
private int currentTop;
//listView首个item
private int firstItem;
private boolean bScrollDown = false;
private boolean bDraging = false;
//圆形加载指示器最大top
private int rainbowMaxTop = 80;
//圆形加载指示器刷新时的top
private int rainbowStickyTop = 80;
//圆形加载指示器初始top
private int rainbowStartTop = -120;
//圆形加载指示器的半径
private int rainbowRadius = 100;
private int rainbowTop = - 120;
//圆形加载指示器旋转的角度
private int rainbowRotateAngle = 0;
private boolean bViewHelperSettling = false;
//刷新接口listener
private OnRefreshListener mRefreshLisenter;
private AbsListView.OnScrollListener onScrollListener;
private com.sw.library.widget.friendrefreshview.OnDetectScrollListener onDetectScrollListener;
public enum State {
NORMAL,
REFRESHING,
DRAGING
}
//控件当前状态
private State mState = State.NORMAL;
public FriendRefreshView(Context context) {
this(context, null);
}
public FriendRefreshView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public FriendRefreshView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initHandler();
initDragHelper();
initListView();
initRainbowView();
setBackgroundColor(Color.parseC