关于Android集成高德地图的那些事儿...地图标注Marker 、Poi 搜索_高德地图bitmapdescriptorfactory.fromview-程序员宅基地

技术标签: 地图  定位  Marker  

    上一篇博客介绍了地图的显示,不要太简单了, 我们要实现的效果当然不仅仅是显示地图这么废了, 现在地图是有了 , 怎么在地图上添加一个标注呢? 添加一个圆形?又或者是我想在地图上添加个自定义的View, 会不会很6? 呵呵 

    答案全在AMap aMap=mapView.getMap(); 我们添加的这些东西都是要在aMap上操作的 , 之前有说道定位回调的方法里面显示了系统的定位小蓝点 ,  那我不想要那个效果咋整 ? 当然了SDK中的api可以修改定位点的样式 , 这个就不说了 , 对于强迫症的我来说 , 不如自己搞一个来的痛快, 系统定位蓝点不过就是个Marker而已

    先来创建一个Marker ,  aMap.addMarker( ) 方法返回值就是Marker对象 , 方法参数接收的是 MarkerOptions  ; MarkerOptions 可以设置资源图片 , 设置锚点 ,标题等等 ;重点说下这个图片MarkerOptions有个icon()方法 可以加载资源图片 , 也可以加载自定义View ; 有趣的是 ,api现在已经支持给Marker添加动画了  , 那就在添加Marker的同时 加入缩放和透明度渐变的动画

// BitmapDescriptorFactory.fromView(View view);
// BitmapDescriptorFactory.fromBitmap(Bitmap bitmap)
// BitmapDescriptorFactory.fromAsset(String s);
// BitmapDescriptorFactory.fromResource(int res);
// BitmapDescriptorFactory.fromFile(String path);

//加载一个layout
View view = View.inflate(this, R.layout.item_marker, null);
((TextView) view.findViewById(R.id.num)).setText("layout");
Marker addMarker = aMap.addMarker(new MarkerOptions()
                       .icon(BitmapDescriptorFactory.fromView(view))
                       .position(new LatLng(locationInfo.getLatitude(), locationInfo.getLongitude())));

//Marker 开启动画
private void startAnimation(Marker marker) {
        AnimationSet animationSet = new AnimationSet(false);
        Animation scale = new ScaleAnimation(0, 1, 0, 1);
        Animation alpha = new AlphaAnimation(0, 1);
        animationSet.addAnimation(alpha);
        animationSet.addAnimation(scale);
        animationSet.setDuration(300);
        animationSet.setInterpolator(new LinearInterpolator());
        marker.setAnimation(animationSet);
        marker.startAnimation();
    }


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center">

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@drawable/ic_location_blue_small" />

    <TextView
        android:id="@+id/num"
        style="@style/text_10_color_1_style"
        android:layout_gravity="center"
        android:layout_marginBottom="6dp"
        android:text="5"
        android:textStyle="bold" />

</FrameLayout>

     这样就可以在地图上面显示我们自定义的Marker了 , 那现在问题来了 , 如果我点击Marker会有什么效果呢 ? Marker点击事件需要设置监听才能响应 , 那就实现点击Marker放大的效果吧

     非常坑爹的一个就是 , 并没有找到直接在原有Marker的基础上修改样式的方法 , 目前我是在点击Marker时 将之前的Marker移除掉 , 然后重新添加一个新的Marker , 以此来产生点击效果 , 

aMap.setOnMarkerClickListener(this);

 @Override
    public boolean onMarkerClick(Marker marker) {
        //step 1 , reset  将上次的marker恢复到初始状态
        if (markerPre != null && !marker.equals(markerPre) && markerIndexPre != -1) {
            markerPre.remove();
            View view = View.inflate(this, R.layout.item_marker, null);
            ((TextView) view.findViewById(R.id.num)).setText(String.valueOf(markerIndexPre));
            ((ImageView) view.findViewById(R.id.img)).setImageResource(R.drawable.ic_location_blue_small);

            markers.put(markerIndexPre, aMap.addMarker(new MarkerOptions()
                    .icon(BitmapDescriptorFactory.fromView(view))
                    .position(markerPre.getPosition())));
        }
        if (!marker.equals(markerPre)) {
            int clickIndex = -1;
            for (Map.Entry<Integer, Marker> entry : markers.entrySet()) {
                if (marker.equals(entry.getValue())) {
                    clickIndex = entry.getKey();
                    break;
                }
            }
            if (clickIndex != -1) {
                marker.remove();
                View view = View.inflate(this, R.layout.item_marker, null);
                ((TextView) view.findViewById(R.id.num)).setText(String.valueOf(clickIndex));
                ((ImageView) view.findViewById(R.id.img)).setImageResource(R.drawable.ic_location_blue_big);
                Marker addMarker = aMap.addMarker(new MarkerOptions()
                        .icon(BitmapDescriptorFactory.fromView(view))
                        .position(marker.getPosition()));
                markers.put(clickIndex, addMarker);
                startAnimation(addMarker);
                recyclerView.smoothScrollToPosition(clickIndex - 1);
                locationAdapter.refreshIndex(clickIndex - 1);
                markerPre = addMarker;
                markerIndexPre = clickIndex;
            }
        }       
        return false;
    }
