我試圖在MapView中實現雙擊縮放功能。事件總是首次發生,但從未發生過。以下是我的代碼。我有一種感覺,它與第一次事件發生後地圖控制器迷路有關。MapView中的OnTouch僅第一次觸發
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
public class mainmap extends MapActivity implements OnTouchListener{
long lasttime = -1;
MapController mapc;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
mapc = mapView.getController();
mapView.setOnTouchListener(this);
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
if(event.getEventTime()-lasttime<2000){
mapc.zoomInFixing((int)event.getX(),(int)event.getY());
}
}
lasttime=event.getEventTime();
return true;
}
}
我也嘗試編輯OnTouch方法來將傳入視圖強制轉換爲MapView,在事件被觸發時獲取控制器。但是,在第一個事件被解僱的情況下,我得到了相同的結果,但沒有後續的結果。
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
if(event.getEventTime()-lasttime<2000){
((MapView)v).getController().zoomInFixing((int)event.getX(), (int)event.getY());
}
}
lasttime=event.getEventTime();
return true;
}
儘量保持基本,我將OnTouch方法中的所有代碼剪掉,並將其編程爲僅顯示一條小吐司消息。
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
Toast.makeText(this,"Down!",Toast.LENGTH_SHORT).show();
}
return true;
}
這樣按預期工作,每次觸摸MapView時都會顯示Toast。
我不明白爲什麼事件會在這種情況下正確觸發,但不是在我以前的實施。
感謝您的建議。我會嘗試實現一個OnDoubleTapListener來處理這個功能。 雖然我仍然感到困惑。 我明白OnDoubleTapListener可能是處理這個問題的最好方法,但我發佈的理論代碼應該可行,對不對? – amandion 2010-09-08 14:05:12