检测长按并按

时间:2018-06-24 14:30:41

标签: java android

在此功能中,我要实现“如果长按,则返回flag = true,否则打开磁贴”。

 public boolean onTouchEvent(MotionEvent event) {
        int x=(int)event.getX();
        int y=(int)event.getY();
        long DownTime = event.getDownTime();
        long UpTime = event.getEventTime();
        long longPresstouch = UpTime - DownTime;
        int idxX=(x-mine.x)/mine.tileWidth;
        int idxY=(y-mine.y)/mine.tileWidth;
        if(longPresstouch > longTouchTime)
        {
            if(x>=mine.x&&y>=mine.y&&x<=(mine.mapWidth+mine.x)&&y<=(mine.y+mine.mapHeight)) {
                mine.setflag(new Mine.Point(idxX, idxY), true);
                invalidate();
            }
        }
        else if(event.getAction()==MotionEvent.ACTION_DOWN){
            if(x>=mine.x&&y>=mine.y&&x<=(mine.mapWidth+mine.x)&&y<=(mine.y+mine.mapHeight))  //in tile or out tile
            {
                mine.open(new Mine.Point(idxX,idxY),isFirst);
                isFirst=false;

                if(mine.tile[idxY][idxX].value==-1)
                {
                    mine.isDrawAllMine=true;
                    new AlertDialog.Builder(context)
                            .setCancelable(false)
                            .setMessage("GameOver,你踩到地雷啦!")
                            .setPositiveButton("再来一局", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    mine.init();
                                    isFalse=true;
                                    isFirst=true;
                                    invalidate();
                                }
                            })
                            .setNegativeButton("退出游戏", new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    System.exit(0);
                                }
                            })
                            .create()
                            .show();
                }
                if(isFalse)
                {
                    isFalse=false;
                    invalidate();
                    return true;
                }
                logic();
                invalidate();
            }
        }
        return true;
    }

`

但是当我长按磁贴时它不起作用。它正在执行“打开图块”。

enter image description here enter image description here

如何更正功能?我是初学者。也许这是一个非常简单的问题,但这已经困扰了我很长时间。

3 个答案:

答案 0 :(得分:0)

每个扩展android.view.View的Android组件都将具有这两种方法。

  1. View.setOnClickListener()(如果单击)。

  2. View.setOnLongClickListener()(如果您长按)。确保它的View.isLongClickable()返回true,或者通过调用View.setLongClickable(true)进行设置。

答案 1 :(得分:0)

因为您要对下拉菜单做出反应并显示对话框。由于您要立即对下降事件做出反应,因此您无需等待它是否被长时间按下。这就是为什么android中的触摸事件通常会在up事件上发生的原因-因此您可以确定触摸是否将是按动,长按,手势等。

另外,正如另一位发布者所说,事件中内置了click和long clock。除非您想捕获更复杂的行为,否则没有理由编写onTouchEvent。

答案 2 :(得分:0)

计算ACTION_DOWN和ACTION_UP之间的时间差。如果时间差大于1000毫秒,则返回true,否则打开图块。