博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HorizontalDragLayout-模仿QQclient的Item滑动删除
阅读量:6260 次
发布时间:2019-06-22

本文共 3262 字,大约阅读时间需要 10 分钟。

首先感谢hongyang的文章。之前看过ViewDragHelper类也读过一些demo一直都是半知半解且之前一些自己定义的ViewGroup大都不是按这样的方式来写,这一次抓紧一次自己写一个demo熟悉ViewDragHelper。ViewDragHelper存在于v4包种。目的用于帮助我们自己定义ViewGroup。

先上效果图:

这里写图片描写叙述

第一步,声明ViewDragHelper:

ViewDragHelper.create(this, 1.0f, new ViewDragCallback());

当中1.0f代表最小滑动距离touchSlop是系统默认的多少倍数越大的话越灵敏。

第二步,继承ViewDragHelper.CallBack实现里面的方法来满足滑动需求。

private class ViewDragCallback extends ViewDragHelper.Callback {
@Override public boolean tryCaptureView(View view, int i) { return view == mContentView || view == mDeleteView; } @Override public int clampViewPositionHorizontal(View child, int left, int dx) { Log.w(TAG, "clampViewPositionHorizontal = " + left + "/" + dx); int realLeft = left; if (child == mContentView) { if (left > 0) {
// right scroll realLeft = left > mDeleteView.getWidth() ?

mDeleteView.getWidth() : left; } else if (left < 0) {

// left scroll realLeft = Math.abs(left) > mDeleteView.getWidth() ?

-mDeleteView.getWidth() : left; } } return realLeft; } @Override public void onViewReleased(View releasedChild, float xvel, float yvel) { super.onViewReleased(releasedChild, xvel, yvel); Log.w(TAG, "--- scroll finish when finger up ---"); Log.w(TAG, "onViewReleased = " + xvel + "/" + yvel); if (releasedChild == mContentView) { if (xvel > 0) { mDragHlper.settleCapturedViewAt(point.x, point.y); } else { mDragHlper.settleCapturedViewAt(point.x - mDeleteView.getWidth(), point.y); } invalidate(); } } @Override public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { super.onViewPositionChanged(changedView, left, top, dx, dy); Log.w(TAG, "--- when view position changed = " + left + "/" + dx); if (changedView == mContentView) { mDeleteView.offsetLeftAndRight(dx); } else if (changedView == mDeleteView) { mContentView.offsetLeftAndRight(dx); } invalidate(); } }

tryCaptureView:这种方法仅仅有返回true才干进行滑动。否则没有效果。

onViewReleased:这种方法指当手放开后监听当速度满足需求的时候直接滑动到设定的地方。
onViewPositionChanged:当被CaptureView滑动的时候设置DeleteView也移动到相相应的地方。
clampViewPositionHorizontal:设置这个ViewGoup中的ContentView的滑动区域。

第三步,复写手指控制方法:

@Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        int action = MotionEventCompat.getActionMasked(ev);        if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {            return false;        }        return mDragHlper.shouldInterceptTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        mDragHlper.processTouchEvent(event);        return true;    }

关于ViewDragHelper有例如以下几点:

ViewDragHelper.Callback是连接ViewDragHelper与view之间的桥梁(这个view通常是指拥子view的容器即parentView);

ViewDragHelper的实例是通过静态工厂方法创建的;

你能够指定拖动的方向;

ViewDragHelper能够检測到是否触及到边缘;

ViewDragHelper并非直接作用于要被拖动的View,而是使其控制的视图容器中的子View能够被拖动,假设要指定某个子view的行为,须要在Callback中想办法;

ViewDragHelper的本质事实上是分析onInterceptTouchEvent和onTouchEvent的MotionEvent參数,然后依据分析的结果去改变一个容器中被拖动子View的位置( 通过offsetTopAndBottom(int offset)和offsetLeftAndRight(int offset)方法 ),他能在触摸的时候推断当前拖动的是哪个子View;

尽管ViewDragHelper的实例方法 ViewDragHelper create(ViewGroup forParent, Callback cb) 能够指定一个被ViewDragHelper处理拖动事件的对象 ,但ViewDragHelper类的设计决定了其适用于被包括在一个自己定义ViewGroup之中,而不是对随意一个布局上的视图容器使用ViewDragHelper。

源代码地址:

你可能感兴趣的文章
JavaScript 运算符规则与隐式类型转换详解
查看>>
网站攻击中的csrf和xss
查看>>
(CZ深入浅出Java基础)反射
查看>>
图像颜色提取
查看>>
20170626-Promise的实现
查看>>
jQuery webcam plugin调用摄像头
查看>>
Vue入门笔记
查看>>
bash脚本case与函数
查看>>
我的学习计划
查看>>
理解 Go 语言中的方法和接收者
查看>>
iView 发布 2.0.0-rc.16 版本
查看>>
React表单组件
查看>>
从0到1学习node(八)之异步控制工具async
查看>>
Android 运行时权限库
查看>>
网易漫画Swift混编实践
查看>>
如何针对业务设计架构?——QCon热点专题前瞻
查看>>
你的可用性达标了吗?云端业务性能高可用的深度实践
查看>>
Mozilla开发全新的公开网络API WebXR 来实现增强现实
查看>>
用户超5亿,三年投10亿,开发者如何抢滩支付宝小程序蓝海?
查看>>
[使用 Weex 和 Vue 开发原生应用] 2 编写独立页面
查看>>