Android触摸事件MotionEvent详解

Android触摸事件MotionEvent详解

在Android开发中,触摸事件是常见的一种输入方式。触摸事件的处理是基于Android的整体架构设计的,这是因为Android的UI是基于事件驱动的。而触摸事件的主要处理对象就是MotionEvent。

MotionEvent类是Android系统中用来表示用户触摸事件的一个类,它记录了用户的触摸动作信息。每个MotionEvent对象都包含有关一个完整动作序列和动作发生时的状态信息。

MotionEvent中包含的主要信息有序列号、动作类型、时间戳、触点数量和触点坐标等。通过这些信息,我们可以了解用户的触摸动作信息,从而实现各种各样的交互操作。

一、MotionEvent中的基础内容

MotionEvent中主要包含以下基本信息:

1. 序列号:每个MotionEvent事件都有其唯一的序列号,用于标识当前的事件序列。

2. 动作类型:MotionEvent事件包含多个事件动作类型,每个动作类型对应不同的操作。例如ACTION_DOWN表示按下事件,ACTION_UP表示松开事件,ACTION_MOVE表示移动事件等。

3. 时间戳:MotionEvent事件的发生时间。

4. 手指数目:某些事件可能涉及多个手指,这里记录手指的数量。

5. 坐标信息:涉及到触摸事件,那么就肯定会包含坐标信息,MotionEvent事件也不例外。 MotionEvent提供了多种方式获取坐标信息,可以通过Raw坐标、Translated坐标、Axis坐标等方式获取。

二、MotionEvent中的动作类型

1. ACTION_DOWN: 手指按下事件。一般在按下动作时才会触发此事件。

2. ACTION_UP: 手指松开事件。在手指离开屏幕时候触发此事件。

3. ACTION_MOVE:手指移动事件。手指在屏幕上移动时触发,该事件方法会执行多次。

4. ACTION_CANCEL:事件被取消。在用户操作过程中,当前事件被中断或者取消时候会触发此事件。

5. ACTION_OUTSIDE:手指移动到当前控件外部。手指按下当前控件后在该控件外部移动会触发此事件。

6. ACTION_POINTER_DOWN:除第一个点外,其他的点按下事件,例如多点触控效果等。在多点触摸时,这个事件与ACTION_DOWN事件不同,它的事件方法只会执行一次。

7. ACTION_POINTER_UP:除最后一个点外,其他的松开操作。

三、MotionEvent中的坐标信息

在MotionEvent事件中,坐标信息是至关重要的。通过MotionEvent提供的方法,可以获取Raw坐标、Translated坐标、Axis坐标等多种坐标信息。

1. Raw坐标

Raw坐标是相对于屏幕左上角的绝对坐标。可以通过getX()和getY()方法获取当前点击事件的坐标信息。

例如:

```

public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {

Log.i("Raw坐标", "Raw坐标为: (" + event.getRawX() + ", " + event.getRawY() + ")");

return true;

}

return super.onTouchEvent(event);

}

```

2. Translated坐标

Translated坐标是相对于视图的左上角的坐标。可以通过getX()和getY()方法获取当前点击事件的坐标信息。

例如:

```

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

Log.i("Translated坐标", "Translated坐标为: (" + event.getX() + ", " + event.getY() + ")");

return true;

default:

break;

}

return super.onTouchEvent(event);

}

```

3. Axis坐标

Axis坐标包括水平坐标轴和垂直坐标轴。通过getAxisValue()方法获取某个轴的坐标值。

例如:

```

public boolean onTouchEvent(MotionEvent event)

{

switch (event.getAction())

{

case MotionEvent.ACTION_DOWN:

Log.i("Axis坐标", "Axis坐标为: (" + event.getAxisValue(MotionEvent.AXIS_X) + ", " + event.getAxisValue(MotionEvent.AXIS_Y) + ")");

return true;

default:

break;

}

return super.onTouchEvent(event);

}

```

四、MotionEvent中的事件处理

在应用中,常常需要判断当前触摸事件是属于按下、移动、松开、取消等操作。其中,ACTION_MOVE事件方法由于方法会执行多次,因此我们可以在该事件方法中实现滑动的效果。

1. 判定当前触摸事件动作类型

判断当前触摸事件类型时,可以通过event.getAction()获取到,获取到的是一个整数标识,将其与MotionEvent中提供的常量值进行比较来判断具体的触摸事件。

例如:

```

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

//处理按下事件

break;

case MotionEvent.ACTION_MOVE:

//处理移动事件

break;

case MotionEvent.ACTION_CANCEL:

//处理事件取消事件

break;

case MotionEvent.ACTION_UP:

//处理松开事件

break;

}

return super.onTouchEvent(event);

}

```

2. 处理移动事件

移动事件是指用户手指按下时,拖动屏幕的事件。在处理移动事件时,可以通过event.getX()和event.getY()获取当前触摸点的坐标信息,然后再根据业务需求来自定义操作。

例如:

```

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

// 按下

break;

case MotionEvent.ACTION_MOVE:

// 移动

float deltaX = event.getX() - lastX; // 当前触摸点与上一次触摸点X轴距离

float deltaY = event.getY() - lastY; // 当前触摸点与上一次触摸点Y轴距离

// 自定义逻辑实现,如水平滑动图片,改变音量进度条等等

break;

case MotionEvent.ACTION_UP:

// 抬起

break;

}

return true;

}

```

五、总结

以上便是 Android触摸事件MotionEvent详解的全部内容。在应用中,通过了解MotionEvent的相关内容,可以轻松实现各种各样的触摸交互效果,从而更好地提升用户体验,开发出更加优秀的 Android 应用。


点赞(48) 打赏
如果你喜欢我们的文章,欢迎您分享或收藏为众码农的文章! 我们网站的目标是帮助每一个对编程和网站建设以及各类acg,galgame,SLG游戏感兴趣的人,无论他们的水平和经验如何。我们相信,只要有热情和毅力,任何人都可以成为一个优秀的程序员。欢迎你加入我们,开始你的美妙旅程!www.weizhongchou.cn

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部