自定义地图开发(一)

前言:

oh my lord,憋了好久了。纷纷扰扰的闹剧算是结束了,关于这个项目的任务也暂停一段时间。趁现在,好好的把地图模块整理一下。

要做的项目中,有一个功能是校园地图。但是不希望用现有的地图SDK来展示,故此,我只好自己写一个简单的模块来展示一张平面图。

先放一张效果图吧,当时匆忙,很多地方未完善,但最终的效果应该是这个样子的:

至于地图上那个图片,是用来做定位时的准星的……不要在意这些细节。


正文

好的,现在,咱们的教程,正式开始:

本章教程中,我需要一个组件,可以用来监听不规则形状的地图元件,并且可以在点击他的时候做一些响应。

为了简化开发步骤,我做了以下简化地图:

地图素材--->  地图--->...美观什么的不要在意。

第一张图中,花花绿绿的当做地图背景(1000*1000),后两个不规则的当做地图元件。拼起来,做成后面的地图。


1.那么第一个问题出现了:我的屏幕是480*800,如何展示一张1000*1000的图呢?

在实验过程中,我们发现,无论layout_width怎么设置,系统都会将其强制转换为屏幕大小。这个问题,我头疼了好久。最后终于发现,问题的答案很简单~

1     @Override
2 protected void onCreate(Bundle savedInstanceState) {
3 this.getWindow().setLayout(2000, 2000);//关键代码
4 super.onCreate(savedInstanceState);
5 setContentView(R.layout.activity_main);
6 }

既然屏幕太小,把屏幕值调大些就好了。啊!从此天高任鸟飞,一报憋死人之仇。我心里大大快乐,得意洋洋的将屏幕大小调成了2000*2000,再也不担心View被缩水啦~

接下来,我们将地图数据填写到XML文件中。


2.卓克,填写地图数据时,如何快速的知道地图元件在地图上的位置呢?

首先,打开PS,加载图形。以下图为例,如果我们想知道第一个图层(正方形黑块)的坐标和大小。

1:选中第一个图层,使其变为高亮状态(如下图的蓝色)。

2:按Ctrl+T。

3:按F8打开信息窗口。这时可以看到,坐标和宽高都显示出来了。

   

另外,在XML文件中设置位置的时候,通常一些超出屏幕的imageView看不到设置效果。

为了更好的实时看到效果,我们可以这样设置:

瞧到没,换个超大分辨率的来展示XML就好了~


3.卓克,地图数据填完了,也展示了出来,可是屏幕大小该是多少还是多少,地图显示不全啊!

那好,咱想个办法,让咱的地图可以动起来。……OnTouchListener,即拖图功能。

具体的实现,待会的源码里面有,从网上搜索“android开发 拖图”也有一大堆教程,在此不做赘述,只将实现原理简单一说:

实现原理,就是通过监听手指(触点)落下的位置、移动的位置来计算要让图片偏移的位置,然后用view.layout(l,t,r,b)方法让地图移动到指定位置。

我写过一个简单的拖图类,有兴趣的也可以下载下来,参考一下。


4,好了,你已经成功的将地图放进了程序里,并且可以自由拖动了,可是我们马上发现一个问题,当更新一个textView、显示/隐藏一个imageView的时候,地图完全乱了!

why! damn it! WTF!

不要悲伤,不要心急,答案让我告诉你……这个时候,我们需要用到一个方法,就是ViewGroup中的onLayout!

干嘛用的?就是固定子元件用的!

网上这么多好教程,不推荐给大家太可惜了:Android的onLayout、layout方法讲解

嘿嘿......谁敢说我懒!pia飞!

相信看了以上的博客,关于onLayout和layout,以及自定义ViewGroup都有所了解了。


5.这样的话,监听有冲突呀!甚至什么时候是点击,什么时候是拖动该怎么判断呢?

首先呢,判断拖动还是点击,可以这样来做:


 1     private boolean shake = false, click = false;// 手指抖动修正
