728x90
전 포스팅을 안보셨다면 먼저 보시는 것을 추천드립니다.
전 포스팅과는 좀 다르게 Loading Activity와 MainActivity를 나눠 구성하였습니다.
Loading Activity는 2개의 ArrayList를 MainActivity로 넘기고 있습니다.
- ArrayList<Clinic> clinics : 선별진료소 xml을 파싱하여 병원 정보를 가지고 있는 Clinic 객체 ArrayList
- ArrayList<Location> clinic_address : 파싱한 데이터에서 주소값만 불러와 위도,경도의 값을 가지는 Location 객체만 따로 가지는 Location ArrayList
public class LoadingActivity extends AppCompatActivity {
final String TAG = "LoadingActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loading);
ArrayList<Clinic> clinics = xml_parse();
ArrayList<Location> clinic_address = new ArrayList<Location>();
for(int i = 0 ; i < clinics.size(); i++) {
Log.d(TAG, "convert");
clinic_address.add(addrToPoint(this, clinics.get(i).getAddress()));
} // 병원 주소만 위도경보로 변환하여 모아놓음
Intent intent = new Intent(LoadingActivity.this, MainActivity.class);
intent.putExtra("clinic", clinics);
intent.putExtra("clinic_addr", clinic_address);
startActivity(intent);
}
private ArrayList<Clinic> xml_parse() {
...
}
public static Location addrToPoint(Context context, String addr) {
...
}
}
다음으로 MainActivity입니다.
클러스터를 사용중이라 확대, 축소 시에만 마커가 다시 로딩됩니다.
public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
private GoogleMap mgoogleMap;
private ClusterManager<MyItem> clusterManager;
ArrayList<Clinic> clinics;
ArrayList<Location> clinic_address;
Context context = this;
final String TAG = "LogMainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
clinics = (ArrayList<Clinic>)getIntent().getSerializableExtra("clinic");
clinic_address = (ArrayList<Location>)getIntent().getSerializableExtra("clinic_addr");
SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
supportMapFragment.getMapAsync(this);
}
@Override
public void onMapReady(final GoogleMap googleMap) {
mgoogleMap = googleMap;
clusterManager = new ClusterManager<>(this,mgoogleMap);
mgoogleMap.setOnCameraIdleListener(clusterManager);
mgoogleMap.setOnMarkerClickListener(clusterManager);
mgoogleMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
@Override
public void onMapLoaded() {
Log.d(TAG, "Load");
LatLng latLng = new LatLng(37.5318247,126.8368475);
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 15);
mgoogleMap.moveCamera(cameraUpdate);
} // 처음 구글맵이 로딩되면 서울시청으로 화면을 고정
});
mgoogleMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
@Override
public void onCameraMove() {
VisibleRegion vr = mgoogleMap.getProjection().getVisibleRegion();
double left = vr.latLngBounds.southwest.longitude;
double top = vr.latLngBounds.northeast.latitude;
double right = vr.latLngBounds.northeast.longitude;
double bottom = vr.latLngBounds.southwest.latitude;
Log.d(TAG, "left = " + String.valueOf(left) +
"top = " + String.valueOf(top) +
"right = " + String.valueOf(right) +
"bottom = " + String.valueOf(bottom) + "\n");
if(clusterManager != null) clusterManager.clearItems();
findMarker(left, top, right, bottom);
} // 카메라 시점 이동
});
} // 구글맵 사용
public void findMarker(double left, double top, double right, double bottom) {
for(int i = 0; i < clinic_address.size(); i++) {
if(clinic_address.get(i).getLongitude() >= left && clinic_address.get(i).getLongitude() <= right) {
if(clinic_address.get(i).getLatitude() >=bottom && clinic_address.get(i).getLatitude() <= top) {
Location location = clinic_address.get(i);
MyItem clinicItem = new MyItem(location.getLatitude(), location.getLongitude(),
clinics.get(i).getName());
clusterManager.addItem(clinicItem);
}
}
}
} // 경도와 위도 범위 안에 있는 주소정보를 찾아 마커를 추가
}
728x90
'Programming > Android' 카테고리의 다른 글
Maria DB ↔ PHP ↔ Android 연동하기 - 5. 어플에서 php로 데이터 전송 (2) | 2020.03.24 |
---|---|
Maria DB ↔ PHP ↔ Android 연동하기 - 4. JSON 파싱하기 (0) | 2020.03.22 |
안드로이드 스튜디오 구글 맵 마커 묶어보여주기(클러스터 사용하기) (0) | 2020.03.09 |
안드로이드 스튜디오 구글 맵에 마커 넣기 (15) | 2020.03.09 |
안드로이드 스튜디오 다른액티비티로 ArrayList<Object> 보내기 (2) | 2020.03.08 |