在此功能中,我要实现“如果长按,则返回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;
}
`
但是当我长按磁贴时它不起作用。它正在执行“打开图块”。
如何更正功能?我是初学者。也许这是一个非常简单的问题,但这已经困扰了我很长时间。
答案 0 :(得分:0)
每个扩展android.view.View
的Android组件都将具有这两种方法。
View.setOnClickListener()
(如果单击)。
View.setOnLongClickListener()
(如果您长按)。确保它的View.isLongClickable()
返回true,或者通过调用View.setLongClickable(true)
进行设置。
答案 1 :(得分:0)
因为您要对下拉菜单做出反应并显示对话框。由于您要立即对下降事件做出反应,因此您无需等待它是否被长时间按下。这就是为什么android中的触摸事件通常会在up事件上发生的原因-因此您可以确定触摸是否将是按动,长按,手势等。
另外,正如另一位发布者所说,事件中内置了click和long clock。除非您想捕获更复杂的行为,否则没有理由编写onTouchEvent。
答案 2 :(得分:0)
计算ACTION_DOWN和ACTION_UP之间的时间差。如果时间差大于1000毫秒,则返回true,否则打开图块。