我正在寻找一种方式,当用户长时间触摸一个mapview(比方说1000ms),我可以说一些特定的动作。
我如何判断用户长时间触摸mapsview(或任何视图)的时间。
它类似于Android谷歌地图应用程序,当你长时间触摸时,它会调出一个气球覆盖项目。
修改已添加
mapView.setOnLongClickListener(new View.OnLongClickListener() {
public boolean onLongClick(View v) {
Toast.makeText(mapView.getContext(), "Hello 123", 2000);
return false;
}
});
以上不起作用......任何想法为什么?
这就是我现在正在尝试的,但它似乎不起作用,即使我只按手机,它说这个事件是一个action_move,
我在MapActivity中使用内部类
private long startTime=0;
private long endTime=0;
class MapOverlay extends Overlay {
@Override
public boolean onTouchEvent(MotionEvent ev, MapView mapView) {
if(ev.getAction() == MotionEvent.ACTION_DOWN){
//record the start time
startTime = ev.getEventTime();
Log.d("LC", "IN DOWN");
}else if(ev.getAction() == MotionEvent.ACTION_UP){
//record the end time
endTime = ev.getEventTime();
Log.d("LC", "IN UP");
}else if(ev.getAction() == MotionEvent.ACTION_MOVE){
Log.d("LC", "IN move");
endTime=0;
}
//verify
if(endTime - startTime > 1000){
//we have a 1000ms duration touch
//propagate your own event
Log.d("LC", "time touched greater than 1000ms");
Toast.makeText(getBaseContext(), "Hello 123", Toast.LENGTH_SHORT).show();
startTime=0;
endTime=0;
return true; //notify that you handled this event (do not propagate)
}
return false;//propogate to enable drag
}
}
这是我的错误日志对我没有任何意义
06-29 14:29:55.509: DEBUG/LC(7693): IN move
06-29 14:29:56.149: DEBUG/LC(7693): IN UP
06-29 14:29:56.149: DEBUG/LC(7693): 6346707 6349261
06-29 14:29:56.149: DEBUG/LC(7693): time touched greater than 1000ms
结束时间应该设置为零...但它不是......任何想法为什么?
答案 0 :(得分:8)
这是你通常如何创建onLongClickListener。试试这个:
mapView.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View arg0) {
Toast.makeText(mapView.getContext(), "Hello 123", 2000);
return false;
}
});
参考您的修改:
这可能是获得你想要的东西的方法。
private final Handler handler = new Handler();
private final Runnable runnable = new Runnable() {
public void run() {
checkGlobalVariable();
}
};
// Other init stuff etc...
@Override
public void onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
// Execute your Runnable after 1000 milliseconds = 1 second.
handler.postDelayed(runnable, 1000);
mBooleanIsPressed = true;
}
if(event.getAction() == MotionEvent.ACTION_UP) {
if(mBooleanIsPressed) {
mBooleanIsPressed = false;
handler.removeCallbacks(runnable);
}
}
}
现在你可以查看checkGlobalVariable函数:
if(mBooleanIsPressed == true)
这是你如何处理这种情况。祝你好运。
答案 1 :(得分:4)
您可能正在寻找正常的长按? 您必须通过将android:longClickable添加到视图xml或通过调用setLongClickable(true)来将视图设置为可长时间点击。 然后,您可以向视图添加OnLongClickListener。 我不知道确定长按一下多长时间的方法。但默认长按与您提到的谷歌地图长按相同。
答案 2 :(得分:2)
您可以设置longClickListener和touchListener。添加一个布尔类数据成员变量longClicked并最初将其设置为false。这是您设置longClickListener的方法。
view.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
longClicked = true;
return false;
}
});
对于touchListener
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(longClicked){
//Do whatever you want here!!
longClicked = false;
}
return false;
}
});
它将为您提供与谷歌地图长按相同的效果。希望它有所帮助。
答案 3 :(得分:1)
使用System.currentTimeMillis()
代替ev.getEventTime();
答案 4 :(得分:0)
当MotionEvent.ACTION_UP
,endTime
设置为ev.getEventTime()时,如果endTime
不受影响,则会将MotionEvent.ACTION_MOVE
设置为零。
您应该将endTime
设置为ev.getEventTime()
startTime
设置为零。