2 @Override
3 public boolean onTouch(View v, MotionEvent event) {
4 switch (event.getAction()) {
5 case MotionEvent.ACTION_DOWN:
6 click = true;// 抖动校正
7 // 记录触点按下时的位置
8 baseTX = event.getRawX();
9 baseTY = event.getRawY();
10 break;
11 case MotionEvent.ACTION_MOVE:
12 // 计算当前手指位置与初始位置间的偏移量
13 float sx = event.getRawX() - baseTX;
14 float sy = event.getRawY() - baseTY;
15
16 // 判断是否是抖动
17 shake = (Math.abs(sx) < shakeRange) && (Math.abs(sy) < shakeRange);// 注意用绝对值
18 if (shake) {// 抖动校正
19 click = true;//抖动
20 } else {
21 click = false;//拖动
22 }
23 break;
24 case MotionEvent.ACTION_UP:
25 if (click) {
26 click = false;
27 //代码运行到这里,说明是点击动作。
28 //可以在这里面写一些处理方法
29 }
30 break;
31 default:
32 break;
33 }
34
35 return true;
36 }

唉,唯一的一大段代码献给了这么简单的一个小功能。算了,不管这些,继续探讨我们的思路。


6.可是,卓克,这样,咱也不知道什么时候点击了哪个元件呀!

ok,接下来咱讲讲怎么根据从onTouch中获取的坐标,判断点击没点到有颜色的区域。

首先,我们将这个坐标转化为相对于元件的坐标。

1     trueX = x - this.getChildAt(i).getLeft();
2 trueY = y - this.getChildAt(i).getTop();

得到相对于元件的坐标后,使用以下方法判断该点是否透明

1     pixel = bitmaps.get(i).getPixel(trueX, trueY);
2 if (pixel != 0) {//点击点不透明
3 //do something useful
4 break;
5 }

判断出点击到哪个图片,我们就可以对点击到的元件为所欲为咯~比如setAlpha、setVistbility之类的……

好的,目前为止所以的关键思路和代码都有了。自己动手,丰衣足食,让我们看看最终实现的效果吧:

    

半透明的地图元件在点击后变成了完全透明,而且无论是拖动还是在新线程中更新button的text布局丝毫不乱~


源码内附有详细的注释和使用方法(详细的有点过分……),敬请点击下载

好滴,这一章就到这吧。

下一章,将会添加百度地图lbs定位到咱们的程序里。觉得有帮助,可以关注啊、收藏啊、订阅啊、留言啊……之类的。

时间: 2024-10-12 23:48:24

自定义地图开发(一)的相关文章

iOS原生地图开发指南续——大头针与自定义标注

iOS原生地图开发指南续——大头针与自定义标注 出自:http://www.sxt.cn/info-6042-u-7372.html 在上一篇博客中http://my.oschina.net/u/2340880/blog/415360系统总结了iOS原生地图框架MapKit中主体地图的设置与应用.这篇是上一篇的一个后续,总结了系统的大头针视图以及自定义标注视图的方法. 一.先来认识一个协议MKAnnotation 官方文档告诉我们,所有标注的类必须遵守这个协议.所以可以了解,标注这个概念在逻辑属

地图开发之批量加载点自定义标注 路线规划 批量点 快速定位

首先声明一下  我是新手菜鸟  这些经验是我自己在学习的过程中遇到的一些东西 归纳总结的时候按照我自己觉得总要或者是难点来做的  大家不喜勿喷啊 之前做了一个地图开发的功  能没有很深入也只是局部现在整理一下首先要说的是地图的功能是非常好做的大家不要别吓到了不会做的东西你看官方的api你可以从不懂到精通,我现在觉得api是最好的老是 然后要是遇到不懂得你可以找博客文章或者百度来辅助. 首先百度地图是一个第三方的东西  基本上面应用第三方的都是都是通过接口或者js来调用的[个人暂时遇到的]所以在做

iOS定位服务与地图开发(4)---显示地图

