HorizontalDragLayout-模仿QQclient的Item滑动删除

首先感谢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

时间: 2024-11-05 19:48:14

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

赵雅智_AndroidUI_listview的item滑动删除效果

package com.example.listsildedel; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.widget.ListView; public class MainActivity extends Activity { pr

HorizontalDragLayout-模仿QQ客户端的Item滑动删除

首先感谢http://blog.csdn.net/lmj623565791/article/details/46858663hongyang的文章,之前看过ViewDragHelper类也读过一些demo一直都是半知半解且之前一些自定义的ViewGroup大都不是按这种方式来写,这一次抓紧一次自己写一个demo熟悉ViewDragHelper.ViewDragHelper存在于v4包种,目的用于帮助我们自定义ViewGroup. 先上效果图: 第一步,声明ViewDragHelper: View

RecyclerView实现条目Item拖拽排序与滑动删除

RecyclerView实现条目Item拖拽排序与滑动删除 版权声明:转载请注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003 效果演示 直播视频讲解:[http://pan.baidu.com/s/1miEOtwG1 推荐大家结合我直播的视频看效果更好. 本博客源码传送门. 需求和技术分析 RecyclerView Item拖拽排序::长按RecyclerView的Item或者触摸Item的某个按钮. RecyclerView Item滑动删除:

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

原文网址:http://blog.csdn.net/xiaanming/article/details/17539199 我在上一篇文章中Android 带你从源码的角度解析Scroller的滚动实现原理从源码的角度介绍了Scroller的滚动实现原理,相信大家对Scroller的使用有一定的了解,这篇文章就给大家带来使用Scroller的小例子,来帮助大家更加熟悉的掌握Scroller的使用,掌握好了Scroller的使用我们就能实现很多滑动的效果.例如侧滑菜单,launcher,ListVi

本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/18311877)Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果

今天还是给大家带来自定义控件的编写,自定义一个ListView的左右滑动删除Item的效果,这个效果之前已经实现过了,有兴趣的可以看下Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果,之前使用的是滑动类Scroller来实现的,但是看了下通知栏的左右滑动删除效果,确实很棒,当我们滑动Item超过一半的时候,item的透明度就变成了0,我们就知道抬起手指的时候item就被删除了,当item的透明度不为0的时候,我们抬起手指Item会回到起始位置,这样我们就知道

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

今天还是给大家带来自定义控件的编写,自定义一个ListView的左右滑动删除Item的效果,这个效果之前已经实现过了,有兴趣的可以看下Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果, 之前使用的是滑动类Scroller来实现的,但是看了下通知栏的左右滑动删除效果,确实很棒,当我们滑动Item超过一半的时候,item的透明度就变 成了0,我们就知道抬起手指的时候item就被删除了,当item的透明度不为0的时候,我们抬起手指Item会回到起始位置,这样我们就

android 下拉刷新上拉加载更多,高仿ios左滑动删除item,解决了众多手势问题

一.前言 老规矩,别的不说,这demo是找了很相关知识集合而成的,可以说对我这种小白来说是绞尽脑汁!程序员讲的是无图无真相!现在大家一睹为快! 二.比较关键的还是scroller这个类的 package com.icq.slideview.view; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; i

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

我在上一篇文章中Android 带你从源码的角度解析Scroller的滚动实现原理从源码的角度介绍了Scroller的滚动实现原理,相信大家对Scroller的使用有一定的了解,这篇文章就给大家带来使用Scroller的小例子,来帮助大家更加熟悉的掌握Scroller的使用,掌握好了Scroller的使用我们就能实现很多滑动的效果.例如侧滑菜单,launcher,ListView的下拉刷新等等效果,我今天实现的是ListView的item的左右滑动删除item的效果,现在很多朋友看到这个效果应该

滑动删除Item,拖拽切换Item,你想了解的都在这儿

1. 概述 如果上两篇对RecyclerView介绍后,依然没有引起你的兴趣,那么下面关于RecyclerView的使用我相信一定会让你如获珍宝.直接看运行效果. 图-1 RecyclerView滑动删除 图-2 RecyclerView拖拽切换 用ListView或者GridView实现上图中的功能非常麻烦,而如果用RecyclerView来实现,则非常简单. 如果对RecyclerView还没有认识的同学,可以查看这两篇文章. RecyclerView使用一 RecyclerView使用二