【问题标题】:OnTouch in MapView only fires the first timeMapView 中的 OnTouch 仅在第一次触发
【发布时间】:2014-07-21 22:13:21
【问题描述】:

我正在尝试在我的 MapView 中实现双击缩放功能。该事件总是第一次触发,但以后不会触发。下面是我的代码。我感觉这与第一次触发事件后地图控制器丢失有关。

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 方法以将传入的 View 转换为 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 方法中的所有代码,并将其编程为简单地显示一条小的 toast 消息。

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。

我不明白为什么在这种情况下事件会正确触发,但在我之前的实现中却不会。

【问题讨论】:

    标签: android event-handling android-mapview ontouchlistener


    【解决方案1】:

    如果您正在使用此方法"mapView.setBuiltInZoomControls(true);",那么您的touch 立即生效。

    请删除该行并检查我确定它会起作用..

    在某些情况下,如果您想要 BuiltInZoomControls,那么您可以使用 OnTouch 的 Overlay 方法,如下所示..

    public class MapOverlay extends Overlay {
    
        public MapOverlay(Context ctx) {super(ctx);}
    
        @Override
        protected void draw(Canvas c, MapView osmv, boolean shadow) { }
    
        @Override
        public boolean onTouchEvent(MotionEvent e, MapView mapView) {
            //Write yout touch code here..
            return false;
        }
    }
    

    【讨论】:

    • 确实是这样,但是为什么touch事件会调用一次呢?
    • 我没有在这上面浪费时间,所以我不知道。我认为不需要 builtInZoom 按钮 bcz 地图已经支持多点触控缩放,您还可以添加自定义按钮以进行放大/缩小..
    • Overlay 类中如何与这个问题相关——mapView 和缩放控件?
    • 为了给 CapDroid 的回答添加更多内容,我创建了一个 MapOverly 实例,如上所示,并将其添加到地图的叠加层中。它像宣传的那样工作。 :)
    【解决方案2】:

    子类 MapView 并像下面那样覆盖 dispatchTouchEvent 并改用子类。

    public class MyMap extends MapView{
    @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
             if (mOnMovedListener!= null) {
                    mOnMovedListener.onMove(ev);
                }
                return super.dispatchTouchEvent(ev);
            }
        private OnMovedListener mOnMovedListener;
    
        public void setOnMovedListener(OnMovedListener mOnMovedListener) {
            this.mOnMovedListener= mOnMovedListener;
        }
    }
    

    像其他人一样注册听众!

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题 - 我无法拖动和滚动地图,因为它只接收 ACTION_DOWN 事件。可以通过将android:clickable="true"添加到MapView或调用mapView.setClickable(true)来解决。

      【讨论】:

        【解决方案4】:

        使用GestureDetector.OnDoubleTapListener 代替OnTouchListener 怎么样?

        【讨论】:

        • 感谢您的建议。我将尝试实现一个 OnDoubleTapListener 来处理此功能。不过我还是很困惑。我知道 OnDoubleTapListener 可能是处理这个问题的最佳方法,但是我发布的代码理论上应该可以工作,对吧?
        【解决方案5】:

        你至少应该放

        lasttime=event.getEventTime();
        

        if (event.getAction() == MotionEvent.ACTION_DOWN) brakes 
        

        onTouch 检测到您的点击事件ACTION_UP。所以每次点击都会被调用 2 次​​p>

        【讨论】:

          【解决方案6】:

          改为在地图视图上实现 Touch 事件。那会工作的!

              // The onTouch event of the Map itself does not fire!
              // We must implement it on the mapView!!!
              mapView.setOnTouchListener(new OnTouchListener()
              {
                  public boolean onTouch(View v, MotionEvent event) 
                  {
                      // Your code and remember to return true!                
          
                      return (true);
                  }
              });
          

          【讨论】:

            猜你喜欢
            • 2020-10-08
            • 1970-01-01
            • 2018-09-27
            • 2021-11-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多