总结Scroller ScrollTo ScrollBy

Android View的scrollTo()、scrollBy() 和Scroller类总结 一、View的scrollTo()、scrollBy() 1.scrollTo、scrollBy方法是View中的,因此任何的View都可以通过这两种方法进行移动。首先要明白的是,scrollTo、scrollBy滑动的是View中的内容(而且还是整体滑动),而不是View本身。我们的滑动控件如SrollView可以限定宽、高大小,以及在布局中的位置,但是滑动控件中的内容(或者里面的childView)可以是无限长、宽的,我们调用View的scrollTo、scrollBy方法,相当于是移动滑动控件中的画布 阅读详情

这两天看了两篇文章

http://blog.youkuaiyun.com/vipzjyno1/article/details/24577023讲ScrollTo和ScrollBy的用法,

http://blog.youkuaiyun.com/gemmem/article/details/7321910讲Scroller类的用法

自己总结一下,ScrollTo是移动到哪,ScrollBy是移动了多少距离,

如果传入的x和y(这里的x和y都是px,可以用dp2px转下)是一样的话,ScrollTo重复调用只能移动一次到,而ScrollBy重复调用能移动很多次,这跟这两个方法的android源码实现有关,具体看上面网址。

而ScrollTo移动的其实不是这个View移动,而是这个View里面的内容移动,甚至乎这个View可以不是ViewGroup的子类,可以是一个Button,这里是很奇怪的现象,我代码测试了下Button里面的字移动了,而这个button没移动

测试代码就是用的上面Scroller网址的代码修改了下:

public class MainActivity extends Activity {
	private static final String TAG = "TestScrollerActivity";
	LinearLayout lay1, lay2, lay0;
	private Scroller mScroller;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mScroller = new Scroller(this);
		lay1 = new MyLinearLayout(this);
		lay2 = new MyLinearLayout(this);