Caption

   

那地图上能不能绘制 圈儿圈儿 涅? 嘻嘻...api已经提供了方法 顾名思义 , 看到方法名就知道啥意思了

Circle circleOut = aMap.addCircle(new CircleOptions().center(latLng)//圈儿圈儿的坐标
                .radius(maxRadius)//圈儿圈儿的半径R
                .strokeColor(ContextCompat.getColor(this, android.R.color.transparent))
                .fillColor(ContextCompat.getColor(this, R.color.blue_sharder))
                .strokeWidth(0));

   就画个圈儿圈儿会不会太单调了呀 , 要不干脆把系统的小蓝点干掉吧 , 自己写个圈儿圈儿补上 , 思路:外圈儿 套 内圈儿 , 内圈儿套 中心点 , 外圈儿半径R和中心点固定 , 内圈做动画通过不断的改变半径来实现雷达扫描的效果

private void refreshMyLocation(LatLng latLng) {
        aMap.clear();
        clearCircle();
        // 绘制不同半径的圆,添加到地图上
        final Circle circleOut = aMap.addCircle(new CircleOptions().center(latLng)
                .radius(maxRadius)
                .strokeColor(ContextCompat.getColor(this, android.R.color.transparent))
                .fillColor(ContextCompat.getColor(this, R.color.blue_sharder))
                .strokeWidth(0));

        final Circle circleIn = aMap.addCircle(new CircleOptions().center(latLng)
                .radius(10)
                .strokeColor(ContextCompat.getColor(this, android.R.color.transparent))
                .fillColor(ContextCompat.getColor(this, R.color.green_sharder))
                .strokeWidth(0));

        aMap.addMarker(new MarkerOptions()
                .anchor(0.5f, 0.5f)
                .setFlat(true)//平贴地面
                .icon(BitmapDescriptorFactory.fromView(View.inflate(this, R.layout.item_location_point, null)))
                .position(latLng));

        listCircle.add(circleOut);
        listCircle.add(circleIn);
        startAnimator(circleIn);
    }

    private void clearCircle() {
        if (valueAnimator != null && valueAnimator.isRunning()) {
            valueAnimator.cancel();
        }
        for (int i = 0; i < listCircle.size(); i++) {
            listCircle.get(i).remove();
            listCircle.remove(i);
        }
    }

    private void startAnimator(final Circle circle) {
        valueAnimator = ValueAnimator.ofFloat(10, maxRadius).setDuration(3000);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                mAnimatorValue = (float) animation.getAnimatedValue();
                circle.setRadius(mAnimatorValue);//在这里改变半径 不断绘制
            }
        });
        valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
        valueAnimator.setRepeatMode(ValueAnimator.REVERSE);//反向重复执行,可以避免抖动
        valueAnimator.start();
    }

  哈哈 , 还不错!  博客图片大小限制,压缩的有点模糊,凑活看吧

Caption

    接下就是Poi 搜索了 , 话说Poi是个啥? Point of Interest兴趣点 , 就是个关键词搜索 , 这个是sdk自带的接口 , 返回与我们的关键词相关的一些数据  

//查询条件
PoiSearch.Query(String keyWord,String p2,String cityCode) ; 

keyWord表示搜索字符串

第二个参数表示POI搜索类型,二者选填其一,选用POI搜索类型时建议填写类型代码,码表可以参考下方(而非文字)

