android简单流畅的下拉刷新pulltorefresh实现过程

本文介绍了如何实现一个流畅的Android下拉刷新功能,通过自定义ListView,监听用户下拉动作,利用属性动画控制Header高度变化,实现平滑的刷新效果。在用户松手时,通过动画回弹,提供无缝的用户体验。
摘要由CSDN通过智能技术生成

前言

我很早之前就使用过pulltorefresh的开源项目, 唯一的感觉就是卡. 最近在做graph api的demo, 想顺便实现一个pulltorefresh, 所以从网上找了一些实现来看, 不满意的是他们都非常的卡, 即便是在小米4上面也有明显的掉帧, 但是我又发现另外一些应用的下拉刷新做的非常流畅, 没有丝毫卡顿, 研究了一下这些应用, 他们的pulltorefresh控件远没有网上的其他实现那么复杂, 有复用的空间, 是个比较适合学习的例子, 在这里给大家分享一下思路和具体的代码实现.

思路

ListView允许我们给它添加一个Header, 如果我们将这个Header的高度设为0, 那么平时用户是看不到这个Header的, 我们监听用户下拉的动作, 如果发现ListView现在处于最顶端, 用户继续下拉, 我们就将Header的高度增加, 这样就造成一种错觉, 用户以为是自己把ListView拉下来了, 但是实际上是我们主动把Header的高度增加了, 把ListView给顶下来了. 用户松手, 我们利用属性动画将Header的高度逐渐减小即可.

准备工作

我们先把需要使用的布局和动画准备好

Header的布局

Header的布局其实是这样
这里写图片描述
左边的箭头图片和一个环形进度条是重叠的, 在表示为加载的时候, 进度条显示, 箭头隐藏, 凡是用过下拉刷新的人都明白.
下面是布局的xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <FrameLayout android:gravity="bottom" android:id="@+id/pull_header"
        android:layout_width="match_parent"
        android:layout_gravity="bottom|center"
        android:layout_height="0dp">
        <FrameLayout android:layout_gravity="bottom|left"
            android:id="@+id/layout_indicator"
            android:layout_width="wrap_content"
            android:layout_height="@dimen/pulldown_header_height"
            android:layout_marginLeft="50.0dip">
            <ProgressBar android:layout_gravity="center"
                android:id="@+id/pull_header_prog"
                android:visibility="gone"
                android:layout_width="22.0dip"
                android:layout_height="22.0dip" />
            <ImageView android:layout_gravity="center"
                android:id="@+id/pullheader_indicator"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/pullheader_indicator"
                android:scaleType="center" />
        </FrameLayout>
        <LinearLayout android:gravity="center"
            android:layout_gravity="bottom|center"
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="@dimen/pulldown_header_height">
            <TextView android:textSize="15.0sp"
                android:id="@+id/pull_header_major_text"
                android:layout_width="wrap_content"
                android:text="下拉刷新你怕不怕"
                android:layout_height="wrap_content" />
            <TextView android:textSize="14.0sp"
                android:id="@+id/pull_header_minor_text"
                android:visibility="gone"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </FrameLayout>
</LinearLayout>

注意布局文件将整个可视区域的高度设为0dp.

箭头动画

下拉到一定程度, 箭头会转动180度, 这个可以通过xml写好的动画来实现, 下面就是转动180度以及再转180度的动画
转动180度

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:duration="300"
        android:fromDegrees="0.0"
        android:toDegrees="180.0"
        android:pivotX="50.0%"
        android:pivotY="50.0%" />
</set>

再转180度恢复原状

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate android:interpolator="@android:anim/accelerate_decelerate_interpolator"
        android:duration="300"
        android:fromDegrees="180.0"
        android:toDegrees="360.0"
        android:pivotX="50.0%"
        android:pivotY="50.0%" />
</set>

继承ListView

public 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值