做網(wǎng)站 賺錢嗎推廣費(fèi)用一般多少
一、獲取高德平臺(tái)key
【1】基于application包名&sha1值在高德控制臺(tái)獲取key值,詳情參考:? 獲取Key-創(chuàng)建工程-開發(fā)指南-Android 地圖SDK | 高德地圖API
【2】在manifest中聲明權(quán)限
【3】將拿到的key值在manifest中進(jìn)行聲明
<!--允許程序打開網(wǎng)絡(luò)套接字-->
<uses-permission android:name="android.permission.INTERNET" />
<!--允許程序設(shè)置內(nèi)置sd卡的寫權(quán)限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--允許程序獲取網(wǎng)絡(luò)狀態(tài)-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--允許程序訪問(wèn)WiFi網(wǎng)絡(luò)信息-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!--允許程序訪問(wèn)CellID或WiFi熱點(diǎn)來(lái)獲取粗略的位置-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<meta-dataandroid:name="com.amap.api.v2.apikey"android:value="xxxxxxxxxxxx" />
二、集成依賴
在app build.gradle文件中增加高德地圖依賴
implementation("com.amap.api:3dmap:9.8.2")
三、顯示地圖
概述-Android 地圖SDK | 高德地圖API
在xml文件中聲明MapView控件,并在class中重寫?onCreate 方法(此方法必須重寫),注意生命周期的管理
<com.amap.api.maps.MapViewandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent" />
private var mapView: MapView? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.test_activity)mapView = findViewById(R.id.map)mapView?.onCreate(savedInstanceState)
}override fun onResume() {super.onResume()mapView?.onResume()
}override fun onPause() {super.onPause()mapView?.onPause()
}override fun onDestroy() {super.onDestroy()mapView?.onDestroy()
}override fun onSaveInstanceState(outState: Bundle) {super.onSaveInstanceState(outState)mapView?.onSaveInstanceState(outState)
}
地圖默認(rèn)中心點(diǎn)為北京天安門
四、高德地圖具體使用
以下對(duì)于地圖的控制使用之前需要拿到AMap對(duì)象
map = mapView?.map
1、切換城市中心點(diǎn)
private fun moveCenterTo(latLng: LatLng) {val cameraUpdate = CameraUpdateFactory.newLatLng(latLng)map?.moveCamera(cameraUpdate)
}
Android高德地圖切換城市中心點(diǎn)展示
2、設(shè)置縮放級(jí)別
moveCamera(CameraUpdateFactory.zoomTo(14.0f))
3、繪制marker
companion object {private val MARKER1 = LatLng(40.02855349893361, 116.3052948784071)private val MARKER2 = LatLng(41.093445392798934, 116.11030767409169)
}val marker1: MarkerOptions = MarkerOptions().apply {position(MARKER1)
}
val marker2: MarkerOptions = MarkerOptions().apply {position(MARKER2)
}val list = ArrayList<MarkerOptions>()
list.add(marker1)
list.add(marker2)
map?.addMarkers(list, false)
如下圖所示,不設(shè)置icon默認(rèn)展示藍(lán)色定位圖標(biāo)。
11
針對(duì)marker可以設(shè)置的屬性:
position | 在地圖上標(biāo)記位置的經(jīng)緯度值,必填參數(shù) |
title | 點(diǎn)標(biāo)記的標(biāo)題 |
snippet | 點(diǎn)標(biāo)記的內(nèi)容 |
draggable | 點(diǎn)標(biāo)記是否可拖拽 |
visible | 點(diǎn)標(biāo)記是否可見(jiàn) |
anchor | 點(diǎn)標(biāo)記的錨點(diǎn) |
alpha | 點(diǎn)的透明度 |
public final?java.util.ArrayList<Marker>?addMarkers(java.util.ArrayList<MarkerOptions>?options, boolean?moveToCenter)在地圖上添一組圖片標(biāo)記(marker)對(duì)象,并設(shè)置是否改變地圖狀態(tài)以至于所有的marker對(duì)象都在當(dāng)前地圖可視區(qū)域范圍內(nèi)顯示。
參數(shù):
options
?- 多個(gè)markerOptions對(duì)象,它們分別定義了對(duì)應(yīng)marker的屬性信息。
moveToCenter
?- 是否改變地圖狀態(tài),默認(rèn)為false。返回:
返回一組被添加的marker對(duì)象。
4、繪制折線
val latLngList = ArrayList<LatLng>()
latLngList.add(MARKER1)
latLngList.add(MARKER2)
map?.addPolyline(PolylineOptions().addAll(latLngList).width(3f).color(Color.RED)
)
5、軌跡
SmoothMoveMarker(map).apply {
setDescriptor(BitmapDescriptorFactory.fromResource(R.drawable.smooth))setPoints(latLngList)setTotalDuration(5)startSmoothMove()}
6、兩點(diǎn)之間距離計(jì)算
AMapUtils.calculateLineDistance(latLng1,latLng2)
7、切換地圖圖層
【1】預(yù)設(shè)模式
mapType = AMap.MAP_TYPE_NIGHT
【2】在線自定義模式
val options = CustomMapStyleOptions().apply {isEnable = truestyleId = ""
}
map?.setCustomMapStyle(options)
8、手勢(shì)交互
map?.uiSettings.let {it.isRotateGesturesEnabled = falseit.isZoomControlsEnabled = falseit.isTiltGesturesEnabled = false
}
更多設(shè)置可參考:https://a.amap.com/lbs/static/unzip/Android_Map_Doc/3D/index.html?overview-summary.html
9、地圖狀態(tài)監(jiān)聽(tīng)
setOnMapLoadedListener(object : AMap.OnMapLoadedListener {override fun onMapLoaded() {Log.e(TAG, "onMapLoaded...")}})//自帶放大縮小接口setOnCameraChangeListener(object : AMap.OnCameraChangeListener {override fun onCameraChange(p0: CameraPosition?) {//Log.e(TAG, "onCameraChange + ${p0?.toString()}")}override fun onCameraChangeFinish(p0: CameraPosition?) {Log.e(TAG, "onCameraChangeFinish + ${p0?.toString()}")}})//map point點(diǎn)擊事件addOnMapClickListener(object : AMap.OnMapClickListener {override fun onMapClick(p0: LatLng?) {Log.e(TAG, "onMapClick + ${p0?.toString()}")}})//地圖自帶poi點(diǎn)擊事件addOnPOIClickListener(object : AMap.OnPOIClickListener {override fun onPOIClick(p0: Poi?) {Log.e(TAG, "onPOIClick + ${p0?.toString()}")}})addOnMarkerClickListener(object : AMap.OnMarkerClickListener {override fun onMarkerClick(p0: Marker?): Boolean {Log.e(TAG, "onMarkerClick + ${p0?.id}")return true}})
10、截圖功能
拿到bitmap對(duì)象進(jìn)行處理
map?.getMapScreenShot(object : AMap.OnMapScreenShotListener {override fun onMapScreenShot(p0: Bitmap?) {TODO("Not yet implemented")}override fun onMapScreenShot(p0: Bitmap?, p1: Int) {TODO("Not yet implemented")}})
五、代碼
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><com.amap.api.maps.MapViewandroid:id="@+id/map"android:layout_width="match_parent"android:layout_height="match_parent" /><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:gravity="center"android:orientation="horizontal"><TextViewandroid:id="@+id/bj"android:layout_width="60dp"android:layout_height="wrap_content"android:background="@drawable/button_bg"android:gravity="center"android:padding="10dp"android:text="北京"android:textSize="18dp" /><TextViewandroid:id="@+id/gz"android:layout_width="60dp"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:background="@drawable/button_bg"android:gravity="center"android:padding="10dp"android:text="廣州"android:textSize="18dp" /><TextViewandroid:id="@+id/xa"android:layout_width="60dp"android:layout_height="wrap_content"android:layout_marginLeft="20dp"android:background="@drawable/button_bg"android:gravity="center"android:padding="10dp"android:text="西安"android:textSize="18dp" /><ImageViewandroid:id="@+id/share"android:layout_width="40dp"android:layout_height="40dp"android:layout_marginLeft="20dp"android:scaleType="fitXY"android:src="@drawable/screenshot" /></LinearLayout></FrameLayout>
package com.example.myapplicationimport android.graphics.Bitmap
import android.graphics.Color
import android.location.Location
import android.os.Bundle
import android.util.Log
import android.widget.ImageView
import android.widget.TextView
import androidx.activity.ComponentActivity
import com.amap.api.maps.AMap
import com.amap.api.maps.CameraUpdateFactory
import com.amap.api.maps.MapView
import com.amap.api.maps.model.BitmapDescriptorFactory
import com.amap.api.maps.model.CameraPosition
import com.amap.api.maps.model.LatLng
import com.amap.api.maps.model.Marker
import com.amap.api.maps.model.MarkerOptions
import com.amap.api.maps.model.Poi
import com.amap.api.maps.model.PolylineOptions
import com.amap.api.maps.utils.overlay.SmoothMoveMarkerclass TestActivity : ComponentActivity() {private var mapView: MapView? = nullprivate var map: AMap? = nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.test_activity)initMap(savedInstanceState)initView()}private fun initView() {findViewById<TextView>(R.id.bj).setOnClickListener { moveCenterTo(LATLNG_BJ) }findViewById<TextView>(R.id.gz).setOnClickListener { moveCenterTo(LATLNG_GZ) }findViewById<TextView>(R.id.xa).setOnClickListener { moveCenterTo(LATLNG_XA) }findViewById<ImageView>(R.id.share).setOnClickListener {map?.getMapScreenShot(object : AMap.OnMapScreenShotListener {override fun onMapScreenShot(p0: Bitmap?) {TODO("Not yet implemented")}override fun onMapScreenShot(p0: Bitmap?, p1: Int) {TODO("Not yet implemented")}})}}private fun initMap(savedInstanceState: Bundle?) {mapView = findViewById(R.id.map)mapView?.onCreate(savedInstanceState)mapView?.let {map = it.map}map?.apply {uiSettings.let {it.isRotateGesturesEnabled = falseit.isZoomControlsEnabled = falseit.isTiltGesturesEnabled = false}moveCamera(CameraUpdateFactory.zoomTo(8.0f))//自定義圖層
// val options = CustomMapStyleOptions().apply {
// isEnable = true
// styleId = ""
// }
// setCustomMapStyle(options)// mapType = AMap.MAP_TYPE_NIGHTsetOnMapLoadedListener(object : AMap.OnMapLoadedListener {override fun onMapLoaded() {Log.e(TAG, "onMapLoaded...")//AnimatorUtil.obtainLinePointF(mapView, MARKER1, MARKER2)
// Handler().postDelayed(object : Runnable{
// override fun run() {
// AnimatorUtil.obtainLinePointF(mapView, MARKER2, MARKER3)
// }
// }, 500)}})//自帶放大縮小接口setOnCameraChangeListener(object : AMap.OnCameraChangeListener {override fun onCameraChange(p0: CameraPosition?) {//Log.e(TAG, "onCameraChange + ${p0?.toString()}")}override fun onCameraChangeFinish(p0: CameraPosition?) {Log.e(TAG, "onCameraChangeFinish + ${p0?.toString()}")}})//map point點(diǎn)擊事件addOnMapClickListener(object : AMap.OnMapClickListener {override fun onMapClick(p0: LatLng?) {Log.e(TAG, "onMapClick + ${p0?.toString()}")}})//地圖自帶poi點(diǎn)擊事件addOnPOIClickListener(object : AMap.OnPOIClickListener {override fun onPOIClick(p0: Poi?) {Log.e(TAG, "onPOIClick + ${p0?.toString()}")}})addOnMarkerClickListener(object : AMap.OnMarkerClickListener {override fun onMarkerClick(p0: Marker?): Boolean {Log.e(TAG, "onMarkerClick + ${p0?.id}")return true}})setOnMyLocationChangeListener(object : AMap.OnMyLocationChangeListener {override fun onMyLocationChange(p0: Location?) {Log.e(TAG, "setOnMyLocationChangeListener + ${p0?.toString()}")p0?.let {moveCamera(CameraUpdateFactory.newLatLng(LatLng(it.latitude, it.longitude)))}}})//繪制marker點(diǎn)val marker1: MarkerOptions = MarkerOptions().apply {position(MARKER1)}val marker2: MarkerOptions = MarkerOptions().apply {position(MARKER2)}val list = ArrayList<MarkerOptions>()list.add(marker1)list.add(marker2)addMarkers(list, false)// val builder = LatLngBounds.builder().apply {
// include(MARKER1)
// include(MARKER2)
// include(MARKER3)
// include(MARKER4)
// }
// val bounds = builder.build()
// moveCamera(CameraUpdateFactory.newLatLngBounds(bounds, 300))//繪制marker折線val latLngList = ArrayList<LatLng>()latLngList.add(MARKER1)latLngList.add(MARKER2)addPolyline(PolylineOptions().addAll(latLngList).width(3f).color(Color.RED))//軌跡SmoothMoveMarker(map).apply {setDescriptor(BitmapDescriptorFactory.fromResource(R.drawable.smooth))setPoints(latLngList)setTotalDuration(5)startSmoothMove()}}}private fun moveCenterTo(latLng: LatLng) {val cameraUpdate = CameraUpdateFactory.newLatLng(latLng)map?.moveCamera(cameraUpdate)}override fun onResume() {super.onResume()mapView?.onResume()}override fun onPause() {super.onPause()mapView?.onPause()}override fun onDestroy() {super.onDestroy()mapView?.onDestroy()}override fun onSaveInstanceState(outState: Bundle) {super.onSaveInstanceState(outState)mapView?.onSaveInstanceState(outState)}companion object {private const val TAG = "TestActivity"private val MARKER1 = LatLng(40.02855349893361, 116.3052948784071)private val MARKER2 = LatLng(41.093445392798934, 116.11030767409169)private val LATLNG_BJ = LatLng(39.90508988475248, 116.4083842390264)private val LATLNG_GZ = LatLng(23.11523439186301, 113.24706837513949)private val LATLNG_XA = LatLng(34.321288624880815, 108.94042782381482)}
}