8

경로에 속한 포인트 목록과 함께 MapView (새 API v2)를 사용합니다. 그들은 꽤 가깝다. 내 문제는 내가 할 경우 애니메이션 단계지도 뷰에서 카메라 경로 부드럽게 애니메이션하기

 mMapInstance.animateCamera(CameraUpdateFactory.newLatLng(mNextPosition),ms, null); 

카메라맨은 용맹 한 메뚜기처럼 행동하고, 밖으로 프라이팬과 exaggerately의를 호출하고있는 과정에서 알 슬라이드 캐시 @ ## @ # @ # 얻는다!

경로에 애니메이션을 적용하고 균일 한 스크롤링 경험을 얻는 가장 좋은 방법은 무엇입니까? 속도는 문제가되지 않습니다. 저속을 사용합니다. 부드러움에 관심이 있습니다 ...

지도를 아름답게 표현할 수 있다면지도로 시뮬레이션 할 수 있다면 행복 할 것입니다. 주변에 많은 타일이 있습니다. 그러나 프로그래밍 방식으로지도를 움직이면 대담한 애니메이션, 흰색 화면, 타일을 다시로드합니다.

미리 감사드립니다.

답변

1

글쎄, 내가 더 나은 대답을 해주기를 바란다. 그러나 나는 많은 실험을 통해 animateCamera를 사용하여 매끄러운 두루마리를 얻을 수 없었다.

가까운 지점의 위도/경도를 변경하는 것과 관계없이 카메라맨은 인상적인 이륙과 착륙을 계속했습니다. 다음 임의의 비행 애니메이션을 만들고,

private void animateTo(double lat, double lon, double zoom, double bearing, double tilt, final int milliseconds) { 

     if (mMapInstance==null) return; 
     mMapInstance.setMapType(paramMapMode); 
     mCurrentPosition=new LatLng(lat,lon); 

     // animate camera jumps too much 
     // so we set the camera instantly to the next point 

     mMapInstance.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition(mCurrentPosition,(float)zoom, (float)tilt, (float)bearing))); 

     // give Android a break so it can load tiles. If I start the animation 
     // without pause, no tile loading is done 

     mMap.postDelayed(new Runnable(){ 
      @Override 
      public void run() { 
       // keeping numbers small you get a nice scrolling effect 
       mMapInstance.animateCamera(CameraUpdateFactory.scrollBy(250-(float)Math.random()*500-250, 250-(float)Math.random()*500),milliseconds,null); 

      }},500); 

    } 

이 루틴은 젯 10000s 밀리 초 값으로 호출 한 지점으로 이동 : 나는 다음과 같은 루틴 제한 '값싼'애니메이션의 성공이 있었다

젠장 줌 tranquilo 유지 방향. 픽셀 값이 매우 작기 때문에 은 모두 캐시됩니다.

더 나은 해결책을 가진 사람이 있습니까? '터치 된'핑핑을 시뮬레이션하기 위해 터치 이벤트를 주입하는 것이 합리적이고 가능한가요?

+4

을! –

4

재귀 솔루션을 명시하는 선택적 매개 변수로 선택적 콜백을 사용하면 부드러운 애니메이션이 제공된다는 것을 알게되었습니다. 이 코드를 확대하고 파노라마 스핀의 각도를 변경 한 다음 다시 확대합니다. 그것은 초기 매개 변수와 초기 콜백이 동일 할 때 그것을 좋아하지 않는다. 나는 재귀를 호출하는 더 나은 방법이있을거야, 그러나 희망이 당신에게 당신이 기능적으로 애니메이션을 적용 할 수있는 방법의 아이디어를 제공 할 수 있습니다 : 당신은`MMAP에 postDelayed을()`호출 할 수 없습니다

//initial zoom 
static final int initZoom = 8; 
//steps the zoom 
int stepZoom = 0; 
// number of steps in zoom, be careful with this number! 
int stepZoomMax = 5; 
//number of .zoom steps in a step 
int stepZoomDetent = (18 - initZoom)/stepZoomMax; 
//when topause zoom for spin 
int stepToSpin = 4; 
//steps the spin 
int stepSpin = 0; 
//number of steps in spin (factor of 360) 
int stepSpinMax = 4; 
//number of degrees in stepSpin 
int stepSpinDetent = 360/stepSpinMax; 

Intent detailIntent; 
Intent intent; 
Marker marker; 
final int mapHopDelay = 2000; 

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.map_affirm); 
    try 
    {MapsInitializer.initialize(this);} 
    catch (GooglePlayServicesNotAvailableException impossible) 
    { /* Impossible */ Log.e(TAG, "the impossible occurred");} 
    intent = this.getIntent(); 
    latLng = new LatLng(intent.getDoubleExtra("Latitude", 0.0), intent.getDoubleExtra("Longitude", 0.0)); 
    map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap(); 
    map.animateCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.builder() 
                  .target(latLng) 
                  .zoom(initZoom-1) 
                  .build()) 
         , mapHopDelay 
         , cameraAnimation 
        ); 
    marker = map.addMarker(new MarkerOptions() 
          .draggable(true) 
          .position(latLng) 
          .title("Location of Photographer")); 

} 

public CancelableCallback cameraAnimation = new CancelableCallback(){ 

    @Override 
    public void onFinish() 
    { 
     if (stepZoom < stepZoomMax && stepZoom != stepToSpin) 
     { 
      stepZoom++; 
      map.animateCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.builder() 
                    .target(latLng) 
                    .zoom(initZoom + (stepZoomDetent * (stepZoom - 1))) 
                    // .bearing(40*aniStep) 
                    // .tilt(60) 
                    .build()), mapHopDelay, cameraAnimation); 

     } 
     else if (stepZoom >= stepZoomMax)// ending position hard coded for this application 
     {map.animateCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.builder() 
                   .target(latLng) 
                   .zoom(18) 
                   // .bearing(0) 
                   .tilt(0) 
                   .build())); 
     } 
     else 
     { 
      if (stepSpin <= stepSpinMax) 
      { 
       stepSpin++; 
       map.animateCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.builder() 
                     .target(latLng) 
                     .zoom(initZoom + stepZoomDetent * stepZoom) 
                     .bearing(stepSpinDetent * (stepSpin - 1)) 
                     .tilt(60) 
                     .build()), mapHopDelay, cameraAnimation); 
      } 
      else 
      { 
       stepZoom++; 
       map.animateCamera(CameraUpdateFactory.newCameraPosition(CameraPosition.builder() 
                     .target(latLng) 
                     .zoom(initZoom + stepZoomDetent * stepZoom) 
                     .bearing(0) 
                     .tilt(0) 
                     .build()), mapHopDelay, cameraAnimation); 
      } 
     } 
    } 

    @Override 
    public void onCancel() 
    {} 

}; 
+1

안녕하세요! 재미있는 소리, 나는 콜백을 사용하지 않은, 그것을 시도 줄거야. 코드를 게시 해 주셔서 감사합니다! – rupps

관련 문제