关闭

View的scrollTo和scrollBy

106人阅读 评论(0) 收藏 举报

参考http://xroocky.github.io/2016/05/30/ScrollTo%E5%92%8CScrollBy/

注意:

  • 这两个方法移动的并不是View本身。
  • 如果该View没有子View,那么移动的就是View的内容(比如说调用一个Button的相应方法,会发现Button本身并不会移动,移动 的是Button的文本内容)。
  • 如果该View中有子View,那么移动的就是子View(比如说一个FrameLayout中有一个Button,调用FrameLayout的相应方法,会发现Button移动而FrameLayout不移动)
  • scrollTo(int, int)
    让View的content滚动到相对View初始位置的(x, y)处,可以看到这里:mScrollX和mScrollY是保存这个view相对于起点坐标的偏移量,如果这次传进来的值和上一次滑动到的位置已经一致,则不做任何处理,如果不一样则进行滑动

    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();
            }
        }
    }

    方法名带有to,给人的感觉就是移动到坐标为(x, y)的地方,其实实践的结果并不是这样,而是移动到偏移位置为(x, y)的地方。那么问题就来了,这个偏移是相对哪里偏移呢?实践结果是相对初始位置的偏移。
    举个例子,如果在当前布局中存在一个Button,那么此时的初始位置为(0, 0),mScrollX和mScrollY均为0。如果调用button.scrollTo(5, 5)的话,那么移动后的位置就是“初始位置”减去“偏移位置”即:(x, y) = (0, 0) - (5, 5) = (-5, -5),所以button中的文字会向左向上分别移动5个像素。此时的mScrollX和mScrollY均为5,因为在源码中可以看到mScrollX和mScrollY被赋值。如果再次调用button.scrollTo(5, 5),可以看到源码会先进行判断,当然自然是无法再次进入if代码段。

  • scrollBy(int, int)
    让View的content滚动到相对于View当前位置的(x, y)处,这个方法实际是调用了上面的scrollTo方法,并且滑动的位置是上一次滑动到的位置加上传入的偏移值,所以传入的值如果不同时为0,则肯定会触发滑动

    public void scrollBy(int x, int y) {
        scrollTo(mScrollX + x, mScrollY + y);
    }

    方法名带有by,给人的感觉就是在当前位置的基础上移动(x, y),这次没问题,就是这样移动的。这里的偏移位置(x, y)就是相对于当前位置的偏移位置。
    还拿上个例子来说,已经调用过一次button.scrollTo(5, 5)后再次调用会发现不会再移动,因为无法再次进入if语句。如果此时调用button.scrollBy(5, 5)呢?可以看到源码中分别给当前的mScrollX和mScrollY加了x和y,那么此时传入scrollTo方法的参数就是(10, 10),相当于直接调用了button.scrollTo(10, 10),在if语句判断时就可以成功进入if语句。

  • 总结
    scrollTo()和scrollBy()的参数均为偏移位置,不同之处在于scrollTo()的偏移位置是相对于初始位置的偏移位置,而scrollBy()的偏移位置是相对于当前位置的偏移位置。

0
0
查看评论

android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明

涉及到滑动,就涉及到VIEW,大家都知道,android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类,ViewGroup作为各个组件的容器搭建了整体的UI。以下是android UI的结构示示意图:...
  • vipzjyno1
  • vipzjyno1
  • 2014-04-27 16:23
  • 49726

【移动开发】View的scrollTo()和scrollBy()区别

首先,需要知道的是,View是可以延伸到屏幕之外的,可以想象一下ListVIew或GridView。也就是说View的尺寸可以超过屏幕的尺寸。View的大小就是onDraw()中Canvas画布的大小。Canvas可以做translate()、clipRec()t等变换,可以说Canvas是无边界的...
  • manoel
  • manoel
  • 2014-09-12 13:27
  • 14591

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

在本篇文章的前面,我们讲到了使用Layout的方法实现View的滑动今天给大家介绍一下使用ScrollTo,ScrollBy和Scroller来实现View的滑动。 一、ScrollTo,ScrollBy 在View中,系统专门提供了scrollTo和scrollBy两种方式来改变Vie...
  • gongzhiyao3739124
  • gongzhiyao3739124
  • 2016-10-12 21:18
  • 400

Android View(二)-View的scrollTo()以及scrollBy()说明

在实际开发中,我们总是会遇到需要View滑动的功能,那么可能就会用View的scrollTo(int x, int y)或者scrollBy(int x, int y)方法,但是当你使用这个方法之后,你会发现完全和你想的不是一回事!那么今天,我们就来了解一下,传说中的View的scrollTo(in...
  • zxw136511485
  • zxw136511485
  • 2015-12-24 15:32
  • 2375

View滑动的原理,解析scrollTo,ScrollBy和Scroller

滑动的概念,很不好理解,想通过这一篇博文,让自己和不明白的人加深下理解,希望我的语言能够使你明白:首先我们要理解,为什么使用滑动? 因为手机屏幕,给我们的视图就那么大,我们看到的视图有限,要想在固定的视图,去展示更多的东西,我们就需要去滑动,把隐藏的那部分变为可视视图。我们可以把能展示的大小看成一...
  • zxyudia
  • zxyudia
  • 2016-05-25 17:53
  • 802

JavaScript scrollTo() JavaScript scrollBy() jQuery CSS 操作 - scrollTop() 方法jQuery CSS 操作 - scroll

JavaScript scrollTo() 函数  JavaScript scrollBy() 函数 to是绝对的意思(从整体而言),by是相对的意思(从原先的位置而言) scrollTo函数语法      scrollTo(x,y); ...
  • xxz_best
  • xxz_best
  • 2014-09-24 09:46
  • 845

scrollTo 和 scrollBy 方法使用说明

一、滚动的是什么? scrollgoback.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { text.scrollBy(2, -10); // text.scr...
  • L25000
  • L25000
  • 2015-06-03 12:43
  • 1833

Android自定义控件热身之scrollTo和scrollBy详解

转载请注明出处:http://blog.csdn.net/xiaohao0724/article/details/54984850 View通过ScrollTo和ScrollBy 方法可以实现滑动。那么两者有什么区别呢?我们先来看一下源码 ScrollTo源码: ...
  • xiaohao0724
  • xiaohao0724
  • 2017-02-11 16:36
  • 288

Android中View的scrollTo()和scrollBy()区别

转自:http://blog.csdn.net/manoel/article/details/39228593 首先,需要知道的是,View是可以延伸到屏幕之外的,可以想象一下ListVIew或GridView。也就是说View的尺寸可以超过屏幕的尺寸。View的大小就是onDraw()中...
  • jdsjlzx
  • jdsjlzx
  • 2016-01-05 14:40
  • 3262

ListView滑动删除实现之二——scrollTo、scrollBy详解

前言:一个项目终于要结束了,最最坑的莫过于少估了一个巨复杂的页面的开发时间,队长,你这是要多坑队友才行啊……本来定的一个月要看的内容,看来是高估自己能力了,拖拉严重啊,以后要早起了,把早上的时间也利用起来,一天睡九个小时着时有点多……可趴在床上就想睡这可怎么破……上篇给大家讲了有关merge标签和L...
  • harvic880925
  • harvic880925
  • 2015-04-21 22:01
  • 5745
    个人资料
    • 访问:9671次
    • 积分:438
    • 等级:
    • 排名:千里之外
    • 原创:36篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论