ViewDragHelper一个帮助你轻松完成滑动操作的辅助类
来源:互联网 发布:安卓手机游戏源码 编辑:程序博客网 时间:2024/05/16 12:09
通过我们来处理自定义ViewGroup中子View滑动时,我们都是去通过事件拦截以及在onTouchEvent方法中进行手势判断,加速度检测等。
在官方的V4提供了ViewDragHelper来帮助我们方便的编写自定义ViewGroup时处理子View的滑动等相关的操作处理
代码演示:
public class CustomViewGroup extends ViewGroup { View childView_1; //子View1 View childView_2; //子View2 ViewDragHelper viewDragHelper; public CustomViewGroup(Context context) { super(context); // 第一个参数为this,表示该类生成的对象,是ViewDragHelper的拖动处理对象,必须为ViewGroup。 //第二个参数1.0f是敏感度参数参数越大越敏感,默认就是1.0f。 //第三个参数回调接口,是ViewDragHelper与View交互的桥梁 viewDragHelper = ViewDragHelper.create(this, 1.0f, new ViewDragHelper.Callback() { /** *通过DragHelperCallback的tryCaptureView方法的返回值可以决定一个parentview中哪个子view可以拖动, * * @param child * @param pointerId * @return */ @Override public boolean tryCaptureView(View child, int pointerId) { //return child==childView_1; 如果如此 设置 只有 childView_1可以被ViewDragHelper控制 return true; //所有View都可以 //有人问 想 控制两个怎么办 //return child == view1 || child == view2 >>>>> 484傻 ,其实是我问的 } /** *该方法用来处理水平方向的滑动事件,返回目的值即可,但是为了处理例如边界情况,需要考虑到对象本身的边界值 * @param child 需要被处理的对象 可以用此来判断(eg 只允许View1垂直滑动 ,判断一下,如果是view1我就不做任何操作不就行了么) * @param left 目的值(应该是以左边的点为依据) * @param dx * @return */ @Override public int clampViewPositionHorizontal(View child, int left, int dx) { int left_bound = getPaddingLeft(); //左边的边界值 int right_bound = getWidth() - getPaddingRight() - child.getWidth();//右边的边界值 //这真是个有趣的表达式 第一步如果是左边部分的话,肯定是取值比 左边界要大, // 右边部分的话(肯定比左边界大了,内部的值Max取到的肯定是 left),取到的值要比右边界小 //主要是为了 视图越界 呈现在手机窗口的外面了 return Math.min(Math.max(left, left_bound), right_bound); } /* * 这里没有什么不同 只是垂直方向的罢了 * */ @Override public int clampViewPositionVertical(View child, int top, int dy) { int top_bound = getPaddingTop();//上边界 int bottom_bound = getHeight() - getPaddingBottom() - child.getHeight();//下边界 return Math.min(Math.max(top, top_bound), bottom_bound); } /** * 当设置了边缘滑动事件的时候,一旦事件发生,该方法就会被回调,要是想要相关View跟着运动需要在代码中执行 * @param edgeFlags 边缘的滑动标志 * @param pointerId */ @Override public void onEdgeDragStarted(int edgeFlags, int pointerId) { //如此 第一个View就会跟着边缘事件进行 触发操作了 viewDragHelper.captureChildView(childView_1, pointerId); } }); //如果你想要处理左右边缘的滑动事件 可以通过以下设置 >>例如设置左边缘,如果想要监听到相关事件还需要重写回调中的一个方法 //onEdgeDragStarted() viewDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { //该方法内部已经对相应的事件进行了过滤,至此直接将事件交给ViewDragHelper返回即可 return viewDragHelper.shouldInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { //将事件拿到 viewDragHelper.processTouchEvent(event); //表示消费该事件 return true; } /** * 当View中所有的子控件 均被映射成xml后触发 */ @Override protected void onFinishInflate() { super.onFinishInflate(); //小心空指针呀,要是你布局文件里没有两个子View,不就GG了么 注意哈 childView_1 = getChildAt(0); childView_2 = getChildAt(1); }}
到此,我们的ViewDragHelper已经体验了一番,下一章,我们介绍剩下的几个特性,打造我们的侧滑菜单.
1 0
- ViewDragHelper一个帮助你轻松完成滑动操作的辅助类
- Android 视图拖拽辅助类 ViewDragHelper 的使用
- CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待
- JAVA多线程—CountDownLatch-一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
- V4包--ViewDragHelper辅助类详解
- 帮助CSDN网友完成的一个程序
- 神奇的 ViewDragHelper,让你轻松定制拥有拖拽能力的 ViewGroup
- 一个简单的OleDb数据操作辅助类
- 原创:一个操作Message Queue的辅助类
- 一个用于Ini文件操作的辅助类
- RecyclerView滑动事件检测的辅助类
- Scroller类和进化版的拖动辅助类ViewDragHelper的一点理解
- View滚动帮助类ViewDragHelper解析
- 【帮助你完成腾达路由器的基本配置】
- ADO.NET的一个帮助类库,只须一个连接,一条SQL语句,轻松实现数据库的查旬,再加一个object 轻松实现数据库的增删改
- 一个帮助你处理延迟,重复,循环操作的jQuery插件 - timing
- 轻松实现一个操作ini文件的类
- 轻松实现一个操作ini文件的类
- MongoDB 性能优化五个简单步骤
- java log4j log日志文件名(+日期标记)
- Cocos2d-JS 快速入门_01 环境搭建(Mac && Windows集合版)
- XTU 1045 唯一的最小生成树
- Spark架构与作业执行流程简介
- ViewDragHelper一个帮助你轻松完成滑动操作的辅助类
- Oracle中生成GUID类型
- Spark1.0.0 运行架构基本概念
- 17、浅谈JSON
- Spark Master High Availability(HA)高可用配置的2种实现
- spark 作业调度
- 百度地图放大是报js错误
- Unable to locate Spring NamespaceHandler for XML schema namespace
- ConcurrentHashMap