Android View 下拉刷新之头部效果自定义 [水]

本文介绍如何基于开源框架android-Ultra-Pull-To-Refresh自定义下拉刷新头部效果,通过分析PtrClassicDefaultHeader源码,实现不同状态下的动画变化,包括扇形背景的展开和Loading图标的变化。在下拉过程中,通过PtrIndicator获取位置信息,调整动画状态,最终完成一个完整的下拉刷新头部动画效果。
摘要由CSDN通过智能技术生成

尊重原创转载请注明:http://blog.csdn.net/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;

        /** 蓝
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值