尊重原创转载请注明:http://blog.youkuaiyun.com/bfbx5173/article/details/49814551
Rick 镇楼
好久没来博客耍耍了。俗话说学到的东西要多复习,不然就会忘记,今日无聊来一发。
首先呢,这个下拉刷新基于开源框架 android-Ultra-Pull-To-Refresh
在build.gradle中
compile 'in.srain.cube:ultra-ptr:1.0.11'
so - 尚不清楚android-Ultra-Pull-To-Refresh的朋友[ 戳我查看 android-Ultra-Pull-To-Refresh 源码解析]
这是 Ultra中提供的常规默认刷新的下拉头PtrClassicDefaultHeader。我们来看看源码
public class PtrClassicDefaultHeader extends FrameLayout implements PtrUIHandler {
// 省略所有代码...
}
没错,只不过是一个实现了接口 PtrUIHandler的View而已。那PtrUIHandler 定义了什么呢?
public interface PtrUIHandler {
void onUIReset(PtrFrameLayout var1);
void onUIRefreshPrepare(PtrFrameLayout var1);
void onUIRefreshBegin(PtrFrameLayout var1);
void onUIRefreshComplete(PtrFrameLayout var1);
void onUIPositionChange(PtrFrameLayout var1, boolean var2, byte var3, PtrIndicator var4);
}
看样子是定义了一些“时机”,在这些“时机”下我们的这个这个view可以做一些羞羞的事情。
管它的呢,不管怎么分析,总是要写的。既然是view,那么先走上。
感觉下需要的高度,蓝色的背景和白色的Loading对应的位置、大小。然后把这个画粗来。
定义 PtrMDHeader
public class PtrMDHeader extends View implements PtrUIHandler {
private final Paint paint = new Paint();
private final RectF ovalLoading = new RectF();
private final RectF ovalBlueBack = new RectF();
private int mWidth;
private int mHeight;
private int centerX;
private int centerY;
private int mLoadingStrokeWidth;
private int radiusBlue;
private int radiusWhite;
public PtrMDHeader(Context context) {
this(context, null);
}
public PtrMDHeader(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final float scale = getResources().getDisplayMetrics().density;
// 先拿60dip的高度耍耍
int heightSize = MeasureSpec.makeMeasureSpec((int) (60 * scale + 0.5f), View.MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightSize);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mWidth = w; // PtrMDHeader的宽度
mHeight = h; // PtrMDHeader的高度
centerX = mWidth / 2; // X轴中心点
centerY = mHeight / 2; // Y轴中心点
radiusBlue = mHeight / 4; // 蓝色背景半径
radiusWhite = radiusBlue / 2; // 白色Loading半径
mLoadingStrokeWidth = radiusBlue / 8; // 白色Loading尺寸
/* 白色Loading所在矩形区域 */
ovalLoading.left = centerX - radiusWhite;
ovalLoading.right = centerX + radiusWhite;
ovalLoading.top = centerY - radiusWhite;
ovalLoading.bottom = centerY + radiusWhite;
/** 蓝