热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PullToRefreshScrollView下拉刷新开源组件分析

该库被使用较多,而其manual又较为简单。所以决定分析一下,先从几个问题入手:icon怎么做到随着下拉的进行而联动旋转的?

该库被使用较多,而其manual又较为简单。所以决定分析一下,先从几个问题入手:


icon怎么做到随着下拉的进行而联动旋转的?

这里写图片描述

通过关系图发现我们所有用到的组件都继承自PullToRefreshBase
对,它就是分析的出发点:


1. 类PullToRefreshBase

onTouchEvent(MotionEvent event) –MotionEvent.ACTION_MOVE – >
pullEvent()

newScrollValue = Math.round(Math.min(initialMotionValue - lastMotionValue, 0) / FRICTION);itemDimension = getHeaderSize();

看的出,将初始位置减去当前移动到的位置 得到位置增量 再除一个摩擦系数(FRICTION),接着

float scale = Math.abs(newScrollValue) / (float) itemDimension;
/* 中间省略一些代码 */
mHeaderLayout.onPull(scale);

通过header和footer的宽/高度来计算得到一个scale,并调用mHeaderLayout的方法。

注:
1.如果对 PullToRefreshScrollView组件中的xml参数有疑问,一定要看看PullToRefreshBase.init(Context context, AttributeSet attrs)中利用这些参数都干了些啥。


2. LoadingLayout?

在PullToRefreshBase.createLoadingLayout()方法会根据传递的参数(flip or rotate)来创建相应的LoadingLayout,LoadingLayout其有两个子类:RotateLoadingLayout 和 FlipLoadingLayout 分别代表了两种下拉时候所执行的动画所在,这个时候基本上有谱了。


下来将1.说的地方串联起来 ,mHeaderLayout从怎么产生的?

PullToRefreshBase.init()–>createLoadingLayout() –>AnimationStyle.createLoadingLayout()–>RotateLoadingLayout or FlipLoadingLayout.

也就是mHeaderLayout 就是 RotateLoadingLayout or FlipLoadingLayout的对象。


下拉时默认的动画如何替换为自己定义的

以RotateLoadingLayout为例,只需要在两处地方替换自己的实现就可以了。

public class RotateLoadingLayout extends LoadingLayout {static final int ROTATION_ANIMATION_DURATION = 1200;private final Animation mRotateAnimation;private final Matrix mHeaderImageMatrix;private float mRotationPivotX, mRotationPivotY;private final boolean mRotateDrawableWhilePulling;public RotateLoadingLayout(Context context, Mode mode, Orientation scrollDirection, TypedArray attrs) {super(context, mode, scrollDirection, attrs);mRotateDrawableWhilePulling = attrs.getBoolean(R.styleable.PullToRefresh_ptrRotateDrawableWhilePulling, true);mHeaderImage.setScaleType(ScaleType.MATRIX);mHeaderImageMatrix = new Matrix();mHeaderImage.setImageMatrix(mHeaderImageMatrix);/*** mRotateAnimation 是在手下拉结束后 加载中的动画效果,* 可以替换为自己的动画*/mRotateAnimation = new RotateAnimation(0, 720, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,0.5f);mRotateAnimation.setInterpolator(ANIMATION_INTERPOLATOR);mRotateAnimation.setDuration(ROTATION_ANIMATION_DURATION);mRotateAnimation.setRepeatCount(Animation.INFINITE);mRotateAnimation.setRepeatMode(Animation.RESTART);}public void onLoadingDrawableSet(Drawable imageDrawable) {if (null != imageDrawable) {mRotationPivotX = Math.round(imageDrawable.getIntrinsicWidth() / 2f);mRotationPivotY = Math.round(imageDrawable.getIntrinsicHeight() / 2f);}}protected void onPullImpl(float scaleOfLayout) {/*** 这个函数里是下拉过程中的联动动画,* 这里根据scaleOfLayout提供的值来在不同阶段展现不同的效果动画*/float angle;if (mRotateDrawableWhilePulling) {angle = scaleOfLayout * 90f;} else {angle = Math.max(0f, Math.min(180f, scaleOfLayout * 360f - 180f));}mHeaderImageMatrix.setRotate(angle, mRotationPivotX, mRotationPivotY);mHeaderImage.setImageMatrix(mHeaderImageMatrix);}@Overrideprotected void refreshingImpl() {mHeaderImage.startAnimation(mRotateAnimation);}@Overrideprotected void resetImpl() {mHeaderImage.clearAnimation();resetImageRotation();}private void resetImageRotation() {if (null != mHeaderImageMatrix) {mHeaderImageMatrix.reset();mHeaderImage.setImageMatrix(mHeaderImageMatrix);}}@Overrideprotected void pullToRefreshImpl() {// NO-OP}@Overrideprotected void releaseToRefreshImpl() {// NO-OP}@Overrideprotected int getDefaultDrawableResId() {return R.drawable.default_ptr_rotate;}}

推荐阅读
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了Java中Hashtable的clear()方法,该方法用于清除和移除指定Hashtable中的所有键。通过示例程序演示了clear()方法的使用。 ... [详细]
  • 本文介绍了Cocos2dx学习笔记中的更新函数scheduleUpdate、进度计时器CCProgressTo和滚动视图CCScrollView的用法。详细介绍了scheduleUpdate函数的作用和使用方法,以及schedule函数的区别。同时,还提供了相关的代码示例。 ... [详细]
author-avatar
波波利一_830
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有