지도에 다각형 그리기

이 예시에서는 지도에서 다양한 모양 및 색상의 다각형을 그립니다.

자세한 내용은 문서를 참고하세요.

시작하기

샘플 코드를 사용하기 전에 개발 환경을 구성해야 합니다. 자세한 내용은 Android용 Maps SDK 코드 샘플을 참고하세요.

코드 보기

KotlinJava


override fun onCreate(savedInstanceState: Bundle?) {
   
super.onCreate(savedInstanceState)
    setContentView
(R.layout.polygon_demo)

    fillHueBar
= findViewById<SeekBar>(R.id.fillHueSeekBar).apply {
        max
= MAX_HUE_DEGREES
        progress
= MAX_HUE_DEGREES / 2
   
}

    fillAlphaBar
= findViewById<SeekBar>(R.id.fillAlphaSeekBar).apply {
        max
= MAX_ALPHA
        progress
= MAX_ALPHA / 2
   
}

    strokeWidthBar
= findViewById<SeekBar>(R.id.strokeWidthSeekBar).apply {
        max
= MAX_WIDTH_PX
        progress
= MAX_WIDTH_PX / 3
   
}

    strokeHueBar
= findViewById<SeekBar>(R.id.strokeHueSeekBar).apply {
        max
= MAX_HUE_DEGREES
        progress
= 0
   
}

    strokeAlphaBar
= findViewById<SeekBar>(R.id.strokeAlphaSeekBar).apply {
        max
= MAX_ALPHA
        progress
= MAX_ALPHA
   
}

    strokeJointTypeSpinner
= findViewById<Spinner>(R.id.strokeJointTypeSpinner).apply {
        adapter
= ArrayAdapter(
               
this@PolygonDemoActivity, android.R.layout.simple_spinner_item,
                getResourceStrings
(jointTypeNameResourceIds))
   
}

    strokePatternSpinner
= findViewById<Spinner>(R.id.strokePatternSpinner).apply {
        adapter
= ArrayAdapter(
               
this@PolygonDemoActivity, android.R.layout.simple_spinner_item,
                getResourceStrings
(patternTypeNameResourceIds))
   
}

    clickabilityCheckbox
= findViewById(R.id.toggleClickability)

    val mapFragment
= supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
    mapFragment
.getMapAsync(this)
}

override fun onMapReady(googleMap: GoogleMap) {

   
// return early if the map was not initialised properly
    googleMap
?: return

    val fillColorArgb
= Color.HSVToColor(
            fillAlphaBar
.progress, floatArrayOf(fillHueBar.progress.toFloat(), 1f, 1f))
    val strokeColorArgb
= Color.HSVToColor(
            strokeAlphaBar
.progress, floatArrayOf(strokeHueBar.progress.toFloat(), 1f, 1f))

   
with(googleMap) {
       
// Override the default content description on the view, for accessibility mode.
        setContentDescription
(getString(R.string.polygon_demo_description))
       
// Move the googleMap so that it is centered on the mutable polygon.
        moveCamera
(CameraUpdateFactory.newLatLngZoom(center, 4f))

       
// Create a rectangle with two rectangular holes.
        mutablePolygon
= addPolygon(PolygonOptions().apply {
            addAll
(createRectangle(center, 5.0, 5.0))
            addHole
(createRectangle(LatLng(-22.0, 128.0), 1.0, 1.0))
            addHole
(createRectangle(LatLng(-18.0, 133.0), 0.5, 1.5))
            fillColor
(fillColorArgb)
            strokeColor
(strokeColorArgb)
            strokeWidth
(strokeWidthBar.progress.toFloat())
            clickable
(clickabilityCheckbox.isChecked)
       
})

       
// Add a listener for polygon clicks that changes the clicked polygon's stroke color.
        setOnPolygonClickListener
{ polygon ->
           
// Flip the red, green and blue components of the polygon's stroke color.
            polygon
.strokeColor = polygon.strokeColor xor 0x00ffffff
       
}
   
}

   
// set listeners on seekBars
    arrayOf
(fillHueBar, fillAlphaBar, strokeWidthBar, strokeHueBar, strokeAlphaBar).map {
        it
.setOnSeekBarChangeListener(this)
   
}

   
// set listeners on spinners
    arrayOf
(strokeJointTypeSpinner, strokePatternSpinner).map {
        it
.onItemSelectedListener = this
   
}

   
// set line pattern and joint type based on current spinner position
   
with(mutablePolygon) {
        strokeJointType
= getSelectedJointType(strokeJointTypeSpinner.selectedItemPosition)
        strokePattern
= getSelectedPattern(strokePatternSpinner.selectedItemPosition)
   
}

}

     

