Thêm bản đồ đã tạo kiểu

Chọn nền tảng: Android iOS JavaScript

Bài viết này hướng dẫn bạn cách thêm bản đồ có kiểu tuỳ chỉnh vào ứng dụng Android. Hướng dẫn này dùng chế độ ban đêm làm ví dụ về định kiểu tuỳ chỉnh.

Với các lựa chọn kiểu, bạn có thể tuỳ chỉnh cách trình bày các kiểu bản đồ chuẩn của Google, thay đổi cách hiển thị trực quan của các đối tượng như đường, công viên, doanh nghiệp và các địa điểm yêu thích khác. Điều này có nghĩa là bạn có thể nhấn mạnh các thành phần cụ thể của bản đồ hoặc làm cho bản đồ bổ sung cho kiểu ứng dụng của bạn.

Tính năng định kiểu chỉ hoạt động trên loại bản đồ normal. Việc định kiểu không ảnh hưởng đến bản đồ trong nhà.

Lấy mã

Nhân bản hoặc tải kho lưu trữ Mẫu Android API phiên bản 2 của Google Maps xuống từ GitHub.

Thiết lập dự án phát triển

Làm theo các bước sau để tạo dự án hướng dẫn trong Android Studio.

  1. Tảicài đặt Android Studio.
  2. Thêm gói Dịch vụ Google Play vào Android Studio.
  3. Nhân bản hoặc tải kho lưu trữ Mẫu dành cho Android API phiên bản 2 của Google Maps xuống nếu bạn không làm việc đó khi bắt đầu đọc hướng dẫn này.
  4. Nhập dự án hướng dẫn:

    • Trong Android Studio, hãy chọn File > New > Import Project (Tệp > Mới > Nhập dự án).
    • Sau khi tải kho lưu trữ Mẫu Android API phiên bản 2 của Google Maps, hãy chuyển đến vị trí bạn đã lưu kho lưu trữ Mẫu Android API phiên bản 2.
    • Tìm dự án StyledMap tại vị trí này:
      PATH-TO-SAVED-REPO/android-samples/tutorials/StyledMap
    • Chọn thư mục dự án, sau đó nhấp vào OK. Android Studio giờ đây sẽ tạo dự án của bạn bằng công cụ xây dựng Gradle.

Lấy khoá API và bật các API cần thiết

Để hoàn tất hướng dẫn này, bạn cần có khoá API của Google được phép sử dụng SDK Maps cho Android.

Nhấp vào nút bên dưới để nhận khoá và kích hoạt API.

Mua khoá

Để biết thêm thông tin chi tiết, hãy xem hướng dẫn Lấy khoá API.

Thêm khoá API vào ứng dụng

  1. Chỉnh sửa tệp gradle.properties của dự án.
  2. Dán khoá API vào giá trị của thuộc tính GOOGLE_MAPS_API_KEY. Khi bạn xây dựng ứng dụng, Gradle sẽ sao chép khoá API vào tệp kê khai Android của ứng dụng.

    GOOGLE_MAPS_API_KEY=PASTE-YOUR-API-KEY-HERE
    

Tạo và chạy ứng dụng

  1. Kết nối thiết bị Android với máy tính. Làm theo instructions để bật tuỳ chọn cho nhà phát triển trên thiết bị Android và định cấu hình hệ thống để phát hiện thiết bị. (Ngoài ra, bạn có thể sử dụng Trình quản lý thiết bị ảo Android (AVD) để định cấu hình một thiết bị ảo. Khi chọn một trình mô phỏng, hãy nhớ chọn một hình ảnh có chứa các API của Google. Để biết thêm thông tin, hãy xem hướng dẫn bắt đầu sử dụng.)
  2. Trong Android Studio, hãy nhấp vào tuỳ chọn trình đơn Run (Chạy) (hoặc biểu tượng nút phát). Chọn một thiết bị như được nhắc.

Android Studio sẽ gọi Gradle để tạo ứng dụng, sau đó chạy ứng dụng trên thiết bị hoặc trên trình mô phỏng. Bạn sẽ thấy bản đồ có kiểu tối (chế độ ban đêm), tương tự như hình ảnh trên trang này.

Gỡ rối:

Tìm hiểu đoạn mã

Trong phần này của hướng dẫn, bạn sẽ giải thích các phần quan trọng nhất của ứng dụng StyledMap để giúp bạn hiểu cách xây dựng một ứng dụng tương tự.

Thêm tài nguyên chứa đối tượng kiểu JSON

Thêm tài nguyên vào dự án phát triển của bạn, chứa các nội dung khai báo kiểu ở định dạng JSON. Bạn có thể sử dụng tài nguyên thô hoặc chuỗi, như trong các ví dụ dưới đây.

Tài nguyên thô

Xác định tài nguyên thô trong /res/raw/style_json.json, chứa phần khai báo kiểu JSON để định kiểu chế độ ban đêm:

Tài nguyên chuỗi