		lay1.setBackgroundColor(this.getResources().getColor(
				android.R.color.darker_gray));
		lay2.setBackgroundColor(this.getResources().getColor(
				android.R.color.white));
		lay0 = new ContentLinearLayout(this);
		lay0.setOrientation(LinearLayout.VERTICAL);
		LinearLayout.LayoutParams p0 = new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.FILL_PARENT,
				LinearLayout.LayoutParams.FILL_PARENT);
		this.setContentView(lay0, p0);

		LinearLayout.LayoutParams p1 = new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.FILL_PARENT,
				LinearLayout.LayoutParams.FILL_PARENT);
		p1.weight = 1;
		lay0.addView(lay1, p1);
		LinearLayout.LayoutParams p2 = new LinearLayout.LayoutParams(
				LinearLayout.LayoutParams.FILL_PARENT,
				LinearLayout.LayoutParams.FILL_PARENT);
		p2.weight = 1;
		lay0.addView(lay2, p2);
		MyButton btn1 = new MyButton(this);
		MyButton btn2 = new MyButton(this);
		btn1.setText("btn in layout1");
		btn2.setText("btn in layout2");
		btn1.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				mScroller.startScroll(0, 0, -DensityUtil.dp2px(MainActivity.this, 30), -DensityUtil.dp2px(MainActivity.this, 30), 50);
				lay1.invalidate();
			}
		});
		btn2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				mScroller.startScroll(0, 0, -DensityUtil.dp2px(MainActivity.this, 100), -DensityUtil.dp2px(MainActivity.this, 100), 50);
				lay2.invalidate();
			}
		});
		lay1.addView(btn1);
		lay2.addView(btn2);
	}

	class MyButton extends Button {
		public MyButton(Context ctx) {
			super(ctx);
		}

		@Override
		protected void onDraw(Canvas canvas) {
			super.onDraw(canvas);
			Log.d("MyButton", this.toString() + " onDraw------");
		}
	}

	class MyLinearLayout extends LinearLayout {
		public MyLinearLayout(Context ctx) {
			super(ctx);
		}

		@Override
		/**
		 * 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() {
			Log.d(TAG, this.toString() + " computeScroll-----------");
			if (mScroller.computeScrollOffset())// 如果mScroller没有调用startScroll,这里将会返回false。
			{
				// 因为调用computeScroll函数的是MyLinearLayout实例,
				// 所以调用scrollTo移动的将是该实例的孩子,也就是MyButton实例
				getChildAt(0).scrollTo(mScroller.getCurrX(), 0);
				Log.d(TAG, "getCurrX = " + mScroller.getCurrX());

				// 继续让系统重绘
				getChildAt(0).invalidate();
			}
		}
	}

	class ContentLinearLayout extends LinearLayout {
		public ContentLinearLayout(Context ctx) {
			super(ctx);
		}

		@Override
		protected void dispatchDraw(Canvas canvas) {
			Log.d("ContentLinearLayout", "contentview dispatchDraw");
			super.dispatchDraw(canvas);
		}
	}
}

首先每个按钮点击的时候都是按钮的父View手动调用invalidate,父View的invalidate会导致父View重新draw一遍,这时就会调用父类重写的computeScroll方法,这个时候我们之前设置的Scroller值就去计算有没有scroll完成computeScrollOffset(),我在判断里面使用getChildAt(0).scrollTo(mScroller.getCurrX(), 0);getChildAt(0).invalidate();(其实这里第二句可以不需要,因为scrollTo就会重画),我们这里 getChildAt(0)可以肯定的是得到的是这个自定义layout里的Button对象,但是这个Button.scrollTo(mScroller.getCurrX(), 0)移动的竟然是Button里面的字,这个Button还在原地啊,是的没错,所以说ScrollTo移动的是View里面内容的位置,不管这个View是ViewGroup类的子类,还是android.weidget下面的Button,ImageView,TextView等,其实移动的都是这个View里面的内容的位置,ScrollTo并没有真正移动这个View,而只是把这个View显示在界面上的区域给扩大了,如果这个View是wrap或者固定的宽高,如果ScrollTo超过了这个View的区域,然后我给这个View提前设置了onclick事件,发现即使这个View的内容不见了(因为被ScrollTo到超出view的范围去了),但是onclick事件还能触发,也就是说这个View的左上角位置没变,但是这个View里面的内容被移动到了原先区域的外面去了。

突然想起还个没解释,就是为什么自定义的RelativeLayout里面的Button移动了,这个Button点击响应,而不是点击Button移动前的位置区域响应呢,答案很简单,还是ScrollTo改变的是view的内容位置,而并不是这个View。如何解释呢,就是这里这个自定义的RelativeLayout就是这个View,然后改变了内容就是Button,所以Button响应点击事件,而不是Button移动前的区域响应,

而像Button,ImageView这些View执行ScrollTo之后只是为了移动这个Button和ImageView,而把原本用来显示Button和ImageView的区域给扩大了,导致Button和ImageView里的内容移动,而不是这个区域移动,button的区域就是默认的android按钮背景,Imageview如果也设了背景的话也是,只是这个src图移动,背景不动,TextView也是这样。

哦了~~~这样就能解释我今天遇到的迷惑了,文字描述的不够好,见谅,代码贴太麻烦了。

zscroller:基于zynga滚动条的dom滚动条 zscroller 基于dom 例子 在线示例:http: 安装 原料药 打字 interface ViewportSize { width: number ; height: number ; } interface ContentSize { width: number ; height: number ; } interface X { // scrollbar x size width: number ; height ?: number ; scrollbar ?: { style : any ; } ; indicator ?: { style : any ; } ; } interface Y { width ?: number ; 立即下载

相关推荐

Unity无限滑动列表插件EnhancedScroller v2

Unity 无限滑动列表插件,Item循环使用,优化滑动列表。 EnhancedScroller v2

antd picker 使用 如何_React实现滑动选择插件(仿Antd-mobile Picker)

效果图需求由于移动端iOS和安卓原生select样式和效果不同,同一个控件在不同系统上效果不同。所以决定制作一个跟iOS风格类似的,可以滚动,选择器插件。之后看到了antd-mobile里面的picker插件符合我们的要求,使用了一段时间感觉其效果不错,隧查看源码,探究其制作过程。但是antd-mobile是Typescript编写的,跟React类似,但是又不太一样。所以基本是关键问题查看其做参...

weixin_39946274的博客 1638

zencart jscroller_sidebox商品上下滚动插件

有了这款插件 你的产品显示将变得动态许多 在狭小的区域最大程度的展示足够多的产品 多家收藏 有意者拿去用

zscroll 使用指南

zscroll 使用指南 项目介绍 zscroll 是一个为面板或终端设计的文本滚动器。它源于对简单脚本的需求,但具备更丰富的功能,如滚动速度控制、文本右侧填充选项、处理全角字符的智能机制,以及作为参数传递或通过管道输入文本的能力。该项目由 skmatz 创建,旨在提供一种更加实用且功能全面的文本滚动解决方案,支持自定义滚动前后静态文本、滚动延迟调整等特性。取名“zscroll”,开发者幽默地表示...

gitblog_00472的博客 416

jscroller-0.4.js

实现页面信息,上下,左右内容滚动。循环信息

信号的自相关和互相关

自相关是描述信号与自身在不同时间延迟下的相似度,常用于信号的周期性分析和谱估计。互相关是描述两个信号之间在不同时间延迟下的相似度,常用于信号匹配、时延估计和信号检测。通过自相关和互相关,可以理解信号的特性、信号之间的关系,并用于许多信号处理任务,如检测、定位和谱分析。

weixin_44012667的博客 5406

vue-virtual-scroller的使用,展示巨量数据,长列表优化,虚拟列表

​二、vue-virtual-scroller的使用,长列表优化,虚拟列表,纵想丝滑 对于长列表数据有 10万 多条来说,我们大部分的操作都是: 1.懒加载,分页, 2.Object.freeze 冻结数组取消响应式,因为大多时候都是展示 3.高清图替换成缩略图,因为很多时候长列表的图尺寸都比较小,所以可以用小图来代替 但是,还有两个问题未解决,那就是: 1.不能分页的时候怎么办 2.当用户向下滑动加载了很多很多的内容时,可能是1000个10000 无缝滚动 vue-seamless-scroll 滚动表格

muzidigbig的博客 3万+

微磁模拟实战指南:从OOMMF安装到首个3D模型运行

本文详细介绍了OOMMF微磁模拟软件的安装与使用,从环境配置到首个3D模型运行的完整教程。涵盖Windows、Linux和macOS平台的安装避坑指南,以及MIF文件编写、并行计算优化等实战技巧,帮助研究人员快速掌握这一开源工具在磁畴壁运动、磁滞回线等微磁学问题中的应用。

weixin_29294597的博客 154

OpenHarmony实战开发-Grid高性能开发指导。

在构建大型、复杂应用时,性能优化至关重要。Grid布局作为一种高效布局方式,可以提高页面的均分能力、子组件占比控制能力及自适应布局能力。本文将介绍Grid在高性能开发方面的应用,包括懒加载、cachedCount、组件复用和使用GridLayoutOptions设置GridItem大小等方法,帮助开发者优化Grid布局性能,减少加载和渲染时间,提升用户体验。

2401_82546228的博客 1489

解决anaconda占用C盘空间过多问题

anaconda就算安装在其他盘,默认会把索引、锁定文件、压缩包等都放到系统盘(C盘),我用了两年,占用30GB。 1. 卸载不用的虚拟环境 查看已安装的虚拟环境 conda env list 卸载不用的、过期的虚拟环境 conda remove -n (要卸载的环境的名字) --all 2. 删除索引缓存、锁定文件、未使用过的包和tar包 conda clean -a 清理完之后,删除了15GB,还剩15GB,舒服了 ...

沉迷单车的追风少年 3万+

ubuntu20 安装px4、mavros、QGroundControl

首先安装一下ant,否则没法运行,同时因20.04的缺少动态库libawt_xawt.so无法被Java8给调用,我的解决办法是去18.04把18.04的相同路径下的动态库libawt_xawt.so移动到20.04的/usr/lib/jvm/java-11-openjdk-amd64/lib/路径中。用rosdepc的时候,你得确保你用的是鱼香ROS的提供的ROS安装方法,否则是没有rosdepc的。make px4_sitl gazebo之前,可以安装一下gazebo的 模型。二、安装MAVROS。

qq_58060770的博客 3349

关于Scroller ,scrollTo,scrollBy

最近想总结一下,关于View滑动的知识,也为下一篇View的滑动总结记录一下这个知识点点吧。提到这个,先说说Android的坐标系吧。 Android中的坐标系 Android中有2种坐标系,分别称之为Android坐标系和视图坐标系。而对应的也有一些相关的方法可以获取坐标系中的坐标值,只有搞清楚这些区别,才能在使用的时候,不至于出错或者得不到你想要的效果。 1.Andro...

做一个苦行僧的专栏 1121

在 TASKPROCESSING 上为 ABAP OData 服务添加多个系统别名:从原理到落地的完整实践

本文面向SAP Gateway与ABAP开发者,详细讲解如何在TASKPROCESSING OData服务上添加系统别名。首先介绍了系统别名的概念与设计初衷,阐述了添加别名的业务场景需求,包括多系统接入、用户分流和灰度发布等。随后提供了标准配置步骤,从SPRO路径到具体操作说明,并分享了三个实际案例说明如何实现跨区域统一待办、按用户角色分流和灰度发布。最后给出了验证方法和常见问题解决方案,帮助开发者掌握这项基础但关键的配置技能,实现服务路由的可控管理。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 138

Android Scroller入门(一)之ScrollTo、ScrollBy

Scroller可以实现对视图View、ViewGroup的滚动

wuchuang 1340

手把手教你学Simulink实例--使用 Simulink 进行电力电子系统的小信号模型仿真

电力电子系统(Power Electronics System)包括各种功率转换器(如 DC-DC 转换器、逆变器等)。这些设备中的关键组件(如 MOSFET、IGBT、电容器、电感器等)不仅影响系统的性能,还直接关系到系统的稳定性、效率和可靠性。因此,在设计阶段进行详细的建模和仿真至关重要。小信号模型仿真的目的是通过线性化非线性系统来评估其动态特性,包括增益、相位裕度、带宽等指标。通过本教程,我们介绍了如何使用 Simulink 进行电力电子系统的小信号模型仿真。背景介绍。

MHD0815的博客 298

PyTorch 面试题及参考答案(精选100道)

模块是 PyTorch 中用于自动求导的核心模块。它为张量上的所有操作提供了自动求导的功能。在深度学习中,反向传播是一种用于计算损失函数相对于模型参数的梯度的算法。通过梯度,我们可以使用优化算法(如随机梯度下降)来更新模型的参数,从而最小化损失函数。模块的主要作用就是自动计算这些梯度。当我们创建一个张量时,如果将其属性设置为True,那么 PyTorch 会跟踪该张量上的所有操作。在完成前向传播计算出损失函数后,调用方法,模块会自动根据链式法则反向传播计算出所有需要求导的张量的梯度。

大模型大数据攻城狮的专栏 1681

android View 的拖动中Scroller、startScroll、scrollTo、scrollBy的使用

android View 的移动Scroller、startScroll、scrollTo、scrollBy。@TOC Scroller Scroller mScroller = new Scroller(context, new DecelerateInterpolator()); 获取view的滚动工具类。 startScroll mScroller.startScroll(x1, y1, x...

qq_32551953的博客 804

6-Halcon-- var_threshold 函数功能(用于基于局部统计特性的动态阈值分割的算子)

var_threshold 是 HALCON 中用于基于局部统计特性的动态阈值分割的算子,特别适用于处理低对比度图像或纹理均匀但包含细微差异的场景。与 dyn_threshold 不同,它不依赖预处理生成的参考图像,而是直接在局部区域内计算灰度值的统计特性(均值和标准差),从而自适应调整阈值。

weixin_45590420的博客 1329

Android Scroller、scrollBy和scrollTo

先说坐标系 视图坐标 Android view的视图是没有边界的,也就是说canvas是没有边界的,可以无限绘制, 那么这种无边界的坐标被成为视图坐标。(绝对坐标,坐标原点为屏幕左上角) 布局坐标 也交相对坐标,在View Layout时以当前view的左上角为坐标原点 这里盗一张图 scrollBy和scrollTo 至于两者的区别,网上很多详细说明,就是scrollBy是滚动的一段距离(...

weixin_43236827的博客 419

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

使用scrollTo、scrollBy、Scroller实现滚动动画

在上一节讲解了layout、offset、的使用,本节说明scrollTo、scrollBy、Scroller。

步行者 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android scrollTo,scrollBy,以及Scroller的用法示例

一直对于这几个概念没有仔细区分过,现在找个时间来分析一下这个几个东西 android的View的gundong

学海有涯 2927

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

scrollTo、scrollBy、getScrollX、getScrollY这4个方法的含义,Scroller的简单用法

scrollTo、scrollBy都是对于x轴负值向右移动、正值向左移动;对于y轴负值向上移动、正值向下移动 scrollTo意思是移动到莫个点,如scrollTo(20,0)意思是将View移动到(-20,0)的点位置 scrollBy意思是沿着x、y轴方向移动数值距离,如scrollBy(20,0)意思是沿着x、y轴方向分别移动-20,0个单位; getScrollX、getScroll

lihonghao1017的专栏 2034

Android中scrollTo _ scrollBy _ Scroller 的使用

作者:阿钟程序猿博客:http://blog.youkuaiyun.com/a_zhon声明:本文由作者授权发布,未经原作者允许请勿转载Android Scroller完全解析,关于Scroller你所需知道的一切:http://blog.youkuaiyun.com/guolin_blog/article/details/48719871本文基于郭神给出的教程(原文地址如上),在结合自己的编码总结这个几个东西的使用。先

刘桂林 440

Android scrollTo() scrollBy() Scroller解说及应用

版本号:1.0日期:2014.6.17 2014.6.18版权:© 2014 kince 转载注明出处scrollTo() 、scrollBy()及 Scroller在视图滑动中常常使用到。比方最常见的Launcher就是用这种方式实现。为了更加明了的理解。还是去看一下源代码。在View类中。scrollTo的代码例如以下: /** * Set the scrol...

diandingyin9417的博客 216

View 的滑动实现之二(ScrollTo,ScrollBy和Scroller)

在本篇文章的前面,我们讲到了使用Layout的方法实现View的滑动今天给大家介绍一下使用ScrollTo,ScrollBy和Scroller来实现View的滑动。 一、ScrollTo,ScrollBy 在View中,系统专门提供了scrollTo和scrollBy两种方式来改变View的位置,于是我们就可以通过这两个方法实现View的滑动。 我们先来看一下这两个方法的实现:

gongzhiyao37390814的博客 1329

自定义 View 之熟记 scrollTo、scrollBy、Scroller 三者区别

博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载。本文由博主威威喵原创,请多支持与指教。 本文首发于此 博主:威威喵|博客主页:https://blog.youkuaiyun.com/smile_running 介绍 今天,我们来讲讲自定义View的基本功,那就是对我们屏幕坐标系的理解。本人画了一张图,咋们凑合看吧,应该不难看懂。 这里做略微的说明,黑色(ViewGroup、父容器)、蓝色(包含的子View)、橙色为手指触摸屏幕的一点。为什么要清楚这张图呢...

wusj的博客 767
上一篇: Zine,这个移动端写作工具简单易用,或许能拯救碎片化思考
下一篇: 熟人之间的匿名社交还有什么玩法?“偷偷”加入@提醒和阅后即焚私信功能,让定向信息流动更顺畅
fancylovejava
博客等级 码龄16年 1052粉丝 184原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值