public class PolygonDemoActivity extends AppCompatActivity
       
implements OnSeekBarChangeListener, OnItemSelectedListener, OnMapReadyCallback {

   
private static final LatLng CENTER = new LatLng(-20, 130);
   
private static final int MAX_WIDTH_PX = 100;
   
private static final int MAX_HUE_DEGREES = 360;
   
private static final int MAX_ALPHA = 255;

   
private static final int PATTERN_DASH_LENGTH_PX = 50;
   
private static final int PATTERN_GAP_LENGTH_PX = 10;
   
private static final Dot DOT = new Dot();
   
private static final Dash DASH = new Dash(PATTERN_DASH_LENGTH_PX);
   
private static final Gap GAP = new Gap(PATTERN_GAP_LENGTH_PX);
   
private static final List<PatternItem> PATTERN_DOTTED = Arrays.asList(DOT, GAP);
   
private static final List<PatternItem> PATTERN_DASHED = Arrays.asList(DASH, GAP);
   
private static final List<PatternItem> PATTERN_MIXED = Arrays.asList(DOT, GAP, DOT, DASH, GAP);

   
private Polygon mutablePolygon;
   
private SeekBar fillHueBar;
   
private SeekBar fillAlphaBar;
   
private SeekBar strokeWidthBar;
   
private SeekBar strokeHueBar;
   
private SeekBar strokeAlphaBar;
   
private Spinner strokeJointTypeSpinner;
   
private Spinner strokePatternSpinner;
   
private CheckBox clickabilityCheckbox;

   
// These are the options for polygon stroke joints and patterns. We use their
   
// string resource IDs as identifiers.

   
private static final int[] JOINT_TYPE_NAME_RESOURCE_IDS = {
            R
.string.joint_type_default, // Default
            R
.string.joint_type_bevel,
            R
.string.joint_type_round,
   
};

   
private static final int[] PATTERN_TYPE_NAME_RESOURCE_IDS = {
            R
.string.pattern_solid, // Default
            R
.string.pattern_dashed,
            R
.string.pattern_dotted,
            R
.string.pattern_mixed,
   
};
   
@Override
   
protected void onCreate(Bundle savedInstanceState) {
       
super.onCreate(savedInstanceState);
        setContentView
(R.layout.polygon_demo);

        fillHueBar
= findViewById(R.id.fillHueSeekBar);
        fillHueBar
.setMax(MAX_HUE_DEGREES);
        fillHueBar
.setProgress(MAX_HUE_DEGREES / 2);

        fillAlphaBar
= findViewById(R.id.fillAlphaSeekBar);
        fillAlphaBar
.setMax(MAX_ALPHA);
        fillAlphaBar
.setProgress(MAX_ALPHA / 2);

        strokeWidthBar
= findViewById(R.id.strokeWidthSeekBar);
        strokeWidthBar
.setMax(MAX_WIDTH_PX);
        strokeWidthBar
.setProgress(MAX_WIDTH_PX / 3);

        strokeHueBar
= findViewById(R.id.strokeHueSeekBar);
        strokeHueBar
.setMax(MAX_HUE_DEGREES);
        strokeHueBar
.setProgress(0);

        strokeAlphaBar
= findViewById(R.id.strokeAlphaSeekBar);
        strokeAlphaBar
.setMax(MAX_ALPHA);
        strokeAlphaBar
.setProgress(MAX_ALPHA);

        strokeJointTypeSpinner
= findViewById(R.id.strokeJointTypeSpinner);
        strokeJointTypeSpinner
.setAdapter(new ArrayAdapter<>(
               
this, android.R.layout.simple_spinner_item,
                getResourceStrings
(JOINT_TYPE_NAME_RESOURCE_IDS)));

        strokePatternSpinner
= findViewById(R.id.strokePatternSpinner);
        strokePatternSpinner
.setAdapter(new ArrayAdapter<>(
               
this, android.R.layout.simple_spinner_item,
                getResourceStrings
(PATTERN_TYPE_NAME_RESOURCE_IDS)));

        clickabilityCheckbox
= findViewById(R.id.toggleClickability);

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

   
@Override
   
public void onMapReady(GoogleMap map) {
       
// Override the default content description on the view, for accessibility mode.
        map
.setContentDescription(getString(R.string.polygon_demo_description));

       
int fillColorArgb = Color.HSVToColor(
                fillAlphaBar
.getProgress(), new float[]{fillHueBar.getProgress(), 1, 1});
       
int strokeColorArgb = Color.HSVToColor(
                strokeAlphaBar
.getProgress(), new float[]{strokeHueBar.getProgress(), 1, 1});

       
// Create a rectangle with two rectangular holes.
        mutablePolygon
= map.addPolygon(new PolygonOptions()
               
.addAll(createRectangle(CENTER, 5, 5))
               
.addHole(createRectangle(new LatLng(-22, 128), 1, 1))
               
.addHole(createRectangle(new LatLng(-18, 133), 0.5, 1.5))
               
.fillColor(fillColorArgb)
               
.strokeColor(strokeColorArgb)
               
.strokeWidth(strokeWidthBar.getProgress())
               
.clickable(clickabilityCheckbox.isChecked()));

        fillHueBar
.setOnSeekBarChangeListener(this);
        fillAlphaBar
.setOnSeekBarChangeListener(this);

        strokeWidthBar
.setOnSeekBarChangeListener(this);
        strokeHueBar
.setOnSeekBarChangeListener(this);
        strokeAlphaBar
.setOnSeekBarChangeListener(this);

        strokeJointTypeSpinner
.setOnItemSelectedListener(this);
        strokePatternSpinner
.setOnItemSelectedListener(this);

        mutablePolygon
.setStrokeJointType(getSelectedJointType(strokeJointTypeSpinner.getSelectedItemPosition()));
        mutablePolygon
.setStrokePattern(getSelectedPattern(strokePatternSpinner.getSelectedItemPosition()));

       
// Move the map so that it is centered on the mutable polygon.
        map
.moveCamera(CameraUpdateFactory.newLatLngZoom(CENTER, 4));

       
// Add a listener for polygon clicks that changes the clicked polygon's stroke color.
        map
.setOnPolygonClickListener(new GoogleMap.OnPolygonClickListener() {
           
@Override
           
public void onPolygonClick(Polygon polygon) {
               
// Flip the red, green and blue components of the polygon's stroke color.
                polygon
.setStrokeColor(polygon.getStrokeColor() ^ 0x00ffffff);
           
}
       
});
   
}

}

     

샘플 클론 및 실행

이 샘플을 로컬로 실행하려면 Git가 필요합니다. 다음 명령어는 샘플 애플리케이션 저장소를 클론합니다.

git clone git@github.com:googlemaps-samples/android-samples.git

샘플 프로젝트를 Android 스튜디오로 가져옵니다.

  1. Android 스튜디오에서 File > New > Import Project를 선택합니다.
  2. 저장소를 저장한 위치로 이동하여 Kotlin 또는 Java를 위한 프로젝트 디렉터리를 선택합니다.

    • Kotlin: PATH-REPO/android-samples/ApiDemos/kotlin
    • Java: PATH-REPO/android-samples/ApiDemos/java
  3. 열기를 선택합니다. Android 스튜디오에서 Gradle 빌드 도구를 사용하여 프로젝트를 빌드합니다.
  4. 프로젝트의 local.properties 파일과 동일한 디렉터리에서 빈 secrets.properties 파일을 만듭니다. 자세한 내용은 프로젝트에 직접 생성한 API 키 추가하기를 참고하세요.
  5. 다음 문자열을 secrets.properties에 추가합니다(YOUR_API_KEY는 API 키의 값으로 변경).

    MAPS_API_KEY=YOUR_API_KEY
  6. 앱을 실행합니다.