Android View 滚动边界的测量
时间: 2023-08-27 12:03:44 浏览: 64
在 Android 中,可以通过重写 View 或 ViewGroup 的 `onOverScrolled()` 方法来测量滚动边界。这个方法会在 View 或 ViewGroup 滚动到达边界时被调用。
具体实现步骤如下:
1. 重写 View 或 ViewGroup 的 `onOverScrolled()` 方法。
2. 在 `onOverScrolled()` 方法中,判断当前滚动是否达到了边界,如果是则记录下来。
3. 在需要知道滚动边界的地方,调用 `getOverScrollMode()` 方法获取当前 View 或 ViewGroup 的滚动模式,如果是 `View.OVER_SCROLL_NEVER` 或 `View.OVER_SCROLL_IF_CONTENT_SCROLLS` 则表示边界不可滚动,否则边界可滚动。
4. 如果边界可滚动,则可以通过记录下来的边界值来进行相应的处理。
示例代码如下:
```java
public class MyScrollView extends ScrollView {
private boolean mIsTopOverScrolled = false;
private boolean mIsBottomOverScrolled = false;
public MyScrollView(Context context) {
super(context);
}
public MyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
// 判断是否达到顶部边界
if (scrollY == 0 && clampedY && !mIsTopOverScrolled) {
mIsTopOverScrolled = true;
}
// 判断是否达到底部边界
if (scrollY == computeVerticalScrollRange() - computeVerticalScrollExtent()
&& clampedY && !mIsBottomOverScrolled) {
mIsBottomOverScrolled = true;
}
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
}
public boolean isTopOverScrolled() {
return mIsTopOverScrolled;
}
public boolean isBottomOverScrolled() {
return mIsBottomOverScrolled;
}
}
```
在上面的示例代码中,我们重写了 `ScrollView` 的 `onOverScrolled()` 方法。在方法中,我们判断当前滚动是否达到了顶部或底部边界,并记录下来。在需要知道滚动边界的地方,我们调用 `getOverScrollMode()` 方法获取当前滚动模式,如果是 `View.OVER_SCROLL_NEVER` 或 `View.OVER_SCROLL_IF_CONTENT_SCROLLS` 则表示边界不可滚动,否则边界可滚动。如果边界可滚动,则可以通过 `isTopOverScrolled()` 和 `isBottomOverScrolled()` 方法获取顶部和底部边界是否被滚动过。