ViewDragHelper实例学习笔记
来源:互联网 发布:宣传单页制作软件 编辑:程序博客网 时间:2024/05/17 21:53
github上的一个开源项目:https://github.com/BlueMor/DragLayout,
效果图:
侧滑效果的实现主要用的是ViewDragHelper,实现了对TouchEvent中的action处理进行了封装,
使用者不必操心在侧滑的过程中如何处理TouchEvent中的ACTION_DOWN、ACTION_MOVE和ACTION_UP事件,
而只需实现回调接口ViewDragHelper.Callback()中的方法就ok了,在此项目中实现的接口:
private ViewDragHelper.Callback dragHelperCallback = new ViewDragHelper.Callback() { @Override public boolean tryCaptureView(View child, int pointerId) {//当前view是否允许拖动 return true; } @Override public int getViewHorizontalDragRange(View child) {<span style="font-family: Arial, Helvetica, sans-serif;">//横向拖动的最大距离</span> return width; } @Override public void onViewReleased(View releasedChild, float xvel, float yvel) { super.onViewReleased(releasedChild, xvel, yvel);//ACTION_UP事件后调用其方法 if (xvel > 0) { open(); } else if (xvel < 0) { close(); } else if (releasedChild == vg_main && mainLeft > range * 0.3) { open(); } else if (releasedChild == vg_left && mainLeft > range * 0.7) { open(); } else { close(); } } @Override public int clampViewPositionHorizontal(View child, int left, int dx) {//返回横向坐标左右边界值 if (mainLeft + dx < 0) { return 0 ;//0 } else if (mainLeft + dx > range) { return range;// } else { return left; } } @Override public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {//view在拖动过程坐标发生变化时会调用此方法,包括两个时间段:手动拖动和自动滚动 if (changedView == vg_main) { Log.d("draglayout","changedview is vg main"); mainLeft = left; } else { mainLeft = mainLeft + left; Log.d("draglayout","changedview is vg left"); } if (mainLeft < 0) { mainLeft = 0; } else if (mainLeft > range) { mainLeft = range; } if (isShowShadow) { iv_shadow.layout(mainLeft, 0, mainLeft + width, height); } if (changedView == vg_left) { vg_left.layout(0, 0, width, height); vg_main.layout(mainLeft, 0, mainLeft + width, height); } dispatchDragEvent(mainLeft); } };在此接口中基本没有对touchevent事件的处理,那这些方法是怎么与touchevent时间联系起来的?
在touchevent事件处理中DragLayout是直接调用了ViewDragHelper中的processTouchEvent方法:
public boolean onTouchEvent(MotionEvent e) { try { dragHelper.processTouchEvent(e); } catch (Exception ex) { ex.printStackTrace(); } return false; }
在processTouchEvent中对ACTION_DOWN、ACTION_MOVE和ACTION_UP事件进行了处理:
1.在ACTION_DOWN中调用回调接口中的tryCaptureView方法,看当前touch的view是否允许拖动
在此项目中的是直接return true,两个view都是允许拖动的
2.在ACTION_MOVE中,view的坐标发生改变,调用回调接口中的onViewPositionChanged方法,
根据坐标信息对view进行layout,通过ViewHelper这个类中的setScaleX、setScaleY方法,实现在
拖动的过程中view在XY坐标上进行相应比例的缩放;
3.在ACTION_UP后调用回调接口中的onViewReleased方法,此方法中一个重要的任务是在ACTION_UP事件
后,实现view的自动滑动,这里主要是使用了ViewDragHelper中smoothSlideViewTo方法,start了ViewDragHelper
中的mScroller:
mScroller.startScroll(startLeft, startTop, dx, dy, duration); setDragState(STATE_SETTLING);然后通过方法ViewCompat.postInvalidateOnAnimation(this)调用view的 computeScroll() 方法:
public void computeScroll() { if (dragHelper.continueSettling(true)) { ViewCompat.postInvalidateOnAnimation(this); } }
ViewDragHelper的中的continueSettling方法会调用的mScroller.computeScrollOffset();方法,
来判断滚动是否结束,并在获取mScroller.getCurrX() 的值后,调用回调接口的onViewPositionChanged方法对view进行layout,
自此完成了手动拖和ACTION_UP后自动滚动的两个过程,大致流程图如下:
- ViewDragHelper实例学习笔记
- ViewDragHelper学习笔记
- 学习笔记:Android ViewDragHelper的使用
- ViewDragHelper笔记
- ViewDragHelper学习
- ViewDragHelper学习
- Android ViewDragHelper源码笔记
- 自定义ViewGroup笔记--ViewDragHelper
- Android:ViewDragHelper学习
- ViewDragHelper 的学习一
- ViewDragHelper的学习
- ViewDragHelper空指针异常笔记
- ViewDragHelper
- ViewDragHelper
- ViewDragHelper
- ViewDragHelper
- ViewDragHelper
- ViewDragHelper
- chrome浏览器提示:object is not a function
- error LNK2026: 模块对于 SAFESEH 映像是不安全的
- 微商和微信营销遇到的问题 转载
- 不使用Cygwin,在eclipse中快速开发JNI,一键生成C头文件.h,以及一键使用NDK交叉编译
- rails中获取url信息的一些方法
- ViewDragHelper实例学习笔记
- calamari 安装步骤
- python 使用分水岭算法实现走迷宫
- 后勤数据logistics IP改filter重新initial
- 你有职场危机感吗?5个建议为你的职业生涯加分!
- 四个作用域九大内置对象
- HDU-2565-放大的X
- ActionScript 按帧切割视频流并显示
- lefLeetcode -- Trapping Rain Water