Xác định tài nguyên chuỗi trong /res/values/style_strings.xml chứa nội dung khai báo kiểu JSON để định kiểu chế độ ban đêm. Hướng dẫn này sử dụng tên chuỗi style_json. Trong tệp này, bạn cần sử dụng dấu gạch chéo ngược để thoát khỏi dấu ngoặc kép:

Truyền một đối tượng kiểu JSON đến bản đồ của bạn

Để tạo kiểu cho bản đồ, hãy gọi GoogleMap.setMapStyle() truyền đối tượng MapStyleOptions chứa nội dung khai báo kiểu của bạn ở định dạng JSON.

Tài nguyên thô

Mã mẫu sau đây giả định dự án của bạn chứa một tài nguyên thô có tên style_json:

// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.example.styledmap;

import android.content.res.Resources;
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;

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.LatLng;
import com.google.android.gms.maps.model.MapStyleOptions;

/**
 * A styled map using JSON styles from a raw resource.
 */
public class MapsActivityRaw extends AppCompatActivity
        implements OnMapReadyCallback {

    private static final String TAG = MapsActivityRaw.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Retrieve the content view that renders the map.
        setContentView(R.layout.activity_maps_raw);

        // Get the SupportMapFragment and register for the callback
        // when the map is ready for use.
        SupportMapFragment mapFragment =
                (SupportMapFragment) getSupportFragmentManager()
                        .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    /**
     * Manipulates the map when it's available.
     * The API invokes this callback when the map is ready for use.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {

        try {
            // Customise the styling of the base map using a JSON object defined
            // in a raw resource file.
            boolean success = googleMap.setMapStyle(
                    MapStyleOptions.loadRawResourceStyle(
                            this, R.raw.style_json));

            if (!success) {
                Log.e(TAG, "Style parsing failed.");
            }
        } catch (Resources.NotFoundException e) {
            Log.e(TAG, "Can't find style. Error: ", e);
        }
        // Position the map's camera near Sydney, Australia.
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(-34, 151)));
    }
}

Bố cục (activity_maps_raw.xml) sẽ có dạng như sau:

Tài nguyên chuỗi

Mã mẫu sau đây giả định dự án của bạn chứa một tài nguyên chuỗi có tên style_json:

package com.example.styledmap;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

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.LatLng;
import com.google.android.gms.maps.model.MapStyleOptions;

/**
 * A styled map using JSON styles from a string resource.
 */
public class MapsActivityString extends AppCompatActivity
        implements OnMapReadyCallback {

    private static final String TAG = MapsActivityString.class.getSimpleName();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Retrieve the content view that renders the map.
        setContentView(R.layout.activity_maps_string);

        // Get the SupportMapFragment and register for the callback
        // when the map is ready for use.
        SupportMapFragment mapFragment =
                (SupportMapFragment) getSupportFragmentManager()
                        .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    /**
     * Manipulates the map when it's available.
     * The API invokes this callback when the map is ready for use.
     */
    @Override
    public void onMapReady(GoogleMap googleMap) {

        // Customise the styling of the base map using a JSON object defined
        // in a string resource file. First create a MapStyleOptions object
        // from the JSON styles string, then pass this to the setMapStyle
        // method of the GoogleMap object.
        boolean success = googleMap.setMapStyle(new MapStyleOptions(getResources()
                .getString(R.string.style_json)));

        if (!success) {
            Log.e(TAG, "Style parsing failed.");
        }
        // Position the map's camera near Sydney, Australia.
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(-34, 151)));
    }
}

Bố cục (activity_maps_string.xml) sẽ có dạng như sau:

Tìm hiểu thêm về nội dung khai báo kiểu JSON

Bản đồ đã tạo kiểu sử dụng hai khái niệm để áp dụng màu và các thay đổi khác về kiểu cho bản đồ:

  • Trình chọn chỉ định các thành phần địa lý mà bạn có thể định kiểu trên bản đồ. Các địa điểm này bao gồm đường, công viên, vùng nước và các địa điểm khác, cũng như nhãn của các vùng nước đó. Các bộ chọn bao gồm tính năngphần tử, được chỉ định dưới dạng thuộc tính featureTypeelementType.
  • Trình tạo kiểu là các thuộc tính màu và chế độ hiển thị mà bạn có thể áp dụng cho các phần tử bản đồ. Các thuộc tính này xác định màu hiển thị thông qua tổ hợp các giá trị sắc độ, màu sắc và độ sáng/gamma.

Hãy xem tài liệu tham khảo về kiểu để biết nội dung mô tả chi tiết về các tuỳ chọn định kiểu JSON.

Trình hướng dẫn tạo kiểu cho Nền tảng Maps

Sử dụng Trình hướng dẫn định kiểu trên Nền tảng Maps để tạo đối tượng định kiểu JSON một cách nhanh chóng. SDK Maps dành cho Android hỗ trợ các nội dung khai báo kiểu giống như API JavaScript của Maps.

Bước tiếp theo

Xem cách ẩn đối tượng trên bản đồ bằng cách tạo kiểu.