cityCode表示POI搜索区域,可以是城市编码也可以是城市名称,也可以传空字符串,空字符串代表全国在全国范围内进行搜索

//创建查询条件
PoiSearch.Query query = new PoiSearch.Query(keyWord, "", "");
if (poiSearch == null) {
                        poiSearch = new PoiSearch(MapActivity.this, query);
                        poiSearch.setOnPoiSearchListener(new                 PoiSearch.OnPoiSearchListener() {
                            @Override
                            public void onPoiSearched(PoiResult poiResult, int i) {
                                //搜索结果在这里解析
                                PoiItem poiItem = poiResult.getPois().get(j);
                                LatLonPoint latLonPoint = poiItem.getLatLonPoint();
                                latLng = new LatLng(latLonPoint.getLatitude(),             
                                latLonPoint.getLongitude());
                                locationInfo = new LocationInfo();
                                locationInfo.setLatitude(latLonPoint.getLatitude());
                                locationInfo.setLongitude(latLonPoint.getLongitude());
                                locationInfo.setAddressName(poiItem.getTitle());
                                locationInfo.setAddress(poiItem.getAdName());
                            }

                            @Override
                            public void onPoiItemSearched(PoiItem poiItem, int i) {

                            }
                        });
                    } else {
                        poiSearch.setQuery(query);
                    }
//开始异步搜索
 poiSearch.searchPOIAsyn();

  可以从PoiItem  中获取坐标信息,  poiItem.getTitle() 是Poi的名称 ,关于PoiItem的详细api可以参开开放平台的api的文档http://a.amap.com/lbs/static/unzip/Android_Map_Doc/index.html

  来展示下最终的效果

 

Caption

  GiHub地址:https://github.com/good-good-study/StudyApplication

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sxt_zls/article/details/84330975

智能推荐

为什么越来越多的企业选择云数据存储而放弃本地数据存储?_使用云存储的原因-程序员宅基地

文章浏览阅读2.7k次。云不仅保证了数据的灵活性和安全性,而且消除了维护和更新系统的麻烦。这使企业可以投入时间和资源来实现其核心业务目标。_使用云存储的原因

(C#)Excel工作表没有数据的区域显示灰色_excel无数据区域弄成灰色-程序员宅基地

文章浏览阅读1.4k次。需求:显现如下图片的效果实现思路:1.选中所有单元格,设置背景色为灰色;2.选中不需要灰色的单元格,设置无填充色实现代码:引用的是Microsoft.Office.Interop.ExcelExcel.Application xApp = (Excel.Application)ExcelDnaUtil.Application;Excel.Worksheet xSheet = xApp.ActiveSheet;//选中所有单元格Excel.Range range = xSheet.Cells_excel无数据区域弄成灰色

TIOVX (TI OpenVX)简介及例程-程序员宅基地

文章浏览阅读9.6k次,点赞17次,收藏83次。文章目录TIOVX1. Overview3. 示例2. OpenVX2.1 特点2.2 框架对象2.2.1 Context(上下文)2.2.2 Kernel(核)2.2.3 Parameter(参数)2.2.4 Node(节点)2.2.5 Graph(图)2.3 数据对象2.3 Graph示例TIOVXTI’s implementation of OpenVX Standard1. OverviewTIOVX Block Diagram3. 示例//C71 DEMO/* * Graph_tiovx

C/C++ 标准输入、输出流用法_c++ stdin的用法-程序员宅基地

文章浏览阅读3.7k次,点赞4次,收藏13次。虽然一直在用C++,但是对于文件啊、标准输入输出的东西老是忘掉,每次忘掉就又百度。这次专门把相关的基础知识点记录下来,以后就不会迷路了!1. C语言的标准输入输出流标准文件文件指针设备标准输入stdin键盘标准输出stdout屏幕将标准输入和标准输出视为两个文件,stdin和stdout即为指向标准输入和标准输出文件的文件指针FILE*cout << (typeid(FILE*) == typeid(stdin));//输出1,即stdin即为F_c++ stdin的用法

人工智能动物识别系统C语言代码,人工智能作业动物识别系统.doc-程序员宅基地

文章浏览阅读2.9k次。人工智能作业动物识别系统动物识别专家系统-------胡沧粟—20131313058动物识别系统由多种规则来判别,首先原则是根据是哺乳动物还是鸟类来区别大类。然后哺乳动物类里建立规则:食肉动物,非食肉,黄褐色,有斑点,长脖子,两色来区分老虎,金钱豹,长颈鹿和斑马。鸟类建议规则:会飞,不会飞,长腿,黑白两色来区分信天翁,企鹅和鸵鸟。将上的规则适当了简化,并利用界面的人性化来诱导人们的使用软件程序c#..._用c语言实现人工智能动物识别系统

第六章 Kubernetes支撑云原生应用开发案例_could not push logs to elasticsearch, resetting co-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏2次。文章目录第6章 Kubernetes支撑云原生应用开发案例6.1 Kubernetes与云原生应用6.1.1 云原生6.1.2 kubernetes与云原生应用6.1.3 kubernetes应用6.2 高可用私有镜像仓库搭建6.2.1 高可用私有容器镜像仓库搭建6.2.1.1 高可用Harbor搭建步骤1) 部署Harbor依赖的external系统a. 部署miniob. 部署redisc. ..._could not push logs to elasticsearch, resetting connection and trying again.

