Android scrollTo、scrollBy、以及scroller详解 自定义ViewPager
Scroller
VelocityTracker
VelocityTracker 是一个速度跟踪器,通过用户操作时(通常在 View 的 onTouchEvent 方法中)传进去一系列的 Event,该类就可以计算出用户手指滑动的速度,开发者可以方便地获取这些参数去做其他事情。或者手指滑动超过一定速度并松手,就触发翻页。
CustomViewPager
package com.flannery.androidtools.widgets;import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Scroller;/*** VelocityTracker is a concept commonly used in computer graphics, physics simulations, and user interface frameworks to calculate the velocity of an object or pointer based on its position over time. It's particularly useful for creating responsive and realistic interactions in applications like games or touch-based user interfaces.* In the context of Android development, VelocityTracker refers to a class provided by the Android framework. It's used to track the velocity of motion events, such as touch events, on the screen. This can be useful for implementing various gestures and animations that require knowledge of how quickly a user is moving their finger across the screen.* Here's a basic overview of how VelocityTracker works in Android:* Initialization: To use VelocityTracker, you need to create an instance of it and associate it with a specific motion event, typically the ACTION_MOVE events in the case of touch gestures.* Tracking: As the user interacts with the screen, you feed the VelocityTracker instance with the motion events, which contain the current position of the pointer. The VelocityTracker class calculates the velocity based on the change in position over time.* Velocity Retrieval: After you've collected enough motion events, you can retrieve the calculated velocity using the computeCurrentVelocity(int units) method. The units parameter allows you to specify the desired units for the velocity, such as pixels per second.** https://www.nhooo.com/note/qadf7m.html*/
public class CustomViewPager extends ViewGroup {private static final String TAG = CustomViewPager.class.getSimpleName();private int screenWidth;private int screenHeight;private int lastMoveX = 0;private Scroller scroller; // 滚动计算器private VelocityTracker velocityTracker; // 速度跟踪器private int MAX_VELOCITY = 600;private int curScreen = 0;public CustomViewPager(Context context) {super(context);init(context);}public CustomViewPager(Context context, AttributeSet attrs) {super(context, attrs);init(context);}public CustomViewPager(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init(context);}private void init(Context context) {scroller = new Scroller(context); // 初始化滚动计算器// 添加三个ViewLinearLayout layout1 = new LinearLayout(context);layout1.setBackgroundColor(Color.RED);addView(layout1);LinearLayout layout2 = new LinearLayout(context);layout2.setBackgroundColor(Color.GREEN);addView(layout2);LinearLayout layout3 = new LinearLayout(context);layout3.setBackgroundColor(Color.BLUE);addView(layout3);}@Overridepublic boolean onTouchEvent(MotionEvent event) {Log.i(TAG, "onTouchEvent: onTouchEvent=" + event);if (velocityTracker == null) {velocityTracker = VelocityTracker.obtain(); // 初始化滚动速度跟踪器}velocityTracker.addMovement(event);int x = (int) event.getX();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:lastMoveX = x; // 记录下按下的点break;case MotionEvent.ACTION_MOVE:int dis = lastMoveX - x; // 移动的偏移量Log.i(TAG, "onTouchEvent: dis=" + dis);scrollBy(dis, 0); // 位置滚动lastMoveX = x;break;case MotionEvent.ACTION_UP:velocityTracker.computeCurrentVelocity(1000); // 计算需要的位置int velocityX = (int) velocityTracker.getXVelocity(); // X轴上的速度if (velocityX > MAX_VELOCITY && curScreen > 0) {jump2Screen(curScreen - 1);} else if (velocityX < -MAX_VELOCITY && curScreen < getChildCount() - 1) {jump2Screen(curScreen + 1);} else {int screen = (getScrollX() + screenWidth / 2) / screenWidth;jump2Screen(screen);}if (velocityTracker != null) {velocityTracker.recycle();velocityTracker = null;}break;}return true;}public void jump2Screen(int screen) {curScreen = screen;if (curScreen < 0) {curScreen = 0;}if (curScreen > getChildCount() - 1) {curScreen = getChildCount() - 1;}int dis = curScreen * screenWidth - getScrollX();scroller.startScroll(getScrollX(), 0, dis, 0); // 开始滚动invalidate();}@Overridepublic void computeScroll() {super.computeScroll();if (scroller.computeScrollOffset()) { // 是否处于偏移量的位置scrollTo(scroller.getCurrX(), 0); // 滚动到指定的位置postInvalidate(); // 继续滚动}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);screenWidth = MeasureSpec.getSize(widthMeasureSpec);screenHeight = MeasureSpec.getSize(heightMeasureSpec);setMeasuredDimension(screenWidth, screenHeight);// 给子View设置大小for (int i = 0; i < getChildCount(); i++) {View view = getChildAt(i);view.measure(screenWidth, screenHeight);}}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {int leftWidth = 0;// 给子View排班for (int i = 0; i < getChildCount(); i++) {View view = getChildAt(i);view.layout(leftWidth, 0, leftWidth + screenWidth, screenHeight);leftWidth = leftWidth + screenWidth;}}
}
资料
Android scrollTo、scrollBy、以及scroller详解
Android Scroller详解
Android自定义ViewPager实例
Android View 的滚动原理和 Scroller、VelocityTracker 类的使用
相关文章:
Android scrollTo、scrollBy、以及scroller详解 自定义ViewPager
Scroller VelocityTracker VelocityTracker 是一个速度跟踪器,通过用户操作时(通常在 View 的 onTouchEvent 方法中)传进去一系列的 Event,该类就可以计算出用户手指滑动的速度,开发者可以方便地获取这些参数去做其他…...
Aidex 移动端快速开发框架# RuoYi-Uniapp项目,uniapp vue app项目跨域问题
参考地址: manifest.json官方配置文档:manifest.json 应用配置 | uni-app官网 Chrome 调试跨域问题解决方案之插件篇: uni-app H5跨域问题解决方案(CORS、Cross-Origin) - DCloud问答 其实uni-app官方有解决跨域的办…...
JVM7:垃圾回收是什么?从运行时数据区看垃圾回收到底回收哪块区域?垃圾回收如何去回收?垃圾回收策略,引用计数算法及循环引用问题,可达性分析算法
垃圾回收是什么?从运行时数据区看垃圾回收到底回收哪块区域? 垃圾回收如何去回收? 垃圾回收策略 引用计数算法及循环引用问题 可达性分析算法 垃圾回收是什么?从运行时数据区看垃圾回收到底回收哪块区域?垃圾回收如何去…...
NFT Insider #104:The Sandbox:全新土地销售活动 Turkishverse 来袭
引言:NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品,浓缩每周NFT新闻,为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据,艺术新闻类,游戏新闻类,虚拟世界类&#…...
Docker架构及原理
一、Docker的架构图 二、底层原理 Docker是怎么工作的? Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上, 然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器…...
VScode使用SSH连接linux
1、官网下载和安装软件 https://code.visualstudio.com/Download 2、安装插件 单击左侧扩展选项,搜索插件安装 总共需要安装的插件如下所示 3、配置连接服务器的账号 安装完后会在左侧生成了远程连接的图标,单击此图标,然后选择设置图标…...
多线程的创建与同步
目录 线程的创建 1.多线程的创建:方式一:继承于Thread类 2.多线程的创建:方式二:实现Runnable 3..线程创建方式三:实现Callable接口 线程的同步 1.同步的方式:方式一:同步代码块 2.…...
LLMs 缩放指令模型Scaling instruct models FLAN(Fine-tuned LAnguage Net,微调语言网络)
本论文介绍了FLAN(Fine-tuned LAnguage Net,微调语言网络),一种指导微调方法,并展示了其应用结果。该研究证明,通过在1836个任务上微调540B PaLM模型,同时整合Chain-of-Thought Reasoning&#…...
政务大厅人员睡岗离岗玩手机识别算法
人员睡岗离岗玩手机识别算法通过pythonyolo系列网络框架算法模型,人员睡岗离岗玩手机识别算法利用图像识别和行为分析,识别出睡岗、离岗和玩手机等不符合规定的行为,并发出告警信号以提醒相关人员。Python是一种由Guido van Rossum开发的通用…...
认识Mybatis的关联关系映射,灵活关联表对象之间的关系
目录 一、概述 ( 1 ) 介绍 ( 2 ) 关联关系映射 ( 3 ) 关联讲述 二、一对一关联映射 2.1 数据库创建 2.2 配置文件 2.3 代码生成 2.4 编写测试 三、一对多关联映射 四 、多对多关联映射 给我们带来的收获 一、概述 ( 1 ) 介绍 关联关系映射是指在数据库中&…...
如何开发一款唯一艺术平台 区块链 /数字藏品
艺术作品是人类文化的瑰宝,而艺术平台则是连接艺术家与观众的桥梁。如何开发一款独一无二的艺术平台,既要满足专业艺术作品展示的要求,又要提供深度思考的空间,这是我们所面临的挑战。本文将从专业性、思考深度和逻辑性等多个方面…...
【UniApp开发小程序】私聊功能后端实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】
声明 本文提炼于个人练手项目,其中的实现逻辑不一定标准,实现思路没有参考权威的文档和教程,仅为个人思考得出,因此可能存在较多本人未考虑到的情况和漏洞,因此仅供参考,如果大家觉得有问题,恳…...
运维高级学习--Kubernetes(K8s 1.28.x)部署
一、基础环境配置(所有主机操作) 主机名规划 序号 主机ip 主机名规划1 192.168.1.30 kubernetes-master.openlab.cn kubernetes-master2 192.168.1.31 kubernetes-node1.openlab.cn kubernetes-node13 192.168.1.32 kubernetes-node2…...
Apache zookeeper kafka 开启SASL安全认证 —— 筑梦之路
简介 Kafka是一个高吞吐量、分布式的发布-订阅消息系统。Kafka核心模块使用Scala语言开发,支持多语言(如Java、Python、Go等)客户端,它可以水平扩展和具有高吞吐量特性而被广泛使用,并与多类开源分布式处理系统进行集成…...
lintcode 1017 · 相似的RGB颜色【进制计算】
题目链接,题目描述 https://www.lintcode.com/problem/1017 在本题中,每个大写字母代表从“0”到“f”的一些十六进制数字。红绿蓝三元色#AABBCC可以简写为#ABC。 例如,#15c是颜色#1155cc的简写。现在,定义两种颜色#ABCDEF和#UV…...
全国首台!浙江机器人产业集团发布垂起固定翼无人机-机器人自动换电机巢
展示突破性创新技术,共话行业发展趋势。8月25日,全国首台垂起固定翼无人机-机器人自动换电机巢新品发布会暨“科创中国宁波”无人机产业趋势分享会在余姚市机器人小镇成功举行。 本次活动在宁波市科学技术协会、余姚市科学技术协会指导下,由浙…...
采用 UML 对软件系统进行建模的基本框架
UML 包括一些可以相互组合为图标的图形元素, 通过提供不同形式的图形来 表述从软件分析开始的软件开发全过程的描述,一个图就是系统架构在某个侧面的 表示,所有的图组成了系统的完整视图。UML 主要提供了以下五类图: ÿ…...
编译tiny4412 Linux 内核
工作环境 Ubuntu 22 交叉编译器 4.5.1 解压Linux内核源码,进入目录 将官方配置完好的defconfig文件作为配置文件 cp tiny4412_linux_defconfig .config由于内核版本较低,需要下载低版本的gcc,选择下载gcc-9与g9 sudo apt install gcc-9 g-…...
Ubuntu22.04安装中文输入法►由踩坑到上岸版◄
Ubuntu22.04安装中文输入法►由踩坑到上岸版◄ 了解入坑上岸 更新一发:Gedit中文乱码问题的解决 为了方便回忆和记录甚至后面继续重装系统,我还是写一下以便将来用到或参考~ 了解 安装Ubuntu22.04(截至2023年08月26日11ÿ…...
SpringBoot简单上手
spring boot 是spring快速开发脚手架,通过约定大于配置,优化了混乱的依赖管理,和复杂的配置,让我们用java-jar方式,运行启动java web项目 入门案例 创建工程 先创建一个空的工程 创建一个名为demo_project的项目,并且…...
git及GitHub的使用
文章目录 git在本地仓库的使用github使用创建仓库https协议连接(不推荐,现在用起来比较麻烦)ssh连接(推荐)git分支操作冲突处理忽略文件 git在本地仓库的使用 1.在目标目录下右键打开git bash here 2.创建用户名和邮箱(注: 下载完…...
【考研数学】线性代数第四章 —— 线性方程组(1,基本概念 | 基本定理 | 解的结构)
文章目录 引言一、线性方程组的基本概念与表达形式二、线性方程组解的基本定理三、线性方程组解的结构写在最后 引言 继向量的学习后,一鼓作气,把线性方程组也解决了去。O.O 一、线性方程组的基本概念与表达形式 方程组 称为 n n n 元齐次线性方程组…...
使用Python写入数据到Excel:实战指南
在数据科学领域,Excel是一种广泛使用的电子表格工具,可以方便地进行数据管理和分析。然而,当数据规模较大或需要自动化处理时,手动操作Excel可能会变得繁琐。此时,使用Python编写程序将数据写入Excel文件是一个高效且便…...
接口测试总结分享(http与rpc)
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。 一、了解一下HTTP与RPC 1. HTTP(H…...
数据结构(Java实现)LinkedList与链表(下)
** ** 结论 让一个指针从链表起始位置开始遍历链表,同时让一个指针从判环时相遇点的位置开始绕环运行,两个指针都是每次均走一步,最终肯定会在入口点的位置相遇。 LinkedList的模拟实现 单个节点的实现 尾插 运行结果如下: 也…...
linux查看正在运行的nginx在哪个文件夹当中
1、查出Nginx进程PID ps -ef|grep nginx2、查看Nginx进程启动时的工作目录 ls -la /proc/<PID>/cwd将<PID>替换为第一步中列出的Nginx进程的PID。该命令会显示Nginx进程在启动时所在的工作目录(当前工作目录)...
Vue实现Excel表格中按钮增加小数位数,减少小数位数功能,多用于处理金融数据
效果图 <template><div><el-button click"increaseDecimals">A按钮</el-button><el-button click"roundNumber">B按钮</el-button><el-table :data"tableData" border><el-table-column v-for&q…...
自然语言处理(一):词嵌入
词嵌入 词嵌入(Word Embedding)是自然语言处理(NLP)中的一种技术,用于将文本中的单词映射到一个低维向量空间中。它是将文本中的单词表示为实数值向量的一种方式。 在传统的文本处理中,通常使用独热编码&…...
【HSPCIE仿真】HSPICE仿真基础
HSPICE概述 1. HSPICE简介3. 标准输入文件4. 标准输出文件3. HSPCIE仿真过程 1. HSPICE简介 SPICE (Simulation Program with IC Emphasis)是1972 年美国加利福尼亚大学柏克莱分校电机工程和计算机科学系开发 的用于集成电路性能分析的电路模拟程序。 …...
二、前端监控之方案调研
前端监控体系 一个完整的前端监控体系包括了日志采集、日志上报、日志存储、日志切分&计算、数据分析、告警等流程。 对于一名前端开发工程师来说,也就意味着工作不再局限于前端业务的开发工作,需要有Nginx服务运维能力、实时/离线分析能力、Node应…...
深圳包装设计公司有哪些呢/搜狗seo刷排名软件
1.往excel表中写中文: 加u 或者unicode("阿萨德","utf-8") 2.代码前一般加# -*- coding:utf-8 -*- 3.从web上获取的字符中特殊符号如果转码错误可以加忽略方法。如网站首页下方的© 4.往excel中写入数据时,最好重新初始化 5.从表中取出…...
wordpress外链缩略图/自有品牌如何推广
在linux下有两种访问ftp服务器的方式,一种是图形化界面操作,另一种方式就是用命令行的方式。 Ubuntu图形化界面访问ftp服务器 1、打开文件管理器,点击“其他位置” image.png2、在 连接服务器上 输入对应的ftp地址 image.png点击问号…...
陕西江川建设有限公司公司网站/友链交换不限内容
目录(?)[-] 一分离颜色通道 1split函数详解2merge函数详解 二多通道图像混合示例程序 本系列文章由浅墨_毛星云 出品,转载请注明出处。 文章链接: http://blog.csdn.net/poem_qianmo/article/details/21176257 作者:毛星云(浅墨…...
简单网上书店网站建设php/计算机培训机构哪个最好
Tomcat的配置 1.配置环境变量 新建名为:CATALINA_HOME的系统变量,值为我们安装tomcat的目录 2端口号及编码的配置: 找到tomcat安装目录下的sonf下的server文件,将 <Connector port"8080" protocol"HTTP/1.1" connectionTimeout"20000" redi…...
免费php网站系统/外贸网站建设推广
class People:def __init__(self, name, age):self.name nameself.age ageself._protect_var 10 # 受保护的成员,使用一个下划线_,它仅仅是提示成员受保护,但可以被更改self.__private_var 10 # 使用双下划线__可以定义私有属性def sayhi(self):p…...
上海做网站的价格/郑州seo优化推广
创建矩阵的操作 x torch.empty(5, 3) print(x) 输出结果: tensor([[2.4835e27, 2.5428e30, 1.0877e-19],[1.5163e23, 2.2012e12, 3.7899e22],[5.2480e05, 1.0175e31, 9.7056e24],[1.6283e32, 3.7913e22, 3.9653e28],[1.0876e-19, 6.2027e26, 2.3685e21]])创建一个有初始化的矩…...