注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
farsight2009的个人空间 https://home.eeworld.com.cn/space-uid-138607.html [收藏] [复制] [分享] [RSS]
日志

安卓中区分点击事件和滑动事件

已有 10098 次阅读2014-8-29 15:30 |个人分类:Android| android, 安卓, 点击事件, 滑动事件

为了实时的感应用户对屏幕的手指操作,安卓系统提供了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的不同位置实现相应的代码即可。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章