一、平移地图

移动地图的原理是利用手指在屏幕上拖动的距离,转换为在地图上距离,把地图坐标加上偏移的距离实现地图移动。

由于地图是绘制到Bitmap上的,所以地图移动和缩放的过程只要改变Bitmap的矩阵即可,待移动和缩放完成后,再根据新的地图范围重新渲染地图。

地图移动过程的关键代码:

offsetX=newX-lastX

offsetY=newY-lastY

matrix.postTranslate(offsetX, offsetY)

canvas.drawBitmap(Bitmap,matrix,paint)

移动完成后重新计算地图范围的关键代码:

1、计算偏移值

offsetX=newX-startX

offsetY=newY- startY

offsetMapX= offsetX*resolution

offsetMapY= offsetY*resolution

2、重新计算坐标

minX = mapExtent.getMinX()-offsetMapX

minY = mapExtent.getMinY()+offsetMapY

maxX = mapExtent.getMaxX()-offsetMapX

maxY = mapExtent.getMaxY()+offsetMapY

二、缩放地图

地图缩放的原理是利用两指在屏幕上滑动时,两指之间的距离变化比值进行缩放地图,地图缩放时,两指之间的中心点保持坐标不变。

地图缩放时的关键代码:

newDis=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))   //计算两指之间的距离

scale=newDis/lastDis                                                   //两指在点击屏幕到离开屏幕时的距离比

matrix.postScale(scale, scale, this.startX, this.startY);

canvas.drawBitmap(Bitmap,matrix,paint)

三、在android下触发的事件

由于地图的平移和缩放是用手指完成的,所以对地图进行平移和缩放都是在用于绘制地图的view上的onTouchEvent事件里面完成,下面是这个事件的代码(其他代码就不公开了):

public boolean onTouchEvent(MotionEvent motionEvent){
int x1=(int) motionEvent.getX(0);
int y1 =(int)motionEvent.getY(0);
int x2=-1;
int y2=-1;
if (motionEvent.getPointerCount() == 1) { //平移
if(isZoom==true){
return;
} switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
isTouching=true;
matrix=new Matrix();
this.pointerPressed(x1, y1, x2, y2);
break;
case MotionEvent.ACTION_UP:
this.isRefreshMap=false;
this.pointerReleased(x1, y1, x2, y2);
isTouching=false;
break;
case MotionEvent.ACTION_MOVE:
this.pointerDragged(x1, y1, x2, y2);
break;
}
} else if (motionEvent.getPointerCount() == 2) { //缩放
isZoom=true;
this.x=-1;
this.y=-1; x2=(int)motionEvent.getX(1);
y2=(int)motionEvent.getY(1); if(motionEvent.getAction() != MotionEvent.ACTION_MOVE){
if(this.lastDis<0){
isTouching=true;
matrix=new Matrix();
this.startZoom(x1, y1, x2, y2);
}else
{
this.isRefreshMap=false;
this.endZoom(x1, y1, x2, y2);
isZoom=false;
isTouching=false;
}
}else
{
this.touchZoom(x1, y1, x2, y2);
}
}
}

