【问题标题】:Two finger rotation for OSMdroid mapviewOSMdroid mapview 的两指旋转
【发布时间】:2014-01-20 03:59:49
【问题描述】:

我正在尝试使用 osmdroid 为我的离线地图进行两个手指旋转。我是使用安卓地图的新手。我有一个 geoTIFF,我打算使用 NDK 提取信息,然后将其发送到 JAVA。我还需要使用 geoPoint 使用指南针与 True North Up 对齐。我该如何继续,有什么帮助吗?

我确实试过这个: Android Two finger rotation 例如,但运气不好,我的应用无法检测到任何两指事件。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());
    setContentView(R.layout.activity_main);
    mapView = (MapView)findViewById(R.id.mapview);

    //Mapview touch utilities
    mapView.setClickable(true);
    mapView.setBuiltInZoomControls(true);
    mapView.setMultiTouchControls(true);

    //set initial zoom-level, depends on your need
    mapView.getController().setZoom(nMyZoom); 

    //Display Position Overlay
    /* Itemized Overlay */
    {
            /* Create a static ItemizedOverlay showing a some Markers on some cities. */
            final ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
            items.add(new OverlayItem("Fruchthalle", "Kaiserslautern", new GeoPoint(nMyLat, nMyLong)));

            /* OnTapListener for the Markers, shows a simple Toast. */
            this.mMyLocationOverlay = new ItemizedIconOverlay<OverlayItem>(items,
                            new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() {
                                    @Override
                                    public boolean onItemSingleTapUp(final int index, final OverlayItem item) {
                                            Toast.makeText(
                                                            MainActivity.this,
                                                            "Place '" + item.getTitle()+ "' (index=" + index
                                                                            + ") got single tapped up", Toast.LENGTH_LONG).show();
                                            return true; // We 'handled' this event.
                                    }

                                    @Override
                                    public boolean onItemLongPress(final int index, final OverlayItem item) {
                                            Toast.makeText(
                                                            MainActivity.this,
                                                            "Place '" + item.getTitle() + "' (index=" + index
                                                                            + ") got long pressed", Toast.LENGTH_LONG).show();
                                            return false;
                                    }
                            }, mResourceProxy);
            this.mapView.getOverlays().add(this.mMyLocationOverlay);
    }

【问题讨论】:

    标签: android android-ndk android-mapview osmdroid


    【解决方案1】:

    您看过OpenStreetMapViewer 示例应用程序吗?那里有RotationGestureOverlay 覆盖,专门显示了如何执行此操作。它不像我想要的那样流畅,但它会完成这项工作。

    【讨论】:

      【解决方案2】:

      为简单起见,请使用以下类:

      public class RotationGestureDetector {
      
      public interface RotationListener {
          public void onRotate(float deltaAngle);
      }
      
      protected float mRotation;
      private RotationListener mListener;
      
      public RotationGestureDetector(RotationListener listener) {
          mListener = listener;
      }
      
      private float rotation(MotionEvent event) {
          double delta_x = (event.getX(0) - event.getX(1));
          double delta_y = (event.getY(0) - event.getY(1));
          double radians = Math.atan2(delta_y, delta_x);
          return (float) Math.toDegrees(radians);
      }
      
      public void onTouch(MotionEvent e) {
          if (e.getPointerCount() != 2)
              return;
      
          if (e.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) {
              mRotation = rotation(e);
          }
      
          float rotation = rotation(e);
          float delta = rotation - mRotation;
          mRotation += delta;
          mListener.onRotate(delta);
      }
      
      }
      

      和

      public class RotationGestureOverlay extends Overlay implements RotationGestureDetector.RotationListener
      {
      
      private final RotationGestureDetector mRotationDetector;
      private RotationGestureDetector.RotationListener rotationListener;
      
      
      public RotationGestureOverlay(Context context, RotationGestureDetector.RotationListener rotationListener)
      {
          super(context);
          this.rotationListener = rotationListener;
          mRotationDetector = new RotationGestureDetector(this);
      }
      
      @Override
      public boolean onTouchEvent(MotionEvent event, MapView mapView)
      {
          if (this.isEnabled()) {
              mRotationDetector.onTouch(event);
          }
          return super.onTouchEvent(event, mapView);
      }
      
      @Override
      public void onRotate(float deltaAngle)
      {
          rotationListener.onRotate(deltaAngle);
      }
      
      @Override
      public void draw(Canvas canvas, MapView mapView, boolean b) {
      
      }
      
      }
      

      添加叠加层:

      mapView.getOverlays().add(new RotationGestureOverlay(context,this);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        • 1970-01-01
        • 2013-01-23
        • 2012-05-27
        • 1970-01-01
        相关资源
        最近更新 更多