||
为了实时的感应用户对屏幕的手指操作,安卓系统提供了onTouchEvent()方法来捕获用户操作的事件,其经常使用的有三类: ACTION_DOWN, ACTION_UP, ACTION_MOVE。
现在想要实现的效果是:当手机按住屏幕时,如果在指定的时间内没有移动,那么识别为点击图标。如果手指按住屏幕就立马移动,那么就识别为拖动图标。
一般情况下,我们想实现什么样的方法,只需要在对应的类下边编写算法即可。大概思路如下:在按下时记录 x,y坐标以及按下时间,当第一次移动的时候获取移动的时间,如果大于指定的长按时间,那么识别为点击,否则就是节点拖动。很容易,在模拟器里面实现了这 个效果,但是当在真机里面运行时,却无法实现这样的效果。原因是模拟器点击的时候能够保证在不移动鼠标的情况下不触发ACTION_MOVE,但是真机却 很敏感,几乎在ACTION_DOWN后的几毫秒之后就立马不停的ACTION_MOVE了。所以,单单从手指按下的时间长短上区分点击事件和滑动时间并 不是很理想,所以,在这里将要介绍另一种方法:通过按下后手指的位移大小来区分事件。
MotionEvent 类提供了记录当前坐标的函数(getX(),getY())和当前事件产生的时间的函数(getEventTime())以及按下时间 (getDowntime())。MotionEvent同时也提供了当前的操作类型,按下(ACTION_DOWN)、 移动 (ACTION_MOVE)、弹起 (ACTION_UP)。有了这些参数,我们便可以轻易的实现想要的效果了。
当一开始点击的时候,记录下当前的位置坐标
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
float x = 0;
float y = 0;
button = false;
if (event.getAction() == MotionEvent.ACTION_DOWN) {
x = event.getX();
y = event.getY();
for (moveNodeNum = 0; moveNodeNum < NUM; moveNodeNum++) {
if ((x < zNode[moveNodeNum].posX + TOUCHRADIUS)
&& (x > zNode[moveNodeNum].posX - TOUCHRADIUS)
&& (y < zNode[moveNodeNum].posY + TOUCHRADIUS)
&& (y > zNode[moveNodeNum].posY - TOUCHRADIUS)) {
tx = zNode[moveNodeNum].posX;
ty = zNode[moveNodeNum].posY;
当手指产生位移时候,判断位移的大小
else if (event.getAction() == MotionEvent.ACTION_MOVE) {
x = event.getX();
y = event.getY();
if ((moveNodeNum >= 0) && (moveNodeNum < NUM)) {
if (moveNodeKind == 1) {
if ((Math.abs(x - tx) > 30) || (Math.abs(y - ty) > 30)) {
button = false;
如果小于30像素的时候,认为手指只是有轻微的移动,即识别为点击,不识别为拖动,更改button 来实现效果的判断。
if (button == true) {//为真时为点击效果,为假时识别为拖动
只要在对应button的不同位置实现相应的代码即可。