google map 에서 움직이는 마커 사용하기

반응형

[출처] https://exceptionshub.com/rotate-marker-and-move-animation-on-map-like-uber-android-2.html


아래 소스는 출력된 마커를 터치하면 목적지까지 부드럽게 마커가 이동하는 소스입니다.

(녹색 부분 제외하면 터치 없이 실행 됩니다)

어렵게 구했습니다.. ㅜ.ㅜ

목적에 맞게 수정해서 사용하면 됩니다.



1. onCreate 에서


SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);

mapFragment.getMapAsync(this);



2. onMapReady 에서


@Override

    public void onMapReady(final GoogleMap googleMap) {


        mMap = googleMap;


        final LatLng SomePos = new LatLng(37.52487, 126.92723); // 시작 지점


        try {

            googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); // 지도 타입

            googleMap.setMyLocationEnabled(true); // 내 위치 표시

            googleMap.setTrafficEnabled(false); // 교통정보 레이어

            googleMap.setIndoorEnabled(false); // 실내 지도 여부. 향후 normal 지도 유형에서만 지원 예정

            googleMap.setBuildingsEnabled(true); // 건물 표시

            googleMap.getUiSettings().setZoomControlsEnabled(true); // 줌 컨트롤러 표시 (확대, 축소)

            googleMap.moveCamera(CameraUpdateFactory.newLatLng(SomePos));

            googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(new CameraPosition.Builder()

                    .target(googleMap.getCameraPosition().target)

                    .zoom(17)

                    .bearing(30) // 지도를 돌려서 보기 (각도)

                    .tilt(45) // 지도를 눞여서 보기 (각도)

                    .build()));


            // 마커 이미지 및 사이즈 변경

            int height = 200;

            int width = 200;

            BitmapDrawable bitmapdraw = (BitmapDrawable)getResources().getDrawable(R.drawable.img_marker);

            Bitmap b = bitmapdraw.getBitmap();

            Bitmap smallMarker = Bitmap.createScaledBitmap(b, width, height, false);


            final Marker myMarker = googleMap.addMarker(new MarkerOptions()

                    .position(SomePos)

                    .icon(BitmapDescriptorFactory.fromBitmap(smallMarker))

                    .title("Hello world"));


            googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {

                @Override

                public boolean onMarkerClick(Marker arg0) {


                    final LatLng startPosition = myMarker.getPosition();

                    final LatLng finalPosition = new LatLng(37.62487, 127.02723); // 끝 지점

                    final Handler handler = new Handler();

                    final long start = SystemClock.uptimeMillis();

                    // AccelerateDecelerateInterpolator 는 마커 이동 유형 (움직이는 스타일)

                    //final Interpolator interpolator = new AccelerateDecelerateInterpolator();

                    final float durationInMs = 4000; // 이동 시간 (ms)


                    handler.post(new Runnable() {

                        long elapsed;

                        float t;


                        @Override

                        public void run() {

                            // Calculate progress using interpolator

                            elapsed = SystemClock.uptimeMillis() - start;

                            t = elapsed / durationInMs;


                            LatLng currentPosition = new LatLng(

                                    startPosition.latitude * (1 - t) + finalPosition.latitude * t,

                                    startPosition.longitude * (1 - t) + finalPosition.longitude * t);


                            myMarker.setPosition(currentPosition);


                            // Repeat till progress is complete.

                            if (t < 1) {

                                // Post again 16ms later.

                                handler.postDelayed(this, 16);

                            }

                        }

                    });

                    return true;

                }

            });


        } catch (Exception e) {

            e.printStackTrace();

        }


    } 



반응형

댓글()