HorizontalDragLayout-模仿QQ客户端的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-10-19 19:47:14

HorizontalDragLayout-模仿QQ客户端的Item滑动删除的相关文章

模仿qq客户端应用源码且带安装包

这款源码案例是模仿qq客户端应用源码且带安装包,大家可以参考一下吧,也是比较完整的一款Android源码项目. 源码下载: http://code.662p.com/view/1931.html 00.png (125.02 KB, 下载次数: 0) 01.png (75.01 KB, 下载次数: 0) 1.png (7.24 KB, 下载次数: 0) 02.png (68.52 KB, 下载次数: 0) 10.png (74.72 KB, 下载次数: 0) 20.png (59.99 KB,

赵雅智_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-模仿QQclient的Item滑动删除

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

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

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

Android高仿QQ消息滑动删除(附源码)

大家都应该使用过QQ吧,他的消息中可以滑动删除功能,我觉得比较有意思,所以模仿写了一个,并且修改了其滑动算法.我先贴几个简单示范图吧 其实主要用的是算法以及对ListView的把控. 一下是适配器的类 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

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 QQ消息左滑动删除实例(优化版SwipeListViewEX)

仿 QQ消息左滑动删除item消息实例 源代码参考:http://blog.csdn.net/gaolei1201/article/details/42677951 自己作了一些调整,全部代码下载地址: http://download.csdn.net/detail/jenson138/8490067 效果图: 以下只有适配器类: 1 package com.ryg.slideview; 2 3 import java.util.List; 4 5 import com.ryg.slidevie

#仿知乎安卓客户端滑动删除撤销ListView

标签(空格分隔): Android 新版的知乎安卓客户端有一个有趣的功能,就是在一个item里,向右滑动时整个item会越来越透明,滑动到一半时,整个item就不见了,放开手指就是删除,删除后还可以撤销,第一次看见这个功能觉得很有意思,用了几天业余时间,我仿造里一个,效果如下: 那下面就来想想看怎么实现的,大概可以先分解为三部分: 手指滑动删除item 删除item后的撤销功能 滑动时的效果处理 提醒一下如果你对scroller不熟悉,可以先看一下scroller实现原理 先来看最主要的类Cus

【学习笔记】&quot;ListView滑动删除 ,仿腾讯QQ&quot;(三)

今天继续学习"鸿祥_"大神的写的"ListView滑动删除,仿腾讯QQ" . 今天,我准备学习并理清QQListView的逻辑. 1.自定义ListView 先看看布局文件activity_main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.c