当前位置:操作系统 > 安卓/Android >>

Android学习系列(11)--App列表之拖拽ListView(下)

接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果。

7.重写onTouchEvent()方法。
     在这个方法中我们主要是处理拖动和放下。
     拖动是选中项的影像随着手指滑动;放下是在拖动结束的时候交换数据。
     方法的整体结构如下:

view sourceprint?01 /** 

02  * 触摸事件 

03  */

04 @Override

05 public boolean onTouchEvent(MotionEvent ev) { 

06     //如果dragmageView为空,说明拦截事件中已经判定仅仅是点击,不是拖动,返回 

07     //如果点击的是无效位置,返回,需要重新判断 

08     if(dragImageView!=null&&dragPosition!=INVALID_POSITION){ 

09         int action = ev.getAction(); 

10         switch(action){ 

11             case MotionEvent.ACTION_UP: 

12                 int upY = (int)ev.getY(); 

13                 //释放拖动影像 

14                 stopDrag(); 

15                 //放下后,判断位置,实现相应的位置删除和插入 

16                 onDrop(upY); 

17                 break; 

18             case MotionEvent.ACTION_MOVE: 

19                 int moveY = (int)ev.getY(); 

20                 //拖动影像 

21                 onDrag(moveY); 

22                 break; 

23             default:break; 

24         } 

25         return true; 

26     } 

27     //这个返回值能够实现selected的选中效果,如果返回true则无选中效果 

28     return super.onTouchEvent(ev); 

29 }

8.拖动影像。
      拖动的时候,我们调用了onDrag(int y)方法,主要做的事情是,让选中项的影像随这手指滑动起来。如下:

view sourceprint?1 if(dragImageView!=null){ 

2     //设置一点点的透明度 

3     windowParams.alpha = 0.8f; 

4     //更新y坐标位置 

5     windowParams.y = y - dragPoint + dragOffset; 

6     //更新界面 

7     windowManager.updateViewLayout(dragImageView, windowParams); 

8 }

      当数据集合很大的时候,还需要在拖动到上部区域或者下部区域的时候滚动列表,使用ListView自带的方法setSelectionFromTop()。
       一个可以滚动的拖拽列表雏形就出来了,最终onDrag()方法代码如下:

view sourceprint?01 /** 

02  * 拖动执行,在Move方法中执行 

03  * @param y 

04  */

05 public void onDrag(int y){ 

06     if(dragImageView!=null){ 

07         windowParams.alpha = 0.8f; 

08         windowParams.y = y - dragPoint + dragOffset; 

09         windowManager.updateViewLayout(dragImageView, windowParams); 

10     } 

11     //为了避免滑动到分割线的时候,返回-1的问题 

12     int tempPosition = pointToPosition(0, y); 

13     if(tempPosition!=INVALID_POSITION){ 

14         dragPosition = tempPosition; 

15     } 

16       

17     //滚动 

18     int scrollHeight = 0; 

19     if(y<upScrollBounce){ 

20         scrollHeight = 8;//定义向上滚动8个像素,如果可以向上滚动的话 

21     }else if(y>downScrollBounce){ 

22         scrollHeight = -8;//定义向下滚动8个像素,,如果可以向上滚动的话 

23     } 

24       

25     if(scrollHeight!=0){ 

26         //真正滚动的方法setSelectionFromTop() 

27         setSelectionFromTop(dragPosition, getChildAt(dragPosition-getFirstVisiblePosition()).getTop()+scrollHeight); 

28     } 

29 }

      拖动的效果如下:
 

9.放下影像,数据更新。
      上面实现了拖动的效果,放下影像后:
      1)我们要获取放下的位置是数据集合的哪一项;
      2)在放下位置项插入拖动数据,并删除拖动数据原位置项
      这些处理写在了onDrop()方法中,在ACTION_UP动作中执行,代码如下:

view sourceprint?01 /** 

02  * 拖动放下的时候 

03  * @param y 

04  */

05 public void onDrop(int y){ 

06       

07     //获取放下位置在数据集合中position 

08     //定义临时位置变量为了避免滑动到分割线的时候,返回-1的问题,如果为-1,则不修改dragPosition的值,急需执行,达到跳过无效位置的效果 

09     int tempPosition = pointToPosition(0, y); 

10     if(tempPosition!=INVALID_POSITION){ 

11         dragPosition = tempPosition; 

12     } 

13       

14     //超出边界处理 

15     if(y<getChildAt(0).getTop()){ 

16         //超出上边界,设为最小值位置0 

17         dragPosition = 0; 

18     }else if(y>getChildAt(getChildCount()-1).getBottom()){ 

19         //超出下边界,设为最大值位置,注意哦,如果大于可视界面中最大的View的底部则是越下界,所

补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,