Android View 滑动实现的几种常用方式
前言
在 Android 开发中,流畅的交互体验至关重要。我们经常会遇到需要自定义可滑动组件的场景,例如实现侧滑菜单、图片浏览、或者复杂的列表交互。虽然系统提供了 ScrollView、NestedScrollView、RecyclerView 等现成控件,但在某些特殊需求下,我们需要深入了解 View 滑动的底层机制来定制行为。
本文旨在系统性地讲解让 View 产生位移的几种核心方式,分析其原理、性能差异及适用场景,并提供完整的代码示例。最后将深入探讨 Scroller 类在惯性滑动中的应用,帮助开发者构建更专业的自定义滚动控件。
基础知识准备
Android 坐标系体系
理解滑动的前提是明确坐标系的定义。Android 中的坐标主要涉及屏幕坐标系和视图坐标系。
-
屏幕坐标系
- 原点位于屏幕左上角 (0, 0)。
- X 轴向右增加,Y 轴向下增加。
- 对应
MotionEvent.getRawX()和getRawY(),表示触摸点距离屏幕边缘的距离。
-
视图坐标系
- 每个 View 都有自己的局部坐标系。
- View 的
left,top,right,bottom属性是相对于父容器的。 MotionEvent.getX()和getY()表示触摸点在当前 View 内部的相对位置。
-
父容器坐标系
- 当 View 嵌套时,子 View 的坐标转换需考虑父容器的偏移量。
在实际滑动计算中,通常使用 getX() 获取当前触摸点相对于 View 的位置,结合上一次触摸点计算位移量 dx 和 dy。
View 滑动方式概览
Android View 实现滑动效果主要通过改变 View 的位置属性或画布偏移来实现。常见的方法包括:
- layout(): 直接修改 View 的布局参数,触发重绘和测量流程。
- offsetLeftAndRight() / offsetTopAndBottom(): 辅助方法,修改 left/top 值并触发重绘。
- translationX / translationY: 修改视觉偏移,不影响实际布局参数,适合动画。
- setX() / setY(): 间接设置 translation 值。
- scrollTo() / scrollBy(): 修改内部画布偏移,用于内容滚动而非 View 整体移动。
大多数情况下,这些操作都需要配合 onTouchEvent 中的 ACTION_MOVE 事件来计算位移量,并调用 invalidate() 刷新界面。
1. layout() 方法
layout(int l, int t, int r, int b) 是 View 定位的核心方法。它通过重新设置 View 的四边边界来改变位置。
源码逻辑简述:
public void layout(int l, t, r, b) {
setFrame(l, t, r, b);
}
{
mRight - mLeft;
mBottom - mTop;
right - left;
bottom - top;
(newWidth != oldWidth) || (newHeight != oldHeight);
mLeft = left;
mTop = top;
mRight = right;
mBottom = bottom;
mRenderNode.setLeftTopRightBottom(mLeft, mTop, mRight, mBottom);
(sizeChanged) {
sizeChange(newWidth, newHeight, oldWidth, oldHeight);
}
;
}


