安卓 ViewDragHelper 介绍和使用方法详解

本文介绍了ViewDragHelper的基本使用方法,包括如何创建ViewDragHelper实例、处理触摸事件的拦截及响应、实现滑动边界控制和释放后的动画效果。通过具体代码示例展示了ViewDragHelper在自定义ViewGroup中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先看一下 ViewDragHelper 的介绍

这里写图片描述

我们知道在自定义 ViewGroup 中经常看到 ViewDragHelper 的身影,官方介绍说它提供了一些有用的操作和状态跟踪,允许用户在其ViewGroup中拖动和重新定位视图。我们来看下使用方法:

  • 首先创建 ViewDragHelper
    使用 静态方法 create(),ViewDragHelper 构造器对外隐藏,创建方法
    /**
     * Factory method to create a new ViewDragHelper.
     *
     * @param forParent Parent view to monitor
     * @param sensitivity Multiplier for how sensitive the helper should be about detecting
     *                    the start of a drag. Larger values are more sensitive. 1.0f is normal.
     * @param cb Callback to provide information and receive events
     * @return a new ViewDragHelper instance
     */
    public static ViewDragHelper create(ViewGroup forParent, float sensitivity, Callback cb) {
        final ViewDragHelper helper = create(forParent, cb);
        helper.mTouchSlop = (int) (helper.mTouchSlop * (1 / sensitivity));
        return helper;
    }

forParent 为我们自定义的 ViewGroup 布局, sensitivity 灵敏度,1.0f 为默认值,值越大,越灵敏,Callback 参数最为重要,等下详细介绍。

  • 拦截事件
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return mDragHelper.shouldInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mDragHelper.processTouchEvent(event);
        return true;
    }
  • 处理computeScroll()
@Override
    public void computeScroll() {
        super.computeScroll();
        if (mViewDragHelper.continueSettling(true)) {
            ViewCompat.postInvalidateOnAnimation(this);
        }
    }
}
  • 处理回调 CallBack

这里写图片描述

public abstract boolean tryCaptureView(View child, int pointerId);
为必须实现的抽象方法,当我们手指触摸屏幕的时候,ViewDragHelper 将对应的 view 传过来,返回TRUE 说明捕获当前view。

        public int clampViewPositionHorizontal(View child, int left, int dx) {
            return 0;
        }
        public int clampViewPositionVertical(View child, int top, int dy) {
            return 0;
        }

这两个方法主要是对 view 的滑动边际进行控制。

public void onViewReleased(View releasedChild, float xvel, float yvel) {}

当我们取消对view 拖拽控制后,会触发这个方法,如果我们需要view 移到某个位置的时候可以调用 settleCapturedViewAt(int, int) 或者flingCapturedView(int, int, int, int) 方法,因为底层使用的OverScroller 所以我们要在 computeScroll() 中对 continueSettling(boolean) 进行判断是否需要继续滑动。

    public void onEdgeDragStarted(int edgeFlags, int pointerId) {}

在需要边缘拖动的地方,对传入的edgeFlags 进行判断即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值