Android基础之ListView的拖拽实现
来源:互联网 发布:线刷宝刷机有垃圾软件 编辑:程序博客网 时间:2024/06/05 22:56
先来效果看看:
普及下常识知识先 没图没真相看图说话
我们无非就要得到两个参数 第一个是Gride或者List到屏幕顶部的距离(当然包括StatusBar) 和itemX,itemY相对item的位置对吧
然后说下思路:
在手指按下时候判断下看是否触发了拖动的机关 ,没触发就交给ListView来处理
触发了就交给子视图的那个机关滑块去实现onTouch事件;
假如是触发了我们还要记录下当前点击的ListItem项,
然后开始拖动处理 一起看下startdrag()干了些啥
public void startDrag(Bitmap bm, int y) { windowParams = new WindowManager.LayoutParams(); windowParams.gravity = Gravity.TOP; windowParams.x = 0; windowParams.y = y - dragPoint + dragOffset; windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT; windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT; windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN; windowParams.format = PixelFormat.TRANSLUCENT; windowParams.windowAnimations = 0; ImageView imageView = new ImageView(getContext()); imageView.setImageBitmap(bm); imageView.setBackgroundColor(Color.argb(80, 180, 60, 60)); imageView.setScaleY(1.5f); windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE); windowManager.addView(imageView, windowParams); dragImageView = imageView; }
很显然 按下时候我们对镜像缓存做了放大变淡处理 然后添加镜像View到windowManager实现悬浮
(这里我们也可以用mWindowParams.type = indowManager.LayoutParams.TYPE_TOAST) 不过记得要加权限)添加之后每次触摸记得要remove掉添加的视图;
然后就是move手指了 当然在move时候就是开始拖动滑块滚动
看下滚动的实现
public void onDrag(int y) { if (dragImageView != null) { windowParams.alpha = 0.8f; windowParams.y = y - dragPoint + dragOffset; windowManager.updateViewLayout(dragImageView, windowParams); } // 为了避免滑动到分割线的时候,返回-1的问题 int tempPosition = pointToPosition(0, y); if (tempPosition != INVALID_POSITION) { dragPosition = tempPosition; } int scrollHeight = 0; if (y < upScrollBounce) { scrollHeight = scaledTouchSlop;// 定义向上滚动8个像素 } else if (y > downScrollBounce) { scrollHeight = -scaledTouchSlop;// 定义向下滚动8个像素 } if (scrollHeight != 0) { setSelectionFromTop(dragPosition, getChildAt(dragPosition - getFirstVisiblePosition()).getTop() + scrollHeight); } }
在这里 先解释下upScrollBounce 和downScrollBounce含义 很明显是判断向上滚动还是该向下滚动
setSelectionFromTop方法也设置了每次要滚动的距离
最后就是up手指了 当然在move时候就是开始拖动滑块了。
主要操作就是从windowManager中remove掉添加的视图和 数据交换
数据交换咱们直接看
if (dragPosition >= 0 && dragPosition < getAdapter().getCount()) { DragListAdapter adapter = (DragListAdapter) getAdapter(); String dragItem = adapter.getItem(dragSrcPosition); adapter.remove(dragItem); adapter.insert(dragItem, dragPosition); }
可以看出 直接是remove掉拖动前的那个item 然后将其插入到当前拖动的位置上
0 0
- Android基础之ListView的拖拽实现
- android 基础-自定义listView的实现
- Android基础之ListView
- Android基础之ListView的使用详解
- Android基础之ListView的使用详解
- android之Listview的分组实现
- android之Listview的分组实现
- android之Listview的下拉刷新实现
- android之Listview的分组实现
- android之Listview的分组实现
- Android基础UI之ListView
- Android开发基础之ListView
- android 基础-自定义listView的实现 简单的文件浏览器
- Android 基础-最简单的listView实现 ArrayAdapter
- android 基础-自定义listView的实现 adapter 方法解析
- android最基础简单的ListView实现方法
- Android最基础简单的ListView实现方法。
- Android基础之Listview的滚动事件的学习
- 微软图形控件(Chart或MSchart)的用法
- 使用“App_Code”文件夹“同时存在于”的问题
- 一种简单的图像显著性计算模型
- Ubuntu14.04LTS安装低版本gcc编译器
- 纯拓扑排序一搞poj2367
- Android基础之ListView的拖拽实现
- 如何快速学习一门新技术
- 啦啦啦啦~Django1.96---编写第一个Django应用(2)
- 如何使图片分辨率与清晰度满足SCI期刊的严格要求
- Sql中EXISTS与IN的效率问题
- kvm--虚拟机运行
- 详解Linux中的mv命令
- LeetCode 349. Intersection of Two Arrays(数组交集)
- linux命令执行返回值