iOS 6之前,苹果使用的是谷歌地图,iOS 6之后,苹果使用了自己的地图(国内好像用的是高德地图),但是API编程接口与iOS 5相比没有太大变化. iOS 应用程序中使用Map Kit API开发地图应用程序,使用MKMapView类作为地图显示视图,其委托协议是MKMapViewDelegate. 1.显示地图: .h文件中代码 #import <MapKit/MapKit.h> @interface YXCViewController <MKMapViewDelegate>

百度地图开发(二)之添加覆盖物 + 地理编码和反地理编码

之前写过一篇关于百度地图开发的blog,主要介绍了百度地图的基本地图的显示. 详见:Android百度地图开发(一)之初体验 下面来看一下地图上覆盖物的添加,以及地理编码和反地理编码. 添加覆盖物 在地图上添加覆盖物,一般需要以下几个步骤: 1. 定义坐标点,有可能是一个,有可能是多个(比如:多边形覆盖物). 2. 构造OverlayOptions(地图覆盖物选型基类). 3. 在地图上添加覆盖物. 4. 添加相应的监听事件. 在API中可以看到,BaiDuMap类中有一个方法: 这个方法就是用

[android] 百度地图开发 (三).定位当前位置及getLastKnownLocation获取location总为空问题

       前一篇百度地图开发讲述"(二).定位城市位置和城市POI搜索",主要通过监听对象MKSearchListener类实现城市兴趣点POI(Point of Interest)搜索.该篇讲述定位当前自己的位置及使用getLastKnownLocation获取location总时为空值的问题. 一. 定位当前位置的原理及实现       定位当前位置可以通过LBS(Location Based Service,基于位置的服务),主要工作原理是利用无线网络Network或GPS定

[转]Net Framework引路蜂地图开发示例

From:http://www.2cto.com/kf/201207/140421.html 引路蜂地图也提供对.Net Framework平台的支持,可以开发桌面地图应用,由于Mono C#的跨平台特性,使用Visual Studio 和Mono引路蜂地图开发包开发的地图应用可以运行于Windows ,Lunix,Unix,Mac OS等平台.开发桌面应用比开发移动应用要容易的多,屏幕,内存等方面都比移动平台要宽裕的多.下面使用一个简单的应用来介绍一下.Net Framework引路蜂地图开发

iOS地图开发

原文地址:http://www.jianshu.com/p/1ae98a3ff9e4 在iOS中, 地图开发经常会用到的三个框架, 一个是苹果系统自带的MapKit框架, 另外两个, 一个是百度地图BMKMapView, 另一个是高德地图MAMapView. 当时我莫名的对一个问题产生了浓厚的兴趣, 就是百度地图和高德地图英文命名是什么意思!? 于是我就毫不蛋疼的去googol了, 而且还在他俩的社区提问这个问题! 终于, 在我的努力下弄明白他俩代表的意思了. 先看百度地图 BMKMapView

iOS原生地图开发进阶——使用导航和附近兴趣点检索

iOS原生地图开发进阶——使用导航和附近兴趣点检索 iOS中的mapKit框架对国际化的支持非常出色.在前些篇博客中,对这个地图框架的基础用法和标注与覆盖物的添加进行了详细的介绍,这篇博客将介绍两个更加实用的功能的开发:线路导航与兴趣点搜索.前几篇博客的链接如下: 地图基础用法详解:http://my.oschina.net/u/2340880/blog/415360. 添加大头针与自定义标注:http://my.oschina.net/u/2340880/blog/415441. 添加地图覆盖

iOS地图开发MapKit

现在O2O应用非常火,因为基于地理的社交和电子商务应用都有非常广阔的前景 二O2O的移动载体就是手机了(平板基本忽略不计),所以会点手机上Map开发还是不错的 首先苹果已经封装了一套地图框架供我们使用,首先要使用苹果提供的地图框架需要导入MapKit框架 导入完成后即可使用 首先在你的视图里拖入一个MapView, 然后运行就行了~这是你就会看到地图(如果用的是真机最好,模拟器有点蛋疼) 但是现实的是一个大大的地图,赶脚没什么用,我们需要的是一个比较精准的地图,这时进入MKMapView.h文件