Android:如何捕获MapView上的平移结束

时间:2011-04-28 10:31:56

标签: android

您能否告诉我如何捕捉MapView的平移结束?一开始,我以为我可以使用MotionEvent.ACTION_UP。但是,当我的触摸快速移动时,平移动画仍在进行中,而之前已经触发了ACTION_UP事件。

1 个答案:

答案 0 :(得分:0)

我不得不想出解决这个问题的方法。似乎android SDK中没有一个方法来处理这个事件。我所做的是创建一个每200ms运行一次的计时器,并检查mapview的中心点是否已经改变。如果有,则设置一个标志。当中心点不再变化时,计时器方法知道平移何时停止(oldMapCenter == newMapCenter)。它可能不是最好的解决方案,但它对我有用。在MapActivity中插入以下代码。

注意:这不会在用户平移时更新视图,仅在AFTER。

之后
    GeoPoint newMapCenter,oldMapCenter;
    int newZoomLevel=0,oldZoomLevel=0;
    Boolean isMoving=false;
    @Override
    public void onResume() {
        super.onResume();

         autoUpdate = new Timer();
          autoUpdate.schedule(new TimerTask() {
           @Override
           public void run() {
            ((Activity) getActivity()).runOnUiThread(new Runnable() {
             public void run() {

                 if(oldMapCenter==null){
                     oldMapCenter=mapView.getMapCenter();
                 }else{
                 newMapCenter=mapView.getMapCenter();
                 if(!geoPointsAreSame(newMapCenter,oldMapCenter)&&    (!isMoving)){
                     isMoving=true;
                 }else{
                     if(geoPointsAreSame(newMapCenter,oldMapCenter)&&(isMoving)){
                          //Insert update overlay code here
                         isMoving=false;
                     }
                 }
                 oldMapCenter=newMapCenter;
                 }
                 newZoomLevel=mapView.getZoomLevel();

                 if(oldZoomLevel==0){
                     oldZoomLevel=mapView.getZoomLevel();
                 }else{
                     if(oldZoomLevel!=newZoomLevel){
                            //insert update overlay code here

                 }
             }
             oldZoomLevel=mapView.getZoomLevel();


         }
             }


            private boolean geoPointsAreSame(GeoPoint newMapCenter,
                    GeoPoint oldMapCenter) {
                if(newMapCenter.getLatitudeE6()==oldMapCenter.getLatitudeE6()){
                    if(newMapCenter.getLongitudeE6()==oldMapCenter.getLongitudeE6()){
                        return true;
                    }
                }
                return false;
                }

            });
           }
          }, 3000, 200); // updates each 200 millisecs`-