1. 我们看到手机中的各种APP的花样繁多的下拉刷新是不是有点心动呢,想着自己定制自己的专门的下拉刷新,市场上比如,58同城,京东,天猫,美团等下拉刷新都是在下拉头部执行帧动画,我最近看到一个APP,就是慕课网的Android客户端,平时有时候看这个网站的学习视频,就下了一个,发现它的头部是一个圆形的水波纹效果:

      看起来很Cool,正好公司有需求做官网的APP,正好可以用上公司的Logo做一个水波纹的下拉刷新,首先要实现水波纹的效果,通过解压慕课网的客户端,发现它的实现其实也是用帧动画,就是假的水波纹,但是我们不想这么早,要做一个完整的水波纹下拉刷新,那么就要实现水波纹的效果,在github上很多水波纹的实现,实现原理是用正弦与余弦曲线,这里放一个链接,有兴趣的可以看看https://github.com/john990/WaveView

      然后用美工切的图往上一盖,基本雏形就出来了

      ok,下面就是往下拉刷新上集成了。这里介绍一个比较牛逼的下拉刷新框架android-Ultra-Pull-to-Refresh,这个框架可以方便的定制下拉刷新的头部,接口强大,值得研究,下面我们就进行移植实现:

      首先使用这个框架定制头部,需要我们把头部的View先实现出来,只要实现PtrUIHandler接口即可:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      package cn.zmit.ow.widget;
       
      import in.srain.cube.views.ptr.PtrFrameLayout;
      import in.srain.cube.views.ptr.PtrUIHandler;
      import android.annotation.SuppressLint;
      import android.content.Context;
      import android.util.AttributeSet;
      import android.view.LayoutInflater;
      import android.view.View;
      import android.widget.FrameLayout;
      import cn.zmit.ow.R;
      import cn.zmit.ow.widget.waveview.WaveView;
       
      /**
      * 自定义下拉刷新头部
      *
      * @author Robin time 2015-02-11 14:06:33
      *
      */
       
      public class CustomPtrHeader extends FrameLayout implements PtrUIHandler {
      WaveView wave_view;
      int i;
       
      public CustomPtrHeader(Context context) {
      super(context);
      init();
      }
       
      public CustomPtrHeader(Context context, AttributeSet attrs) {
      super(context, attrs);
      init();
      }
       
      public CustomPtrHeader(Context context, AttributeSet attrs, int defStyleAttr) {
      super(context, attrs, defStyleAttr);
      init();
      }
       
      @SuppressLint("NewApi")
      public CustomPtrHeader(Context context, AttributeSet attrs,
      int defStyleAttr, int defStyleRes) {
      super(context, attrs, defStyleAttr, defStyleRes);
      init();
      }
       
      /**
      * 初始化
      */
      private void init() {
      View view = LayoutInflater.from(getContext()).inflate(
      R.layout.custom_ptr_header, this);
      wave_view = (WaveView) view.findViewById(R.id.wave_view);
      }
       
      @Override
      public void onUIReset(PtrFrameLayout frame) {
       
      }
       
      @Override
      public void onUIRefreshPrepare(PtrFrameLayout frame) {
       
      }
       
      @Override
      public void onUIRefreshBegin(PtrFrameLayout frame) {
      /* if (wave_view.getProgress()==0) {
      for (i = 0; i < 100; i++) {
      new Thread(){
      public void run() {
      UIKit.runOnMainThreadAsync(new Runnable() {
       
      @Override
      public void run() {
      wave_view.setProgress(i);
       
      if (wave_view.getProgress()==100) {
      wave_view.setProgress(0);
      }
       
      }
      });
       
      try {
      Thread.sleep(200);
      } catch (InterruptedException e) {
      e.printStackTrace();
      }
      };
      }.start();
      }
      }*/
       
      }
       
      @Override
      public void onUIRefreshComplete(PtrFrameLayout frame) {
       
      }
       
      @Override
      public void onUIPositionChange(PtrFrameLayout frame, boolean isUnderTouch,
      byte status, int oldPosition, int currentPosition,
      float oldPercent, float currentPercent) {
       
      float percent = Math.min(1f, currentPercent);
       
      // if (status == PtrFrameLayout.PTR_STATUS_PREPARE) {
      wave_view.setProgress((int) (percent * 100 * 1.0));
      invalidate();
      // }
       
      }
       
      /**
      * 设置波纹进度
      * @param progress 进度
      */
      public void setWaveProgress(int progress){
      wave_view.setProgress(progress);
      }
       
      }

      头部定义好之后,就可以调用下拉刷新的代码

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      /* 创建自定义刷新头部view */
      header = new CustomPtrHeader(this);
      /* 设置刷新头部view */
      ptr_view.setHeaderView(header);
      /* 设置回调 */
      ptr_view.addPtrUIHandler(header);
      /* 设置下拉刷新监听 */
      ptr_view.setPtrHandler(new PtrHandler() {
       
      @Override
      public void onRefreshBegin(PtrFrameLayout frame) {
      refresh();
      }
       
      @Override
      public boolean checkCanDoRefresh(PtrFrameLayout frame,
      View content, View header) {
      if (!StringUtils.isEmpty(mCurrentUrl)) {
      return mCurrentUrl.equals("http://m.zmit.cn/")
      || mCurrentUrl.equals("http://m.zmit.cn/index.php") ? false
      : mWebView.getScrollY() == 0;
      } else {
      return mWebView.getScrollY() == 0;
      }
       
      }
      });
      /* 延时100秒 */
      ptr_view.postDelayed(new Runnable() {
      @Override
      public void run() {
      ptr_view.autoRefresh();
      }
      }, 100);
      /* 下拉时阻止事件分发 */
      ptr_view.setInterceptEventWhileWorking(true);

      这样就完成了,看下最终实现效果

      本文永久地址:http://blog.it985.com/7787.html
      本文出自 IT985博客 ,转载时请注明出处及相应链接。

