Touch事件实现View拖动

  Touch监听事件可以监听手指在屏幕上的行为,例如按下、滑动。抬起。根据这些事件,可以做出View任意推动的效果。

实现原理:

  首先获取view的位置以及父控件viewgroup的位置(上下左右)。通过父控件的位置可以获得父控件的宽度和高度(width=right-left,height=bottom-top)。   然后实现OnTouchListener监听,监听MotionEvent.ACTION_DOWN以及MotionEvent.ACTION_MOVE。在ACTION_DOWN中记录第一次按下时的X、Y值。在ACTION_MOVE中再次记录移动后的X、Y值,计算出X。Y移动的距离dx、dy。 之后获取view的位置(t、b、l、r)。然后计算出移动后view的位置:dt=t+dy db=b+dy dl=l+dx dr=r+dx。然后执行view.layout(dl,dt,dr,db)固定移动后view的位置。保持移动后的X、Y坐标。最后调用view.postInvalidate();执行刷新。

注意:

  • onTouch和onClick事件冲突问题:   当同时实现了Touch和Click事件时,会发生冲突,如何避免?在我们的onTouchListener的监听方法会返回一个boolean。当它为false时,就会触发Click事件,当它为true时,便不会触发。我们希望在点击的时候触发点击事件,在拖动的时候实现移动效果的Touch事件。   那么,我们定义一个boolean key=false;在ACTION_DOWN里,使key=false。而在ACTION_MOVE中使key=true,最后返回key即可。 这样做会出现很难触发点击事件。拖动事件太容易触发。所以我们需要加点限制。在ACTION_MOVE中我们获得X、Y移动的距离。那么我们判断当期中一个的移动距离大于1的时,才执行key=true。冲突得到较为完善的解决。
  • 获取View和ViewGroup的位置:   获取view和viewgroup的位置调用getLeft()、getRight()、getTop()、getBottom()四个方法。不过需要在UI控件全部加载完成之后才能调用,不能在onCreate()甚至onResum()中调用,否则全是0。正确的姿势是在touch时间或者click事件触发的时候调用。
  • View获取的位置的参照物是它的父控件:   对于view来说,他的上下左右位置参照物是它的父控件,无论父控件在屏幕的哪个位置。例如父控件处于屏幕中央某处大小是300dp300dp,位置是(100,200,400,500)。而一个View处于它的左上方大小是100dp100dp,那么这个View的位置是(0,0,100,100)。

进阶:

  避免View移动到边界然后被移出父控件消息不见。我们需要对上下左右边界进行处理。 获取view的宽高width、height,view的位置left、top、right、bottom,父控件viewgroup的宽高pwidth、pheighht。

//当view滑动到左边超过左边界时:
if(left<0){
left=0;
right=left+width;
}
//当view滑动到顶部超过顶部边界时:
if(top<0){
top=0;
bottom=top+height;
}
//当view滑动到右边超过右边边界时:
if(right>pwidth){
right=pwidth;
left=right-width;
}
//当view滑动到底部超过底部边界时:
if(bottom>pheight){
bottom=pheight;
top=bottom-height;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏李蔚蓬的专栏

6.4 Android绘图技巧(Primary:四大方法&Layer)

创建一个新的Layer到“栈”中,可以使用saveLayer(), savaLayerAlpha(), 从“栈”中推出一个Layer,可以使用restore()...

15920
来自专栏学海无涯

Android开发之ListView使用经验分享

在Android开发中,ListView是使用最广泛的组件之一,虽然谷歌推出了RecycleView,但是很多项目中依旧在使用ListView,本文将总结一下使...

33160
来自专栏Felix的技术分享

Android快速索引条控件QuickIndexBar

28470
来自专栏向治洪

CoordinatorLayout

CoordinatorLayout作为“super-powered FrameLayout”基本实现两个功能:  1、作为顶层布局  2、调度协调子布局 ...

175100
来自专栏李蔚蓬的专栏

Material Design 实战 之第二弹——滑动菜单详解&实战

本模块共有六篇文章,参考郭神的《第一行代码》,对Material Design的学习做一个详细的笔记,大家可以一起交流一下:

13330
来自专栏Android干货园

Android 自定义上面圆角下面直角的ImageView

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/48...

92340
来自专栏Android干货

安卓开发_九宫格布局

31630
来自专栏Android开发指南

Android自定义控件总结

41470
来自专栏androidBlog

Android打造不一样的新手引导页面(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/...

8910
来自专栏移动开发

android 圆角图片的实现和封装

下面为主要源码,实现了 Picasso 中的 Transformation 接口。

31440

扫码关注云+社区

领取腾讯云代金券