0

지도 위의 투명한 ImageView에 리스너를 설정하여 이벤트를 꼬집는 (확대) 이벤트에만 반응하도록 할 수 있습니다.지도 이동과 같은 모든 작업이 Google지도에서 처리됩니다.래퍼를 통해 Google지도를 확대/축소하면됩니까?

내 목표는과 같이 할 수있는지도를 확대 중심으로 만드는 것입니다 :

mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(mGoogleMap.getCameraPosition().target, amountOfZoomNeeded)); 

하지만 난 먼저 핀치 이벤트를 캐치하고, 아래의지도를 이용하여 onTouch 블록 이후 해당 이벤트해야합니다.

편집 : 나는 ScaleGestureDetectors onScale를 사용 확대를 중심으로 작성하려면 관리() 메소드

:

public class PinchListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 

    private GoogleMap googleMap; 

    public PinchListener(GoogleMap googleMap){ 
     this.googleMap = googleMap; 
    } 


    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     double zoom = googleMap.getCameraPosition().zoom; 
     zoom = zoom + Math.log(detector.getScaleFactor())/Math.log(1.5d); 
     CameraUpdate update = CameraUpdateFactory.newLatLngZoom(googleMap.getCameraPosition().target, (float) zoom); 

     googleMap.moveCamera(update); 
     return true; 
    } 
} 

그리고 내 MainActivity에 내가 mMapWrapper 내가 언급 투명 이미지 뷰 래퍼이고, 초기화 일찍이.

ScaleGestureDetector mScaleGestureDetector = new ScaleGestureDetector(this, new PinchListener(mGoogleMap)); 

mMapWrapper.setOnTouchListener(new View.OnTouchListener(){ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     mScaleGestureDetector.onTouchEvent(event); 
     return true; 
    } 
}); 

하지만 지금은 모든 터치 이벤트가 onTouch() 래퍼의 방법으로 먹히고 때문에 내가지도를 이동할 수없는 문제에 직면하고있다. 어떻게 이런 일이 일어나지 않도록 할 수 있습니까?

+0

[this] (https://stackoverflow.com/a/46372495/6950238) 답변보기 –

답변

0

이렇게 내가 어떻게 관리 할 수 ​​있습니다.

public class PinchListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 

    private GoogleMap mGoogleMap; 

    public PinchListener(GoogleMap googleMap) { 
     this.mGoogleMap = googleMap; 
    } 

    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     double zoom = mGoogleMap.getCameraPosition().zoom; 
     zoom = zoom + Math.log(detector.getScaleFactor())/Math.log(1.5d); 
     CameraUpdate update = CameraUpdateFactory.newLatLngZoom(mGoogleMap.getCameraPosition().target, (float) zoom); 
     mGoogleMap.moveCamera(update); 
     return true; 
    } 
} 

public class GestureListener extends GestureDetector.SimpleOnGestureListener { 

    private GoogleMap mGoogleMap; 
    private boolean mIsInAnimation; 

    public GestureListener(GoogleMap googleMap) { 
     this.mGoogleMap = googleMap; 
     mIsInAnimation = false; 
    } 

    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     LatLng target = mGoogleMap.getCameraPosition().target; 
     Point screenPoint = mGoogleMap.getProjection().toScreenLocation(target); 
     Point newPoint = new Point(screenPoint.x + (int) distanceX, screenPoint.y + (int) distanceY); 
     LatLng mapNewTarget = mGoogleMap.getProjection().fromScreenLocation(newPoint); 

     CameraUpdate update = CameraUpdateFactory.newLatLngZoom(
       mapNewTarget, mGoogleMap.getCameraPosition().zoom); 
     mGoogleMap.moveCamera(update); 
     return true; 
    } 

    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     mGoogleMap.animateCamera(CameraUpdateFactory.zoomIn(), 400, null); 
     return true; 
    } 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     if (mIsInAnimation) return false; 
     int velocity = (int) Math.sqrt(velocityX * velocityX + velocityY * velocityY); 
     if (velocity < 500) return false; 
     double k1 = 0.002d; /*exipemental*/ 
     double k2 = 0.002d;/*exipemental*/ 

     LatLng target = mGoogleMap.getCameraPosition().target; 
     Point screenPoint = mGoogleMap.getProjection().toScreenLocation(target); 

     Point newPoint = new Point(screenPoint.x - (int) (velocityX * k1), 
       screenPoint.y - (int) (velocityY * k1)); 
     LatLng mapNewTarget = mGoogleMap.getProjection().fromScreenLocation(newPoint); 

     CameraUpdate update = CameraUpdateFactory.newLatLngZoom(
       mapNewTarget, mGoogleMap.getCameraPosition().zoom); 

     tryUpdateCamera(update, (int) (velocity * k2)); 
     return true; 
    } 

    private void tryUpdateCamera(CameraUpdate update, int animateTime) { 
     mIsInAnimation = true; 
     mGoogleMap.animateCamera(update, animateTime, new GoogleMap.CancelableCallback() { 
      @Override 
      public void onFinish() { 
       mIsInAnimation = false; 
      } 

      @Override 
      public void onCancel() { 
       mIsInAnimation = false; 
      } 
     }); 
    } 
} 

내가 다음 내 MainActivity에서 GestureDetector 및 ScaleGestureDetector 초기화 :

나는 날뛰는, 더블 탭, 스크롤 (드래그)와 규모 (줌)과 같은 특정 이벤트를 검출하기위한 두 개의 클래스를 생성
ScaleGestureDetector mScaleGestureDetector = new ScaleGestureDetector(this, new PinchListener(mMap)); 
GestureDetector mGestureDetector = new GestureDetector(this, new GestureListener(mMap)); 

이미 다음과 같이 아래 구글지도에 그들을 모두 이러한 이벤트를 감지 한 후 시뮬레이션 내 activity_main에 투명한 이미지 래퍼를 만들어 낸 :

내가 원하는 이벤트 권리 검출기를 "공급"의 마지막 단계에서

mMapWrapper = findViewById(R.id.mapWrapper); 

mMapWrapper.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      switch (event.getAction() & MotionEvent.ACTION_MASK) { 
       case MotionEvent.ACTION_DOWN: 
        mMode = Mode.DRAG; 
        mGestureDetector.onTouchEvent(event); 
        mScaleGestureDetector.onTouchEvent(event); 
        break; 
       case MotionEvent.ACTION_POINTER_DOWN: 
        mMode = Mode.ZOOM; 
        mScaleGestureDetector.onTouchEvent(event); 
        break; 
       case MotionEvent.ACTION_UP: 
       case MotionEvent.ACTION_POINTER_UP: 
        mMode = Mode.NONE; 
        mGestureDetector.onTouchEvent(event); 
        break; 
       case MotionEvent.ACTION_MOVE: 
        if (mMode == Mode.DRAG) { 
         mGestureDetector.onTouchEvent(event); 
        } else if (mMode == Mode.ZOOM) { 
         mScaleGestureDetector.onTouchEvent(event); 
        } 
        break; 
      } 

      return true; 
     } 
    }); 

: 다음 21,

그리고 마침내 내 MainActivity에서 나는 래퍼에 대한 OnTouchListener를 만들었습니다. 만약 내가하지 않았다면 줌은 onScroll (Drag) 이벤트가 호출되어지도를 움직일 수 있기 때문에 완전히 중앙에 위치하지 않을 것입니다.