笔记6 | 从源码理解分析mScrollX和mScrollY,scrollTo()和scrollBy(),smoothScrollTo和smoothScrollBy

本文通过源码分析,详细解读了mScrollX和mScrollY的含义,scrollTo和scrollBy的区别,以及smoothScrollTo和smoothScrollBy的实现原理。同时探讨了View和ViewGroup在Android UI布局中的角色和关系。

前言

我想开头先说说

a.度娘一下什么都知道了,整理这些东西有什么用?还费时费力的!如何才能完全掌握一个知识?当你能把它讲清楚的时候,你才算掌握了他。

想完全把mScrollX和mScrollY,scrollTo()和scrollBy(),smoothScrollTo和smoothScrollBy弄明白并不容易,但查阅他们的源代码基本就能明白个大概,这篇文章就是从源码分析他们究竟有什么作用和区别,读懂了基本就会用!


公众号


目录

  • mScrollX和mScrollY
  • scrollTo()和scrollBy()
  • smoothScrollBy和smoothScrollTo
  • view和viewgroup

一.mScrollX和mScrollY

 
 
  1. /**
  2. * The offset, in pixels, by which the content of this view is scrolled
  3. * horizontally.
  4. * {@hide}
  5. */
  6. @ViewDebug.ExportedProperty(category = "scrolling")
  7. protected int mScrollX;
  8. /**
  9. * The offset, in pixels, by which the content of this view is scrolled
  10. * vertically.
  11. * {@hide}
  12. */
  13. @ViewDebug.ExportedProperty(category = "scrolling")
  14. protected int mScrollY;
  15. /**
  16. * Return the scrolled left position of this view. This is the left edge of
  17. * the displayed part of your view. You do not need to draw any pixels
  18. * farther left, since those are outside of the frame of your view on
  19. * screen.
  20. *
  21. * @return The left edge of the displayed part of your view, in pixels.
  22. */
  23. public final int getScrollX() {
  24. return mScrollX;
### `scrollBy` `scrollTo` 的区别 在 Android 中,`scrollBy(int x, int y)` `scrollTo(int x, int y)` 是用于实现视图内容滚动的核心方法。二者的主要区别在于它们对视图内容偏移量的处理方式不同。 - `scrollTo(int x, int y)` 直接设置当前视图的内容偏移量。具体而言,该方法会将视图内容移动到指定的绝对位置,其中 `x` 表示水平方向上的偏移,`y` 表示垂直方向上的偏移。这意味着如果当前视图已经发生了滚动,再次调用 `scrollTo` 会直接跳转到新的位置,而不是基于当前状态进行增量调整[^1]。 - `scrollBy(int x, int y)` 则是基于当前的偏移量进行增量调整。它会在现有滚动位置的基础上加上传入的 `x` `y` 值,从而实现连续滚动的效果。例如,如果当前的 `mScrollX` 是 50,调用 `scrollBy(-10, 0)` 后,`mScrollX` 将变为 40,表示视图内容向右移动了 10 像素[^1]。 这两个方法都直接影响 `View` 内部的 `mScrollX` `mScrollY` 变量,这些变量分别表示视图左边缘其内容左边缘之间的水平距离视图上边缘其内容上边缘之间的垂直距离。通过调整这些值,可以控制视图内容相对于其可视区域的位置。 ### 示例代码 以下是一个简单的示例,展示如何使用 `scrollTo` `scrollBy` 实现视图内容的滚动: ```java public class ScrollableView extends View { private Scroller mScroller; public ScrollableView(Context context) { this(context, null); } public ScrollableView(Context context, AttributeSet attrs) { super(context, attrs); mScroller = new Scroller(context); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); awakenScrollBars(); } @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate(); } super.computeScroll(); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (!mScroller.isFinished()) { mScroller.abortAnimation(); } break; case MotionEvent.ACTION_MOVE: int deltaX = (int) (event.getX() - getWidth() / 2); scrollBy(-deltaX, 0); break; case MotionEvent.ACTION_UP: mScroller.startScroll(getScrollX(), getScrollY(), -getScrollX(), 0, 500); postInvalidate(); break; } return true; } } ``` 在上述代码中,`scrollBy` 被用来根据用户的滑动手势动态调整视图内容的位置,而 `scrollTo` 在 `computeScroll()` 方法中被用来实现平滑滚动效果。 ### 滚动行为的实际应用 在实际开发中,`scrollTo` `scrollBy` 经常 `Scroller` 或 `OverScroller` 结合使用,以实现更复杂的滚动动画。例如,在自定义 `ViewGroup` 或 `RecyclerView` 的布局管理器中,可以通过 `Scroller` 控制滚动的持续时间速度,同时结合 `scrollTo` 或 `scrollBy` 来更新视图的滚动状态。 此外,当视图内容发生缩放时(如地图或图像编辑器),`scrollBy` 还可用于调整视图的滚动偏移,以保持缩放中心点不变。例如,在缩放操作中,可以通过计算缩放前后的差值并调用 `scrollBy` 来实现视觉上的居中效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值