Android 定制下拉刷新头部 Ultra Pull To Refresh的更多相关文章

  1. Android 实现下拉刷新和上拉加载更多的RECYCLERVIEW和SCROLLVIEW

    PullRefreshRecyclerView.java /** * 类说明:下拉刷新上拉加载更多的RecyclerView * Author: gaobaiq * Date: 2016/5/9 18 ...

  2. Xamarin. Android实现下拉刷新功能

    PS:发现文章被其他网站或者博客抓取后发表为原创了,给图片加了个水印 下拉刷新功能在安卓和iOS中非常常见,一般实现这样的功能都是直接使用第三方的库,网上能找到很多这样的开源库.然而在Xamarin. ...

  3. Android智能下拉刷新加载框架—看这些就够了

    一些值得学习的几个下拉刷新上拉加载开源库 Android智能下拉刷新框架-SmartRefreshLayout 支持所有的 View(AbsListView.RecyclerView.WebView. ...

  4. android Android-PullToRefresh 下拉刷新

    1.github下载地址 原作者:  https://github.com/chrisbanes/Android-PullToRefresh 我自己的:  https://github.com/zyj ...

  5. Android自定义下拉刷新

    网上的下拉刷新功能很多,不过基本上都是隐藏header的,而项目里面需要只隐藏部分的header,类似QQ好友动态的效果,修改了一些现有的,最后有很多问题,所以就自己自定义了一个,逻辑也很简单,首先就 ...

  6. Android 自定义下拉刷新ListView

    package com.dwtedx.qq.view; import android.content.Context; import android.util.AttributeSet; import ...

  7. 【Android】下拉刷新实现

    关于这方面的文章百度下有很多,我就只写写我自己实现过程. 我觉得学习一门语言不是做了几个项目就可以认为自己会了,这只是暂时的,若没有笔记,时间长了,你是怎么解决某些问题,估计连你自己都忘了,又得费时费 ...

  8. Android PullToRefresh 下拉刷新,上拉很多其它,支持ScrollView,ListView,可方便拓展GridView,WebView等

    在写着东西之前.从网上找到非常多这方面的源代码,可是基本没有找到惬意的.包含在GitHub上的比較有名的Android-PullToRefresh-master.思来想去还是自己写吧.当然当中借鉴了一 ...

  9. 032 Android智能下拉刷新框架-SmartRefreshLayout+RecyclerView的使用

    1.SmartRefreshLayout介绍 SmartRefreshLayout的目标是打造一个强大,稳定,成熟的下拉刷新框架,并集成各种的炫酷.多样.实用.美观的Header和Footer. 正如 ...

随机推荐

  1. How to join a Ubuntu to Windows Domain

    My testing environment: Windows Server 2012 R2 Essentials: With AD and standalone DC in one single b ...

  2. 3527: [Zjoi2014]力 - BZOJ

    题目大意:给出n个数qi,定义 Fj为        令 Ei=Fi/qi,求Ei. 看了很久题解,终于有些眉目,因为知道要用FFT,所以思路就很直了 其实我们就是要±1/(j-i)^2 ( j-i大 ...

  3. 【CentOs】搭建svn服务器

    参考资料: svn攻略: http://blog.csdn.net/colinchan/article/details/1865154 错误解决:http://hi.baidu.com/anglem/ ...

  4. 【bzoj1010】[HNOI2008]玩具装箱toy

    1010: [HNOI2008]玩具装箱toy Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 9281  Solved: 3719[Submit][St ...

  5. 我收集到的最好的jQuery和CSS3导航菜单

    jQuery和CSS3导航菜单在网页设计和开发的重要组成部分之一.利用jQuery+CSS3实现可以做出拥有各种动画效果的漂亮菜单.在这里,我们收集了一些最好的jQuery+CSS3实现的导航菜单. ...

  6. JAVA 异常对于性能的影响

    陶炳哲 - MAY 12, 2015 在对OneAPM的客户做技术支持时,我们常常会看到很多客户根本没意识到的异常.在消除了这些异常之后,代码运行速度与以前相比大幅提升.这让我们产生一种猜测,就是在代 ...

  7. HDU 4569 Special equations(数学推论)

    题目 //想不出来,看了解题报告 /* 题意:给你一个最高幂为4的一元多项式,让你求出一个x使其结果模p*p为0. 题解:f(x)%(p*p)=0那么一定有f(x)%p=0,f(x)%p=0那么一定有 ...

  8. iOS KVC,KVO

    链接(写得不错,着重kvc):http://www.cocoachina.com/industry/20140224/7866.html 链接:http://www.cnblogs.com/kensh ...

  9. iOS文件操作

      ];                   NSString *plistPath = [filePath stringByAppendingPathComponent:@"collect ...

  10. SELECT 语句不详解

    INSERT INTO ...  SELECT 语句, 将查询的结果插入到一张新表中(可为临时表) DECLARE @MyTable Table ( SalesOrderID int, Custome ...