Android高德SDK 地图篇二:Marker基本用法

Marker就是地图上点的标记, Marker能够实现以下功能:html

Marker类和MarkerOptions类

当咱们建立一个Marker的时候,咱们须要使用MarkerOptions类来android

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文档:git

a.amap.com/lbs/static/…api

先看Marker类的3个方法markdown

Marker文档:a.amap.com/lbs/static/…ide

Marker的载体(地图View)

地图View的类有三个   oop

MapView和TextureMapView的方法都是同样的。
因为MapView与SurfaceView同时使用出现黑屏及透视问题
可是TextureMapView不会。因此我建议你们使用TextureMapView比较好。布局

MapView和TextureMapView的方法都是同样的。
因为MapView与SurfaceView同时使用出现黑屏及透视问题
可是TextureMapView不会。因此我建议你们使用TextureMapView比较好。spa

是用在穿戴设备上的,这个我没用过,全部就不介绍了。翻译

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…