android在设定区域拖动拖动照片来回移动怎么实现

本文来自 转载请申明文章出处!

通过上一篇文章中,已经了解了LauncherViewTree中各层所负责的工作,在DragLayer中就负责对快捷图标和AppWidget等组件的拖拽工作。桌面的滑动和图标的拖拽是两项独立的工作,正常情况下我们用手指滑动桌面会触发滑动操作,而当长按一个图标时,则会触发图标的拖拽操作,此时再滑动则会拖拽图标移动而桌面不会滑动。那么这里就分两大部分来探讨:1、拖拽操作的启动。2、拖拽。

那么首先进入Launcher.onCreate()中来探究下如何激活拖拽的状态。

图标拖拽功能的激活大概可以分为六步,下面就一步一步的探究下其中的实现:

在这个方法中,主要的工作就是让图标从桌面上消失,并且显示一个图标的外部轮廓,以表明它将要放置的位置,其显示的效果如下:

显示图标的轮廓可以从视觉上给用户更加好的体验。接着,进入beginDragShared()

其中的内容很简单易懂,就是在将DragView添加到了DragLayer中,并且在合适的位置显示了出来。接着应该调用在DragController.startDrag()中调用handleMoveEvent(),这个将在后文将拖拽过程分析时在看。到这一步,拖拽操作的启动过程就完成了。接着就可以拖拽图标了。



onTouchEvent()中处理的事件涉及到不同状态之间的转换,以及每种状态之下对相应的MotionEvent的对策。这里同样,从简单的情况入手:图标拖拽起来后,移动一段距离,在屏幕的另一个位置放下。

首先,当拖拽起图标时,拖拽图标的状态被启动,这就是第一部分所探讨的内容。


handleMoveEvent()主要处理拖拽过程中需要处理的事务。包括:1、在更新图标在屏幕中的位置,并刷新UI2、判断图标当前所处的位置。包括SCROLL_OUTSIDE_ZONESCROLL_WAITING_IN_ZONE,对处于SCROLL_WAITING_IN_ZONE位置时,需要根据具体的位置,向前或向后切换显示的屏幕。再回到上面假设的情况中。则此时只是简单的刷新了位置信息,并重新绘制图标。

最后,当松开拖拽的对象时,触发了MotionEvent.ACTION_UP事件。则进入下面一段代码:


最后调用endDrag()结束拖拽过程。

至此,拖拽的图标的过程就结束了。

}

第一步、触摸事件的产生:

触摸事件由用户触摸屏幕,系统会生成一个MotionEvent触摸事件对象,里面封装了此次动作的所用信息,如时间,位置坐标等。

然后系统会将当前这个触摸事件交给当前的Activity来处理。

第二步、触摸事件的分发与处理:

父ViewGroup,将触摸事件交给他处理。

第一种是ViewGroup分发事件找到了对应的子View进行处理。

在onTouchEvent和onTouch方法中,都需要返回一个布尔类型的值,如果返回true,则说明触摸事件已经消费,不在往下传递,有拦触摸截掉事件的意义,其他子

View就不能响应到这个触摸事件,如果返回false,则说明触摸事件没有被消费,需要传递给其他子View处理。如果所有的子View都不消费这个触摸事件

一个完整触摸事件由down、move、up组成。

这里值得我注意的是:Activity分发事件是根据该View是否消费了动作为Down的触摸事件,如果没有消费,则不会向它分发动作为UP和MOVE的触摸事件。

第二种是ViewGroup分发事件没找到对应的子View进行处理。

这时事件就由ViewGroup自己处理,它会调用自身的onTouchEvent返回false,说明事件没有找到消费者,触摸事件没有被消费,move,up 动作不需要再往下分发了,

只有View消费了动作为Down的触摸事件,这个View才能响应其他两个动作的触摸事件。

说完安卓事件的分发,接下来我们就来说说图片拖动效果的实现。

第二步、拖动逻辑的实现:

2、手指在屏幕上移动,移动到一个新的位置(nowX,nowY)

3、计算手指在屏幕的偏移量

4、重新计算图片的位置,并控制范围,使图片不会超出边框

//返回true代表事件已经消费了,不需要再往下传递 //代表所有触摸事件都在这里被消费了,不再往下传递
}


2、可随意改变圆点、直线的颜色和大小;

当然,也许你会吐槽,系统不是提供了 seekBar 吗,怎么不用 seekBar。

我想说,我写这个也是一时来了兴致,因为最近在研究自定义组件,根据自己项目里的需求,自己写出来的。虽然DEMO不是很高大上,但内心还是很欣喜的。所以,还希望嘴上留情。

还是那句话,你可以不爱,但请不要伤害。

* 设置进度变化监听器 //因为是以画布Canvas 为draw对象,所以RectF构造函数内的参数是以canvas为边界,而不是屏幕 * 获取圆点的x轴坐标 * 计算触摸点的百分比

以上就是完整代码,有不懂的可以留言提问,看到就会回答的。

原创不易,转载记得附源自: 

}

我要回帖

更多关于 android在设定区域拖动 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信