View的滑动视图理解

本文同步自我是一只香脆的大鸡排

刚入坑的时候,对于View滑动一直是一知半解的状态。其中工作多次遇见要用到了滑动时,满足需求草草了事就收场了。没有去深究内部原理。

我们先来看一下基本使用和概念。

scrollTo(int x, int y)

滑动到某个点

scrollBy(int x, int y)

依照当前的坐标,偏移多少个单位

滑动都是相对而言的,android中的这两个方法是,父控件对于子控件起始坐标位置的一个描述点。将有父控件内部的mScrollX和mScrollY来记录。

mScrollX

横坐标位置(向右)

mScrollY

纵坐标位置(向下)

一般来说初始化这两个值都是零。在scrollTo方法和scrollBy被调用到的时候才会发生变化。

scrollBy最终还是利用了scrollTo来完成偏移。实现如下:

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

偏移和坐标

这里的偏移和坐标就是指上面两个方法中的x和y值。如果有尝试使用过这两个方法的开发者可能会有一个疑惑,就是为什么这两个值是负数与现实世界正好相反的。why??

下面我们解释一下这个问题。

比如下面这样:

我们需要把子控件沿x轴偏移160个单位,这样的话就会得到x:200,y:20。那么我们使用scrollBy(-160,0)方法来完成。疑惑也就在这里,按理来说我们使用偏移的值是从40~200。应该是增加160个单位,为什么要写成负的。

小伙伴可以试试传参数(160,0),得到的结果就是子控件向左跑飞了,就像下面这样。

image.png

你想说,窝巢。为什么会介样!!

Android不听话,它不乖。

不不不,大哥哥你听我说。其实是这样的。我们可以把父控件的整个窗体想象成摄影机。我们假设子控件是我们场景里的静态物体,他们是不可移动的。当我们需要在屏幕上需要把子控件从左边的位置显示到右边的位置时。实际情况是摄影师把手中的摄像机应该是往左挪动。

想一想,没有错吧。揍是这样的。

还记得吗?初中物理说到的相对运动学。Android中的滑动视图也是基于这些理论的。这么看来我们前面的问题,传入的是-160也就能理解了,它是说父控件可见范围向左偏移。

Padding&Margin

Padding&Margin会不会对绘制区域造成影响,比如影响到mScrollX和mScrollY的值?

不会。子控件可视的范围起始点是在父控件大小-父控件外边距-父控件内边距=的坐标这个点就是就是滑动坐标的起始值起点,他们都为0。

实验性学习技巧推荐

把手机上的开发者模式下打开以下两个功能

  • 1.显示触摸操作
  • 2.显示布局边界

新建一个项目,改变不同的滑动参数,然后运行起来看效果。八九不离十的分分钟学懂。感兴趣后再翻入进去看源码,不要停留在看博客和书籍的表面上。那样很快会忘记。

1
2
3
4
5
6
7
int scrollX = frameLayout.getScrollX();
int scrollY = frameLayout.getScrollY();
Log.d(SollActivity.class.getName(),String.format("x:%s,y:%s",scrollX,scrollY));
frameLayout.scrollBy(-20,0);
scrollX = frameLayout.getScrollX();
scrollY = frameLayout.getScrollY();
Log.d(SollActivity.class.getName(),String.format("x:%s,y:%s",scrollX,scrollY));
随缘打赏!