返回介绍

2. 使用方法

发布于 2024-12-23 22:21:11 字数 4025 浏览 0 评论 0 收藏 0

在看 Scroller 的使用方法之前我们需要先了解一下 View 中的 scrollBy()scrollTo() 方法, 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 方法
      onScrollChanged(mScrollX, mScrollY, oldX, oldY);
      if (!awakenScrollBars()) {
        postInvalidateOnAnimation();
      }
    }
  }

scrollTo() 是指将前视图内容横向偏移 x 距离,纵向偏移 y 距离。注意这里是 View 的内容的偏移,而不是 View 本身。而 scrollBy() 方法如下:

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

scrollBy() 方法里直接调用了 scrollTo() 方法,表示在当前偏移量的基础上继续偏移 (x,y) 。现在我们来看看 Scroller 的用法。 SkyScrollerDemo 是我写的一个 ScrollerOverScroller 的使用 demo 。下面的用法都是来自于这个 demo 里,大家可以 clone 下来配合本文一起阅读。本文我们主要研究 Scroller 。对于 OverScroller 我在 demo 里也写了相关的使用方法,在本文的最后我们再做讨论。

Scroller 一般需要配合重写 computeScroll() 一起使用,代码如下:

public class ScrollTextView extends TextView {
  private Context mContext;
  private Scroller mScroller;

  public ScrollTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    this.mContext = context;
    init();
  }

  private void init() {
    mScroller = new Scroller(mContext);
  }

  @Override
  public void computeScroll() {
    if (mScroller.computeScrollOffset()) {
      offsetLeftAndRight(mScroller.getCurrX() - mLeft);
      offsetTopAndBottom(mScroller.getCurrY() - mTop);
      invalidate();
    }
  }
  //以 mLeft,mTop 为初始点,在 DEFAULT_DURATION 的时间内,在 Y 轴上滑动-400 的偏移量
  public void startScrollerScroll() {
    mScroller.startScroll(mLeft, mTop, 0, -400, DEFAULT_DURATION);
    invalidate();
  }
  //以 mLeft,mTop 为初始点,并以 Y 方向上-5000 的加速度滑动,最小 Y 坐标为 200,最大 Y 坐标为 1200
  public void startScrollerFling() {
    mScroller.fling(mLeft, mTop, 0, -5000, mLeft, mLeft, 200, 1200);
    invalidate();
  }
}

在上面的代码里,当我们调用 startScrollerScroll()startScrollerFling() 方法时我们就发现 View 滑动了。如果以前没了解过 Scroller 的同学可能会不理解。这里大致分析一下调用流程,首先我们要知道 Scroller 其实只负责计算,它并不负责滑动 View ,当我们调用了 ScrollerstartScrollerScroll() 方法时,我们紧接着调用了 invalidate() 方法。 invalidate() 方法会使 View 重新绘制。因此会调用 Viewdraw() 方法,在 Viewdraw() 方法中又会去调用 computeScroll() 方法, computeScroll() 方法在 View 中是一个空实现,所以需要我们自己实现 computeScroll() 方法。在上面的 computeScroll() 方法中,我们调用了 mScroller.computeScrollOffset() 方法来计算当前滑动的偏移量。如果还在滑动过程中就会返回 true 。所以我们就能在 if 中通过 Scroller 拿到当前的滑动坐标从而做任何我们想做的处理。在 demo 里我们根据滑动的偏移量来改变了 View 的坐标偏移量。从而形成了滑动动画。下面我们解释一下 Scroller 的两个方法的具体作用:

1. startScroll(int startX, int startY, int dx, int dy, int duration)

通过起始点、偏移的距离和滑动的时间来开始滑动。

  • startX 起始滑动点的 X 坐标
  • startY 起始滑动点的 Y 坐标
  • dx 滑动的水平偏移量。>0 则表示往左滑动。
  • dy 滑动的垂直偏移量。>0 则表示往上滑动。
  • duration 滑动执行的时间

2. fling(int startX, int startY, int velocityX, int velocityY, int minX, int maxX, int minY, int maxY)

基于一个快速滑动手势下的滑动。滑动的距离与这个手势最初的加速度有关。

  • startX 起始滑动点的 X 坐标
  • startY 起始滑动点的 Y 坐标
  • velocityX X 方向上的加速度
  • velocityY Y 方向上的加速度
  • minX X 方向上滑动的最小值,不会滑动超过这个点
  • maxX X 方向上滑动的最大值,不会滑动超过这个点
  • minY Y 方向上滑动的最小值,不会滑动超过这个点
  • maxY Y 方向上滑动的最大值,不会滑动超过这个点

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文