google map,获取触摸点时 getZoomControls 与OnTouchListener冲突问题
今天在只有MapView的MapActivity页面使用View.OnTouchListener()遇到个问题,就是在模拟器中点击鼠标没有反应。
经过一段时间的琢磨才发现问题所在,
因为在程序中使用了map.setBuiltInZoomControls(true);
语句添加缩放图标(这里需要说明1.5之前的版本不是这样所的,之前的方法已经过期,但是下面我们要说到)
这里说一下原因
我们先来看一下鼠标按键所引起的时间顺序
当鼠标键按下时(即触摸)
首先触发dispatchTouchEvent
然后触发onUserInteraction
再次onTouchEvent
如果是点击的话,紧跟着下列事件(点击分俩步,ACTION_DOWN,ACTION_up)
触发dispatchTouchEvent
再次onTouchEvent
当ACTION_up事件时不会触发onUserInteraction(可查看源代码)
所以这时候你在页面继承OnDispathTouchEvent输出测试信息,会发现不仅仅OnTouch的事件不被触发,而且缩放的图标也无响应。再返过头来你会发现不论点击那里都是会引起缩放图标的显示。本来可以不引入缩放标志,但是从界面上来讲google自带的缩放标志比自己做的button美观也方便,但是这里原因其实很明显了,缩放图标的事件肯定阻止住了OnTouch事件,这里我想到解决办法是利用过期的API中的map.getZoomControls()方法
public class ShowState extends MapActivity{private static final String TAG = "ShowTrack";@Overrideprotected boolean isRouteDisplayed() {// TODO Auto-generated method stubreturn false;}@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.showstate); findViews(); setupMap();}private MapView map;private MapController mc;private ViewGroup zoom;/** * find the mapView and controller * * @return */private void findViews(){Log.d(TAG, "find Views");map=(MapView)findViewById(R.id.map);mc=map.getController();zoom=(ViewGroup)findViewById(R.id.zoom);zoom.addView(map.getZoomControls());}/** * set the view of map * * @return */private void setupMap(){GeoPoint stationTest=new GeoPoint((int)(25.047192*1000000) ,(int)(121.516981*1000000)); map.setStreetView(true); // map.setBuiltInZoomControls(true); mc.setZoom(18); mc.animateTo(stationTest); mc.setCenter(stationTest); map.setOnTouchListener(new View.OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubif(event.getAction()==MotionEvent.ACTION_DOWN){Log.d(TAG, "get the touch "+event.getRawX()+" "+event.getRawY());}return false;}}); }}