【安卓进阶】Scroller理解与应用
项目中有个需求,就是在RecyclerView的item中进行侧滑,一开始同事推荐了一个开源库,使用起来确实也方便好用,直接在布局作为父布局即可实现侧滑。
自己也非常好奇这个开源库到底用了什么API能实现这种效果,于是慢慢开始了源码的阅读。
Scroller:
这个类是原生提供的滚动辅助工具类,使用它可以根据开始位置和结束位置计算出当前应该滚动到的坐标。
需要注意的是:Scroller并不会帮你设置View的滚动位置,它只负责计算当前应该滚动到的位置,所以你需要手动View的滚动位置。
下面是部分源码,当快速在Item进行手势侧滑,当手指抬起时,会使用Scroller进行计算。
case MotionEvent.ACTION_UP:
// ..... mScroller.startScroll(startX, 0, endX - startX, 0, 400); // ...... cancel(); break;
public void startScroll(int startX, int startY, int dx, int dy, int duration)调用此方法,将会开启计算滚动,在滚动计算启动后,你可以在任意时刻调用computeScrollOffset()让Scrooler计算最新位置。
public boolean computeScrollOffset()让Scrooler计算最新位置,此法返回布尔值,如果为真表示还没滚动到目标位置,否则表示已经滚动到目标位置。
public final int getCurrX()调用computeScrollOffset()之后,可以通过此方法获取当前应该滚动到x坐标,同理也有getCurrY()。
View.computeScroll()
在了解View.computeScroll()方法前,需要了解一下View.scrollTo()和View.scrollBy()方法。
scrollTo():将View滚动到指定位置。
scrollBy():内部其实是调用了scrollTo()方法。
public void scrollTo(int x, int y) {
if (mScrollX != x || mScrollY != y) {
int oldX = mScrollX;
int oldY = mScrollY;
mScrollX = x;
mScrollY = y;
invalidateParentCaches();
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
if (!awakenScrollBars()) {
postInvalidateOnAnimation();
}
}
}
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
这里讲解一下scrollTo()和scrollBy()方法的重要流程:scrollTo() ==> postInvalidateOnAnimation() ==> 重绘 ==> View.computeScroll()
View.computeScroll()这个方法会在重绘的时候进行调用,而scrollTo()会触发重绘操作。在View里面,computeScroll()是一个空方法。
/**
* Called by a parent to request that a child update its values for mScrollX
* and mScrollY if necessary. This will typically be done if the child is
* animating a scroll using a {@link android.widget.Scroller Scroller}
* object.
*/
public void computeScroll() {
}
系统原生说得很明白了,在computeScroll()里面我们通常是使用Scroller进行计算滚动位置,然后执行动画滚动。
// 一个例子public void computeScroll() {
// 如果还没有滚动到最后位置
if(mScroller.computeScrollOffset()){ // scrollTo()和scrollBy()方法都是没有动画效果的,是瞬间就滚动了View,所以通过Scroller不断计算滚动进行细微滚动,形成滚动效果。
scrollTo(mScroller.getCurrX() ,mScoller.getCurrY());
postInvalidate();
}
}
【安卓进阶】Scroller理解与应用的更多相关文章
- python 变量进阶(理解)
变量进阶(理解) 目标 变量的引用 可变和不可变类型 局部变量和全局变量 01. 变量的引用 变量 和 数据 都是保存在 内存 中的 在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引 ...
- 安卓进阶之自定义View
目录 安卓进阶之自定义View 自定义View的工作流程和内容 工作流程 测量阶段和布局阶段的工作内容 View 和 ViewGroup 在测量阶段和布局阶段的区别 绘制阶段的工作内容 上手:实现继承 ...
- JavaScript 开发进阶:理解 JavaScript 作用域和作用域链
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...
- JavaScript 开发进阶:理解 JavaScript 作用域和作用域链(转载 学习中。。。)
作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域和作用域链作简单的介绍,希望 ...
- 【安卓进阶】Product Flavor基础玩法
在安卓项目开发中,大多时候总是有测试环境.生产环境之类的区别,在不使用Product Flavor时,我们一般都是通过手工改动代码来实现测试环境.生产环境的切换. 这样就造成了项目管理上的不便,频繁的 ...
- Understanding Android Security(安卓安全的理解)
论文作者: Enck, William Ongtang, MacHigar McDaniel, Patrick 下一代的开放操作系统不会在个人主机和大型主机上出现,而是在只能手机上.新环境的开放性将会 ...
- 【安卓进阶】LiveData
最近参与到后端的工作中,虽然以前在工作中使用过PHP,但是这次使用的是Java,开发思路和方式有所不同.后端开发中,做接口也是需要处理大量的业务逻辑关系,同时一些事务之类的技术因素也要考虑好,在架设项 ...
- 安卓中的消息循环机制Handler及Looper详解
我们知道安卓中的UI线程不是线程安全的,我们不能在UI线程中进行耗时操作,通常我们的做法是开启一个子线程在子线程中处理耗时操作,但是安卓规定不允许在子线程中进行UI的更新操作,通常我们会通过Handl ...
- Java都有什么进阶技术
Java都有什么进阶技术? 看到有人给题主推荐<代码整洁之道>,评论有人说那不是JAVA进阶的书- 私以为,一些人对JAVA进阶的理解片面了,JAVA不过也是一门语言,提升和进阶还是内 ...
随机推荐
- 并发编程实战1-chap1-2-斗者6星
一.线程安全性 1.线程安全关注点:对共享的和可变的状态的访问 2.JAVA同步机制:synchronized.volatile.显示锁.原子变量 3.无状态对象一定是线程安全的:不包含任何域,也不包 ...
- namenode No valid image files
1,角色日志报错 Encountered exception loading fsimage java.io.FileNotFoundException: No valid image files f ...
- Canvas Snippets
========================================== Example: 1. To revel "fillStyle" property, type ...
- 前端学习历程--vue
---恢复内容开始--- 一.对比其他框架 1.react: 共同点: 使用 Virtual DOM 提供了响应式(Reactive)和组件化(Composable)的视图组件. 将注意力集中保持在核 ...
- C#-----类DateTime的常用方法
1.TryParse(string s, out DateTime result) 将日期和时间的指定字符串表示形式转换为其 System.DateTime 等效项,并返回一个指示转换是否成功的 ...
- A Boring Question (打表)
题意:由m个0到n组合的数的相邻两项的组合数的乘积. 思路:好好打表!!!找规律!!! #include<bits/stdc++.h> using namespace std; typed ...
- 大数据处理框架之Strom:DRPC
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk1.8 storm-0.9 一.DRPC DRPC:Distri ...
- 关于Axure RP软件的介绍——软件工程实践第二次个人作业
关于Axure RP软件的介绍——软件工程实践第二次个人作业 Axure RP是一个非常专业的快速原型设计的一个工具,客户提出需求,然后根据需求定义和规格.设计功能和界面的专家能够快速创建应用软件或W ...
- 外网登录访问树莓派 Raspberry Pi
外网登录访问树莓派 Raspberry Pi 本地的树莓派 Raspberry Pi,只能在局域网内访问,怎样从公网也能登录访问树莓派 Raspberry Pi? 本文将介绍具体的实现步骤. 1. 准 ...
- 处理smartgit 过期脚本
@echo off @title SmartGit License Tool color 1f cls set "version=18.1" set "fpath=%AP ...