随便推点

C++11标准|用C++写一个矩阵(包含了如何用cmake构建一个工程)_c++ 矩阵-程序员宅基地

文章浏览阅读4.2k次,点赞2次,收藏8次。1.改进版2的矩阵乘法是很慢的,相比matlab差了至少1w倍,我们可以采取以下方式提速,cpu的并行指令,gpu的并行计算,但这些技术都太深入了。因为改进版2的矩阵乘法有三层for循环,版本1的k在最内层,版本2的i在最内层,版本3的j在最内层,用版本3时就可以实现缓存优化,对程序效率有所提高。3.在Matrix的成员函数里重载了()符号,函数名就是operator(),如A是Matrix类的对象,重载后就可以这样用,A.operator()(2,1) = 77等效于A(2, 1) = 77。_c++ 矩阵

laravel-admin 详情显示时字段显示为表关联的字段_laraveladmin $form->table 关联-程序员宅基地

文章浏览阅读2k次。1.表关系2.Model关联关系3.代码展示4.页面展示5.总结主要是as非常的好用;)_laraveladmin $form->table 关联

Cahpter 3 : Defining Clocks(ug903:Vivado using constraints_bufg_gt div-程序员宅基地

文章浏览阅读864次。Cahpter 3 : Defining Clocks(ug903:Vivado using constraints_bufg_gt div

burp suite 使用_bp测payload-程序员宅基地

文章浏览阅读1k次,点赞31次,收藏20次。请求的总数是 payload 组中 payload 的总数。我们可以通过 ADD 增加自己编辑的字符串,可以通过 paste 粘贴复制的字符串,可 以通过 load 来读取字典,这时候就需要网上的强大的字典了 dic.txt.下面随意举两个例题,大多数的 Bp 的使用都是很多题中的一个小小的步骤, 在这 里就不详细的讲解了,在看其他题目的时候也会涉及不少的 Bp 的使用。其中$$之间所夹的信息就是在测试中不断被替换的信息,我们可以编辑需要测试的 位置, 右侧有四个按钮, 也可以手动敲上去或者删除。_bp测payload

PPTP源码分析_mgr: dropped small initial connection-程序员宅基地

文章浏览阅读3.6k次。1. 软件版本: pptpd-1.4.0.tar.gz2.源码框架:3.源码详解:3.1 pptpctrl详解: pptpctrl是一个可独立调用的二进制可执行文件。 pptpctrl是pptp服务的管理程序,其通常被pptp程序调用,而不是提供给用户使用,其具体使用方法可查看man手册man pptpctrl.命令格式: _mgr: dropped small initial connection

python 小说 小说_python潇湘书院网站小说爬虫-程序员宅基地

文章浏览阅读431次。很久没有写爬虫了,最近接到一个抓取小说的项目顺便做此纪录练练手,之后工作中可能也会有部分场景要用到爬虫,爬取竞争对手进行数据分析什么的。目标网站:潇湘书院环境准备:python3requests库BeautifulSoup库整体思路抓取这个小说网站免费板块的所有内容,查看页面发现这个板块一共有6697页,每页有20本小说,那整体思路就是先抓取每页的20个小说名称和url,然后进入每本小说的阅读地址..._爬取潇湘书院书名排行榜python代码

推荐文章

热门文章

相关标签