地图的平移、缩放的实现(android版)的更多相关文章

  1. Java用Dijkstra算法实现地图两点的最短路径查询(Android版)

    地图上实现最短路径的查询,据我了解的,一般用Dijkstra算法和A*算法来实现.由于这是一个课程项目,时间比较急,而且自己不熟悉A*算法,所以参考网上的Dijkstra算法(http://blog. ...

  2. cordova百度地图定位Android版插件

    本插件利用百度地图提供的定位功能进行Android版手机定位. 为什么没有iOS版? 因为iOS版有官方的定位插件cordova-plugin-geolocation可以使用. 请参照:cordova ...

  3. 一步一步手写GIS开源项目-(2)地图平移缩放实现

    系列文章目录 一步一步手写GIS开源项目-(1)500行代码实现基础GIS展示功能 一步一步手写GIS开源项目-(2)地图平移缩放实现 项目github地址:https://github.com/Hu ...

  4. 【OpenGL(SharpGL)】支持任意相机可平移缩放的轨迹球实现

    [OpenGL(SharpGL)]支持任意相机可平移缩放的轨迹球 (本文PDF版在这里.) 在3D程序中,轨迹球(ArcBall)可以让你只用鼠标来控制模型(旋转),便于观察.在这里(http://w ...

  5. 支付宝 Android 版使用的开源组件

    支付宝 Android 版使用的开源组件 前言: 花了点时间整理了 支付宝 Android 客户端使用的开源组件,给需要的同学.在你不知道用什么开源框架的时候可以作下参考,毕竟支付宝是阿里的重量级产品 ...

  6. 用Kotlin破解Android版微信小游戏-跳一跳

    前言 微信又更新了,从更新日志上来看,似乎只是一次不痛不痒的小更新.不过,很快就有人发现,原来微信这次搞了个大动作——在小程序里加入了小游戏.今天也是朋友圈被刷爆的缘故. 看到网上 有人弄了一个破解版 ...

  7. [转]网易云音乐Android版使用的开源组件

    原文链接 网易云音乐Android版从第一版使用到现在,全新的 Material Design 界面,更加清新.简洁.同样也是音乐播放器开发者,我们确实需要思考,相同的功能,会如何选择.感谢开源,让我 ...

  8. 高德地图Demo运行报错 com.android.ide.common.process.ProcessException: Failed to execute aapt

    最近由于有需求去做导航方面的Android开发,很是无奈,以前也的确是没有搞过,领导开大会当着所有人的面说这是给我分配的第一个工作,无论如何要做好,突然间感觉压力好大,自己已经多年没有敲过代码,而且A ...

  9. Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路

     Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路 先看一看我的代码运行结果. 代码运行起来初始化状态: 点击开始按钮,唱片机的机械臂匀速接近唱片磁盘,同时唱片磁盘也 ...

随机推荐

  1. [原创] PHP 使用Redis实现锁

    目录 锁实现的注意点 加锁 connect 与 pconnect 解锁 Redis 中使用 Lua 脚本的注意点 Redis集群分布式锁 RedLock 算法 锁实现的注意点 互斥: 任意时刻, 只能 ...

  2. c#开发Android初学(一)

    我也是最近开始学习用c#开发android,最近找在好心网友那里下到了四个android开发安卓的视频(传智的)有想要的朋友可以留下邮箱 废话不多收,分享我最近一个星期的成果. 先看最主要的一个获取数 ...

  3. javascript005_Object

    •我们目前为止大多数引用类型都是Object类型的实例,Object也是ECMAScript中使用最多的一种类型(就像java.lang.Object一样,Object类型是所有它的实例的基础). – ...

  4. 用idea搭建一个简单的SSM的Demo

    1.新建一个maven  web app项目 结构如下 resources的资源文件如下 applicationContext.xml 的配置 <?xml version="1.0&q ...

  5. 《LeetBook》leetcode题解(13):Roman to Integer[E]

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  6. Install NDK in Eclipse/Android Studio

    1. Download NDK https://developer.android.com/tools/sdk/ndk/index.html 2.Install NDK $ tar xvf andro ...

  7. python-queue队列通信

    #!/usr/bin/python from multiprocessing import Process,Queue import time l=[] q=Queue() def f(name): ...

  8. ubuntu 16.04安装好后没声音的解决方法

    刚安装好Ubuntu16.04 后没声音,找了好多方法都不行,看到网上说通过安装pavucontrol和alsamixer调节解决,最后无意发现一个方法,总算是可以用了,在此记录一下.可能有的可以解决 ...

  9. Velocity工作原理解析和优化

    在MVC开发模式下,View离不开模板引擎,在Java语言中模板引擎使用得最多是JSP.Velocity和FreeMarker,在MVC编程开发模式中,必不可少的一个部分是V的部分.V负责前端的页面展 ...

  10. Flex4 初始化过慢解决方法

    昨天找了个免费.net空间,想测试一下做的一个简单Flex4 上传项目的效果.上传所有文件到网站之后,访问项目页面,进度条一点一点艰难的向前移动,到了100%后却不出现程序界面,等待一会儿还是没有出现 ...