返回介绍

4.1. ViewDragHelper.Callback 的实现

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

在分析 ViewDragHelper 之前,我们先来分析一下 Callback 的定义,看看 Callback 都定义了哪些方法:

  public static abstract class Callback {

    //当 View 的拖拽状态改变时回调,state 为 STATE_IDLE,STATE_DRAGGING,STATE_SETTLING 的一种
    //STATE_IDLE: 当前未被拖拽
    //STATE_DRAGGING:正在被拖拽
    //STATE_SETTLING: 被拖拽后需要被安放到一个位置中的状态
    public void onViewDragStateChanged(int state) {}

    //当 View 被拖拽位置发生改变时回调
    //changedView :被拖拽的 View
    //left : 被拖拽后 View 的 left 边缘坐标
    //top : 被拖拽后 View 的 top 边缘坐标
    //dx : 拖动的 x 偏移量
    //dy : 拖动的 y 偏移量
    public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {}

    //当一个 View 被捕获到准备开始拖动时回调,
    //capturedChild : 捕获的 View
    //activePointerId : 对应的 PointerId
    public void onViewCaptured(View capturedChild, int activePointerId) {}

    //当被捕获拖拽的 View 被释放是回调
    //releasedChild : 被释放的 View
    //xvel : 释放 View 的 x 方向上的加速度
    //yvel : 释放 View 的 y 方向上的加速度
    public void onViewReleased(View releasedChild, float xvel, float yvel) {}

    //如果 parentView 订阅了边缘触摸,则如果有边缘触摸就回调的接口
    //edgeFlags : 当前触摸的 flag 有: EDGE_LEFT,EDGE_TOP,EDGE_RIGHT,EDGE_BOTTOM
    //pointerId : 用来描述边缘触摸操作的 id
    public void onEdgeTouched(int edgeFlags, int pointerId) {}

    //是否锁定该边缘的触摸,默认返回 false,返回 true 表示锁定
    public boolean onEdgeLock(int edgeFlags) {
      return false;
    }

    //边缘触摸开始时回调
    //edgeFlags : 当前触摸的 flag 有: EDGE_LEFT,EDGE_TOP,EDGE_RIGHT,EDGE_BOTTOM
    //pointerId : 用来描述边缘触摸操作的 id
    public void onEdgeDragStarted(int edgeFlags, int pointerId) {}

    //在寻找当前触摸点下的子 View 时会调用此方法,寻找到的 View 会提供给 tryCaptureViewForDrag() 来尝试捕获。
    //如果需要改变子 View 的遍历查询顺序可改写此方法,例如让下层的 View 优先于上层的 View 被选中。
    public int getOrderedChildIndex(int index) {
      return index;
    }

    //获取被拖拽 View child 的水平拖拽范围,返回 0 表示无法被水平拖拽
    public int getViewHorizontalDragRange(View child) {
      return 0;
    }

    //获取被拖拽 View child 的垂直拖拽范围,返回 0 表示无法被水平拖拽
    public int getViewVerticalDragRange(View child) {
      return 0;
    }

    //尝试捕获被拖拽的 View
    public abstract boolean tryCaptureView(View child, int pointerId);

    //决定拖拽 View 在水平方向上应该移动到的位置
    //child : 被拖拽的 View
    //left : 期望移动到位置的 View 的 left 值
    //dx : 移动的水平距离
    //返回值 : 直接决定 View 在水平方向的位置
    public int clampViewPositionHorizontal(View child, int left, int dx) {
      return 0;
    }

    //决定拖拽 View 在垂直方向上应该移动到的位置
    //child : 被拖拽的 View
    //top : 期望移动到位置的 View 的 top 值
    //dy : 移动的垂直距离
    //返回值 : 直接决定 View 在垂直方向的位置
    public int clampViewPositionVertical(View child, int top, int dy) {
      return 0;
    }
  }

想必注释已经很清楚了,正是这些回调方法,再结合 ViewDragHelper 中的各种方法,来帮助我们实现各种各样的拖拽的效果。

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

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

发布评论

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