Created
April 26, 2016 00:22
-
-
Save ParkSangGwon/e3fa3af755ec6004ff1be06ffcd33b12 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.gun0912.googlemapcustommarker; | |
import android.app.Activity; | |
import android.content.Context; | |
import android.graphics.Bitmap; | |
import android.graphics.Canvas; | |
import android.graphics.Color; | |
import android.os.Bundle; | |
import android.support.v4.app.FragmentActivity; | |
import android.util.DisplayMetrics; | |
import android.view.LayoutInflater; | |
import android.view.View; | |
import android.view.ViewGroup; | |
import android.widget.TextView; | |
import com.google.android.gms.maps.CameraUpdate; | |
import com.google.android.gms.maps.CameraUpdateFactory; | |
import com.google.android.gms.maps.GoogleMap; | |
import com.google.android.gms.maps.OnMapReadyCallback; | |
import com.google.android.gms.maps.SupportMapFragment; | |
import com.google.android.gms.maps.model.BitmapDescriptorFactory; | |
import com.google.android.gms.maps.model.LatLng; | |
import com.google.android.gms.maps.model.Marker; | |
import com.google.android.gms.maps.model.MarkerOptions; | |
import java.text.NumberFormat; | |
import java.util.ArrayList; | |
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleMap.OnMarkerClickListener, GoogleMap.OnMapClickListener { | |
Marker selectedMarker; | |
View marker_root_view; | |
TextView tv_marker; | |
private GoogleMap mMap; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_maps); | |
// Obtain the SupportMapFragment and get notified when the map is ready to be used. | |
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() | |
.findFragmentById(R.id.map); | |
mapFragment.getMapAsync(this); | |
} | |
@Override | |
public void onMapReady(GoogleMap googleMap) { | |
mMap = googleMap; | |
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(37.537523, 126.96558), 14)); | |
mMap.setOnMarkerClickListener(this); | |
mMap.setOnMapClickListener(this); | |
setCustomMarkerView(); | |
getSampleMarkerItems(); | |
} | |
private void setCustomMarkerView() { | |
marker_root_view = LayoutInflater.from(this).inflate(R.layout.marker_layout, null); | |
tv_marker = (TextView) marker_root_view.findViewById(R.id.tv_marker); | |
} | |
private void getSampleMarkerItems() { | |
ArrayList<MarkerItem> sampleList = new ArrayList(); | |
sampleList.add(new MarkerItem(37.538523, 126.96568, 2500000)); | |
sampleList.add(new MarkerItem(37.527523, 126.96568, 100000)); | |
sampleList.add(new MarkerItem(37.549523, 126.96568, 15000)); | |
sampleList.add(new MarkerItem(37.538523, 126.95768, 5000)); | |
for (MarkerItem markerItem : sampleList) { | |
addMarker(markerItem, false); | |
} | |
} | |
private Marker addMarker(MarkerItem markerItem, boolean isSelectedMarker) { | |
LatLng position = new LatLng(markerItem.getLat(), markerItem.getLon()); | |
int price = markerItem.getPrice(); | |
String formatted = NumberFormat.getCurrencyInstance().format((price)); | |
tv_marker.setText(formatted); | |
if (isSelectedMarker) { | |
tv_marker.setBackgroundResource(R.drawable.ic_marker_phone_blue); | |
tv_marker.setTextColor(Color.WHITE); | |
} else { | |
tv_marker.setBackgroundResource(R.drawable.ic_marker_phone); | |
tv_marker.setTextColor(Color.BLACK); | |
} | |
MarkerOptions markerOptions = new MarkerOptions(); | |
markerOptions.title(Integer.toString(price)); | |
markerOptions.position(position); | |
markerOptions.icon(BitmapDescriptorFactory.fromBitmap(createDrawableFromView(this, marker_root_view))); | |
return mMap.addMarker(markerOptions); | |
} | |
// View를 Bitmap으로 변환 | |
private Bitmap createDrawableFromView(Context context, View view) { | |
DisplayMetrics displayMetrics = new DisplayMetrics(); | |
((Activity) context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); | |
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); | |
view.measure(displayMetrics.widthPixels, displayMetrics.heightPixels); | |
view.layout(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels); | |
view.buildDrawingCache(); | |
Bitmap bitmap = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888); | |
Canvas canvas = new Canvas(bitmap); | |
view.draw(canvas); | |
return bitmap; | |
} | |
private Marker addMarker(Marker marker, boolean isSelectedMarker) { | |
double lat = marker.getPosition().latitude; | |
double lon = marker.getPosition().longitude; | |
int price = Integer.parseInt(marker.getTitle()); | |
MarkerItem temp = new MarkerItem(lat, lon, price); | |
return addMarker(temp, isSelectedMarker); | |
} | |
@Override | |
public boolean onMarkerClick(Marker marker) { | |
CameraUpdate center = CameraUpdateFactory.newLatLng(marker.getPosition()); | |
mMap.animateCamera(center); | |
changeSelectedMarker(marker); | |
return true; | |
} | |
private void changeSelectedMarker(Marker marker) { | |
// 선택했던 마커 되돌리기 | |
if (selectedMarker != null) { | |
addMarker(selectedMarker, false); | |
selectedMarker.remove(); | |
} | |
// 선택한 마커 표시 | |
if (marker != null) { | |
selectedMarker = addMarker(marker, true); | |
marker.remove(); | |
} | |
} | |
@Override | |
public void onMapClick(LatLng latLng) { | |
changeSelectedMarker(null); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment