Marker就是地图上点的标记, Marker可以实现如下功能:
Marker类和MarkerOptions类
当我们创建一个Marker的时候,我们需要使用MarkerOptions类来
MarkerOptions options = new MarkerOptions();
//对应Marker.setIcon方法 设置Marker的图片
options.icon(BitmapDescriptorFactory.fromBitmap(bitmap));
//对应Marker.setPosition方法 设置Marker的坐标
options.position(latlng);
//然后通过下面的方法来获取Marker Amap类可以通过地图控件TextureMapView.getAmap()方法
Marker marker = Amap.addMarker(options);
MarkerOptions文档:
先看Marker类的3个方法
Marker文档:a.amap.com/lbs/static/…
Marker的载体(地图View)
地图View的类有三个
MapView和TextureMapView的方法都是一样的。
由于MapView与SurfaceView同时使用出现黑屏及透视问题
但是TextureMapView不会。所以我建议大家使用TextureMapView比较好。
MapView和TextureMapView的方法都是一样的。
由于MapView与SurfaceView同时使用出现黑屏及透视问题
但是TextureMapView不会。所以我建议大家使用TextureMapView比较好。
是用在穿戴设备上的,这个我没用过,所有就不介绍了。
MapView类的生命周期方法
上面三个MapView类有类似android生命周期的方法
TextureMapView.onCreate(savedInstanceState);
TextureMapView.onResume();
TextureMapView.onPause();
TextureMapView.onSaveInstanceState(savedInstanceState);
TextureMapView.onDestroy();
请在Activity或者Fragment中生命周期中调用这写方法。
添加TextureMapView到界面上
建一个Fragment
写如下代码 就可以把地图控件添加到界面上了
/**
* @author jikun
* Created by jikun on 2018/3/9.
*/
public class MarkerMapFragment extends Fragment {
private TextureMapView textureMapView;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_marker_map, container, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
textureMapView = view.findViewById(R.id.textureMapView);
textureMapView.onCreate(savedInstanceState);
}
/**
* 方法必须重写 来实现TextureMapView的生命周期方法
*/
@Override
public void onResume() {
super.onResume();
if (null != textureMapView) {
textureMapView.onResume();
}
}
/**
* 方法必须重写 来实现TextureMapView的生命周期方法
*/
@Override
public void onPause() {
super.onPause();
if (null != textureMapView) {
textureMapView.onPause();
}
}
/**
* 方法必须重写 来实现TextureMapView的生命周期方法
*/
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (null != textureMapView) {
textureMapView.onSaveInstanceState(outState);
}
}
/**
* 方法必须重写 来实现TextureMapView的生命周期方法
*/
@Override
public void onDestroy() {
super.onDestroy();
if (null != textureMapView) {
textureMapView.onDestroy();
}
}
}
添加Marker到TextureMapView
我们去高德路径拾取的网页上找一个坐标点。
请一定去高德的路径拾取 取坐标点,不要去百度的 因为高德与百度用的不是一个坐标系,坐标系的问题我以后再讲
坐标拾取地址:lbs.amap.com/console/sho…
经度longitude是104.065692
纬度latitude是30.657505
(PS:这两个也许你会记错,告诉大家个小窍门,
在我国 经纬度 一般都是 经度数字比纬度数字大,经度英文是longitude,英文中有个long long 翻译为长,当然也代表大。
那么如果你看到一个坐标 是104.065692 ,30.657505 那么大的那个就是经度longitude 小的就是纬度latitude。
这个是我平时观察发现的,不是很官方,但是确实很好用,这样就不会弄错了)
然后我们就可以添加Marker到TextureMapView中
代码如下:
private void addMarker() {
MarkerOptions options = new MarkerOptions();
//对应Marker.setIcon方法 设置Marker的图片
options.icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher));
//对应Marker.setPosition方法 设置Marker的坐标
//纬度在前 经度在后
LatLng latLng = new LatLng(30.657505, 104.065692);
options.position(latLng);
//然后通过下面的方法来获取Marker Amap类可以通过地图控件TextureMapView.getAmap()方法
marker = textureMapView.getMap().addMarker(options);
moveCameraOnMap();}
/**
* 方法必须重写 来实现TextureMapView的生命周期方法
*/
@Override
public void onDestroy() {
super.onDestroy();
if (null != textureMapView) {
textureMapView.onDestroy();
}
// 别忘了onDestroy 摧毁Marker.
if (null != marker) {
marker.destroy();
marker=null;
}
}
/**
* 移动地图到Marker标记点位置的方法。
*/
private void moveCameraOnMap() {
LatLng latLng = new LatLng(30.657505, 104.065692);
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLng(latLng);
textureMapView.getMap().moveCamera(cameraUpdate);
}
建一个Activity继承FragmentActivity 请不要继承AppCompatActivity(注意)
WHY?
关于为什么不继承AppCompatActivity, 是这样的 在android4.4.4机型上 如果你的Activity继承的是AppCompatActivity 再使用高德导航API 会遇到资源ID异常的崩溃BUG. 如果继承的是FragmentActivity,就不会有
Activity代码如下:
public class MarkerActivity extends FragmentActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_marker);
MarkerMapFragment markerMapFragment = MarkerMapFragment.newInstance();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.flContent, markerMapFragment)
.commitAllowingStateLoss();
}
}
这样我们添加一个marker到地图上:
Marker的锚点比例
什么是锚点比例,
Marker在地图上显示是靠坐标或者像素的。 坐标(像素)在地图上其实是一个很小的点(可以看成1px*1px),但是Marker却不是一个点,他是可以设置图片,他是有大小的(肯定比1px*1px大)。那么Marker如何根据坐标点显示自己呢?就是根据锚点比例的设置位置来显示
我来举个例子:
我来总结下
当它为 0,0的时候 marker会以坐标点在marker左上位置来显示
当它为0,1的时候 marker会以坐标点在marker左下位置来显示
当它为1,0的时候 marker会以坐标点在marker右上位置来显示
当它为1,1的时候 marker会以坐标点在marker右下位置来显示
当它为0.5,0.5的时候 marker会以坐标点为中心来显示
锚点取值范围 u=0到1 v=0到1。是百分比取值的
如果你不设置 那么 默认的锚点 是 0.5,1
设置锚点比例的方法有两个
一个是MarkerOptions的
一个是Marker的
代码如下:
options.anchor(0.5F,1);
或者
marker.setAnchor(0.5F,1);
InfoWindow
什么是InfoWindow 如下图
InfoWindow 是与Marker相关的
InfoWindow 有一个默认的布局效果
显示默认的InfoWindow
默认的 Infowindow 只显示 Marker 对象的两个属性,一个是 title 和另一个 snippet
调用 Marker 类的 showInfoWindow() 和 hideInfoWindow() 方法可以控制显示和隐藏
代码如下
private void addMarker() {
MarkerOptions options = new MarkerOptions();
//对应Marker.setIcon方法 设置Marker的图片
options.icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher));
//对应Marker.setPosition方法 设置Marker的坐标
options.title("InfoWindow标题");
options.snippet("InfoWindow的Snippet");
//纬度在前 经度在后
LatLng latLng = new LatLng(30.657505, 104.065692);
options.position(latLng);
//然后通过下面的方法来获取Marker Amap类可以通过地图控件TextureMapView.getAmap()方法
marker = textureMapView.getMap().addMarker(options);
//显示InfoWindow
marker.showInfoWindow();
moveCameraOnMap();
}
效果如下:
当然默认的InfoWindow是满足不了我们的需求的,所以我们要自定义InfoWindow
自定义InfoWindow
自定义InfoWindow 我们需要调用
AMap.setInfoWindowAdapter(InfoWindowAdapter);
public interface InfoWindowAdapter {
View getInfoWindow(Marker var1);
View getInfoContents(Marker var1);
}
自定义布局所需要的资源在代码中请下载代码查看吧。
我们演示一下这个说明文档
自定义InfoWindow的布局
R.layout.map_fast_car_info_window跟标签布局不设置背景
那么你得到效果如下:
如果设置了背景
那么效果如下
Marker还有很多方法,希望大家可以多去试试,我在后面的实践中也会给大家介绍一下
下篇为大家带来滴滴出行 打车界面的效果
代码下载地址:gitee.com/justforgame…