2024年3月9日发(作者:)

android手势操作滑动效果触摸屏事件处理

精品文章 学分 +5

很多时候,利用触摸屏的Fling、Scroll等Gesture(手势)操作来操作会使得应

用程序的用户体验大大提升,比如用Scroll手势在 浏览器中滚屏,用Fling在阅读

器中翻页等。在Android系统中,手势的识别是通过

ureListener接口来实现的,不过William翻遍了Android的

官方文档也没有找到一个相 关的例子,API Demo中的TouchPaint也仅仅是提到了

onTouch事件的处理,没有涉及到手势。Android Developer讨论组里也有不少人有

和我类似的问题,结合他们提到的方法和我所做的实验,我将给大家简单讲述一下

Android中手势识别的实现。

我们先来明确一些概念,首先,Android的事件处理机制是基于Listener(监听器)

来实现的,比我们今天所说的触摸屏相关的事件,就是通 过onTouchListener。其次,

所有View的子类都可以通过setOnTouchListener()、 setOnKeyListener()等方法来

添加对某一类事件的监听器。第三,Listener一般会以Interface(接口)的方式来提

供,其中 包含一个或多个abstract(抽象)方法,我们需要实现这些方法来完成

onTouch()、onKey()等等的操作。这样,当我们给某个view设 置了事件Listener,

并实现了其中的抽象方法以后,程序便可以在特定的事件被dispatch到该view的时

候,通过callbakc函数给予适 当的响应。

看一个简单的例子,就用最简单的TextView来说明(事实上和ADT中生成的skeleton

没有什么区别)。

Java代码

view plaincopy to clipboardprint?

class GestureTest extends Activity implements OnTouchListener{

02.

03.@Override

ted void onCreate(Bundle savedInstanceState) {

te(savedInstanceState);

06. setContentView();

07.

08. // init TextView

09. TextView tv = (TextView) findViewById();

10.

11. // set OnTouchListener on TextView

12. ouchListener(this);

13.

14. // show some text

15. t();

16.}

17.

18.@Override

boolean onTouch(View v, MotionEvent event) {

20. xt(this, "onTouch", _SHORT).show();

21. return false;

22.}

public class GestureTest extends Activity implements OnTouchListener{

@Override

protected void onCreate(Bundle savedInstanceState) {

te(savedInstanceState);

setContentView();

// init TextView

TextView tv = (TextView) findViewById();

// set OnTouchListener on TextView

ouchListener(this);

// show some text

t();

}

@Override

public boolean onTouch(View v, MotionEvent event) {

xt(this, "onTouch", _SHORT).show();

return false;

}

我们给TextView的实例tv设定了一个onTouchListener,因为GestureTest类实

现了OnTouchListener 接口,所以简单的给一个this作为参数即可。onTouch方法

则是实现了OnTouchListener中的抽象方法,我们只要在这里添加逻辑代码即 可在

用户触摸屏幕时做出响应,就像我们这里所做的——打出一个提示信息。

这里,我们可以通过MotionEvent的getAction()方法来获取Touch事件的类型,

包括 ACTION_DOWN, ACTION_MOVE, ACTION_UP, 和ACTION_CANCEL。

ACTION_DOWN是指按下触摸屏,ACTION_MOVE是指按下触摸屏后移动受力点,

ACTION_UP则是指松 开触摸屏,ACTION_CANCEL不会由用户直接触发(所以不

在今天的讨论范围,请参考rceptTouchEvent(MotionEvent))。借

助对于用户不同操作的判断,结合getRawX()、getRawY()、getX()和getY()等方法

来获取坐标后,我们可以实现诸如拖动某一个按钮,拖动滚动条等功能。待机可以看

看MotionEvent类的文档,另外也可以看考TouchPaint例子。

回到今天所要说的重点,当我们捕捉到Touch操作的时候,如何识别出用户的

Gesture?这里我们需要ureListener接口的帮助,于是我们

的GestureTest类就变成了这个样子。

Java代码

view plaincopy to clipboardprint?

class GestureTest extends Activity implements OnTouchListener,

02. OnGestureListener {

03.....

04.}

public class GestureTest extends Activity implements OnTouchListener,

OnGestureListener {

....

}

随后,在onTouch()方法中,我们调用GestureDetector的onTouchEvent()方法,