UltimateRefreshView

预览

功能

  • 支持ListView,RecycleView,ScrollView,WebView
  • 一行代码指定是否支持上拉加载,下拉刷新
  • 自由定制刷新时头部和尾部的动画效果

使用方式

首先,是引入库

compile 'com.reoobter:ultrapullview:1.0.0'

其次,实现各自的动画效果

这里我们就以美团APP顶部下拉刷新的动画为例来看看如何实现动画效果

meituan_header_refresh_layout.xml

<?xml version="1.0" encoding="utf-8"?>    

这个布局文件很简单,整个只有一个ImageView。我们的实现思路,就是在不同的结点修改ImageView的内容,从而呈现出整个下拉刷新时所有的动画效果。那么这些结点是哪些呢?

public class MeiTuanHeaderAdapter extends BaseHeaderAdapter {    private ImageView loading;    private int viewHeight;    private float pull_distance=0;    public MeiTuanHeaderAdapter(Context context) {        super(context);    }    @Override    public View getHeaderView() {        View mView = mInflater.inflate(R.layout.meituan_header_refresh_layout, null, false);        loading = (ImageView) mView.findViewById(R.id.loading);        MeasureTools.measureView(mView);        viewHeight = mView.getMeasuredHeight();        return mView;    }    @Override    public void pullViewToRefresh(int deltaY) {        //这里乘以0.3 是因为UltimateRefreshView 源码中对于滑动有0.3的阻尼系数,为了保持一致        pull_distance=pull_distance+deltaY*0.3f;        float scale = pull_distance / viewHeight;        loading.setScaleX(scale);        loading.setScaleY(scale);    }    @Override    public void releaseViewToRefresh(int deltaY) {        loading.setImageResource(R.drawable.mei_tuan_loading_pre);        AnimationDrawable mAnimationDrawable= (AnimationDrawable) loading.getDrawable();        mAnimationDrawable.start();    }    @Override    public void headerRefreshing() {        loading.setImageResource(R.drawable.mei_tuan_loading);        AnimationDrawable mAnimationDrawable= (AnimationDrawable) loading.getDrawable();        mAnimationDrawable.start();    }    @Override    public void headerRefreshComplete() {        loading.setImageResource(R.drawable.pull_image);        loading.setScaleX(0);        loading.setScaleY(0);        pull_distance=0;    }}

通过代码我们可以总结出有4个重要的结点

  • 下拉进行时,这个时候随着手指滑动,整个顶部的view逐渐显示出来
  • 顶部view完全被下拉出来,这个时候顶部view已经完全显示出来了,手指释放(抬起)后将进入下一个结点。
  • 正在刷新进行时,刷新进行时,这个结点就是刷新动画执行的时候。
  • 刷新完成,在这个结点触发了刷新完成的动作

为了实现美团顶部刷新动画的效果,在第一个结点我们便开始执行动画,根据刷新的位移比,使用scale动画逐渐放大初始图片(绿色椭圆);在第二个结点,这个结点一般都很短暂,这个时候顶部已经完全展示,执行了小人偶翻转出现的动画;在第三个结点,这个结点一般是比较耗时的,在这里用帧动画播放了一个小人偶左右摇摆的动画;最后,在第四个结点,将所有内容初始化到下拉之前的状态,方便下次下拉刷星动画的执行。这样就完成了一次下拉刷新的动画效果。

最后,将动画效果适配到UltimateRefreshView之上

这里就以ListView为例。

首先是布局实现:

                

布局文件很简单,将所要实现的下拉刷新的控件放在UltimateRefreshView控件内即可。

public class ListViewFragment extends Fragment {    private UltimateRefreshView mUltimateRefreshView;    private int page = 0;    private int PER_PAGE_NUM = 15;    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        // Inflate the layout for this fragment        View view = inflater.inflate(R.layout.fragment_list_view, container, false);        initView(view);        return view;    }    private void initView(View view) {        View headview = LayoutInflater.from(getContext()).inflate(R.layout.list_headview_layout,                null, false);        ListView listView = (ListView) view.findViewById(R.id.listView);        final List datas = new ArrayList<>();        for (int i = 0; i < PER_PAGE_NUM; i++) {            datas.add("this is item " + i);        }        final ArrayAdapter adapter = new ArrayAdapter(getContext(), android.R.layout.simple_list_item_1, datas);        listView.setAdapter(adapter);        listView.addHeaderView(headview);        mUltimateRefreshView = (UltimateRefreshView) view.findViewById(R.id.refreshView);        mUltimateRefreshView.setBaseHeaderAdapter(new MeiTuanHeaderAdapter(getContext()));        mUltimateRefreshView.setBaseFooterAdapter();        mUltimateRefreshView.setOnHeaderRefreshListener(new OnHeaderRefreshListener() {            @Override            public void onHeaderRefresh(UltimateRefreshView view) {                page = 0;                new Handler().postDelayed(new Runnable() {                    @Override                    public void run() {                        datas.clear();                        for (int i = page * PER_PAGE_NUM; i < PER_PAGE_NUM; i++) {                            datas.add("this is item " + i);                        }                        adapter.notifyDataSetChanged();                        mUltimateRefreshView.onHeaderRefreshComplete();                    }                }, 2000);            }        });        mUltimateRefreshView.setOnFooterRefreshListener(new OnFooterRefreshListener() {            @Override            public void onFooterRefresh(UltimateRefreshView view) {                page++;                new Handler().postDelayed(new Runnable() {                    @Override                    public void run() {                        for (int i = page * PER_PAGE_NUM; i < (page + 1) * PER_PAGE_NUM; i++) {                            datas.add("this is item " + i);                        }                        adapter.notifyDataSetChanged();                        mUltimateRefreshView.onFooterRefreshComplete();                    }                }, 200);            }        });    }}

效果图

更多详细说明

更多相关文章

  1. Android(安卓)安卓动画 属性动画 - 移动动画
  2. Android图集的上下左右拖动及动画效果研究,图片拖拽或视频拖拽
  3. 【Android】21.4 图片动画缩放示例
  4. Android(安卓)使用TransitionManager来方便地实现过渡动画
  5. Android自定义ViewPager(一)——自定义Scroller模拟动画过程
  6. Android游戏中动画的实现 .
  7. 仿微信-界面动画(5)ViewPager详解
  8. Android属性动画之ObjectAnimator控制
  9. Android实现炫酷播放效果

随机推荐

  1. [置顶] 每天进步一点点——Linux
  2. c中变参函数的理解和编写(hello world引发
  3. Linux编程之《只运行一个实例》
  4. Linux selinux关闭方法和防火墙关闭方法
  5. 如何远程登录linux图形界面
  6. 专业嵌入式软件开发——全面走向高质高效
  7. 第一次发帖望各位大神帮顶啊!mini2440上的
  8. 堆栈/帧指针作为外部变量
  9. Linux最常用的基础命令 上篇
  10. Linux回调函数的应用---已经验证