首先感谢http://blog.csdn.net/lmj623565791/article/details/46858663hongyang的文章。之前看过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。

源代码地址:

https://github.com/Neacy/HoriazontalDragView

HorizontalDragLayout-模仿QQclient的Item滑动删除的更多相关文章

  1. Android 用HorizontalScrollView实现ListView的Item滑动删除 ,滑动错乱 冲突

    用HorizontalScrollView实现类似微信的滑动删除 测试于:Android2.2+ 对于Android来说按键操作已经在减少,越来越多的手势操作层出不穷,今天介绍一款LIstView的I ...

  2. android中listview的item滑动删除效果(已解决listview点击问题)

    领导看到iphone上tableview有个滑动删除的效果,要求在android上也实现,搜了下资料,实现起来比较简单,可弄到后面,居然不能点击了,把一篇文章中的代码修改了一下,捣鼓了一番,搞定,下面 ...

  3. 模仿qq列表信息滑动删除效果

    这个效果的完成主要分为两个部分 自定义view作为listview的列表项 一个view里面包括 显示头像,名字,消息内容等的contentView和滑动才能显示出来的删除,置顶的右边菜单menuVi ...

  4. android侧滑删除,模仿qq跟进item显示删除按钮

    今天所写的代码只是为了个人以后查询方便,如果你参考了并且在使用中遇到问题也可以在这里直接回复我 SwipeDelMenuLayout: 效果图: item布局: <?xml version=&q ...

  5. Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

    本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877) 今天还是给大家带来自定义控件的编写,自定义一个Lis ...

  6. Android 高级UI设计笔记03:使用ListView实现左右滑动删除Item

    1. 这里就是实现一个很简单的功能,使用ListView实现左右滑动删除Item: (1)当我们在ListView的某个Item,向左滑动显示一个删除按钮,用户点击按钮,即可以删除该项item,并且有 ...

  7. 【转】Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

    原文网址:http://blog.csdn.net/xiaanming/article/details/17539199 转帖请注明本文出自xiaanming的博客(http://blog.csdn. ...

  8. [转]Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...

  9. Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...

随机推荐

  1. Linux - 环境变量与位置变量

    环境变量 [root@local ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 注:只有自己执行 ...

  2. hdoj--2255--奔小康赚大钱(KM算法模板)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  3. nyoj--105--九的余数(水题)

    九的余数 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在给你一个自然数n,它的位数小于等于一百万,现在你要做的就是求出这个数整除九之后的余数. 输入 第一行有一个整 ...

  4. 数组、链表、栈、队列和STL

    数组 数组是一种最基本的数据结构,它是内存上的一块连续存储空间.正因如此数组的随机访问很方便.但数组也有其固有的限制,大小分配后不能改变. STL中的数组 STL中的Array是静态数组模板,就是我们 ...

  5. 重温前端基础之-css浮动与清除浮动

    文档流的概念指什么?有哪种方式可以让元素脱离文档流? 文档流,指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列.并最终窗体自上而下分成一行行,并在每行中按从左到右的顺序排放元素.脱离文 ...

  6. C#关于VSHOST.EXE停止工作的解决办法,VS2008

    主要原因就是电脑系统系统32位和64位的问题在项目属性中修改下即可. 方法: 右击项目 - 属性 - 生成 - 目标平台 - Any CPU[改为x86] 虽然简单,但如不知原因却恼火的紧,贴出来如有 ...

  7. shell学习第二弹-进阶

    1.linux系统中配置文件执行顺序 1)用户登录系统,首页调用/etc/profile文件初始化所有bash用户的默认特征 2)然后shell依次查找~/.bash_profile,~/.bash_ ...

  8. ML二:NNSearch数据结构--二叉树

    wiki百科:http://zh.wikipedia.org/wiki/%E5%86%B3%E7%AD%96%E6%A0%91%E5%AD%A6%E4%B9%A0 opencv学习笔记--二杈决策树: ...

  9. 怎么用js或jq点击展开,出现隐藏的DIV,点击收起DIV又隐藏起来.

    方法一:1 <script type="text/javascript"> $(function() { $("#toggle").click(fu ...

  10. python编写简单的html登陆页面(2)

    1  在python编写简单的html登陆页面(1)的基础上在延伸一下: 可以将动态分配数据,实现页面跳转功能: 2  跳转到新的页面:return render_template('home1.ht ...