一、平移地图

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

由于地图是绘制到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. LINQ to Entities does not recognize the method , and this method cannot be translated into a store expression 解决办法

    根据用户输入的起始日期,查询以起始日期开始的前20条记录,在ASP.NET MVC的Controller代码中这样写: var Logs = db.Log.Take(20); if (!string. ...

  2. spring boot快速入门 2 :属性配置

    属性配置:在application.properties中配置 第一步:配置端口号和项目名 并启动 第二步:在浏览器查看请求 第二种配置方式: 在application.yml中配置.(较为常用) 注 ...

  3. getActionBar()为null的解决方法总结(引用他人)

    最近在看android actionBar的使用,环境为AndroidStudio,建一个简单的工程,功能为:两个按钮,一个单击用于显示actionbar,一个用于隐藏actionbar.默认acti ...

  4. MySQL设置远程连接服务器

    默认情况下,mysql只允许本地登录,如果要开启远程连接,则需要修改/etc/mysql/my.conf文件. 一.修改/etc/mysql/my.conf找到bind-address = 127.0 ...

  5. Java基本数据类型-包装类

    为什么会有基本数据类型包装类? 将基本数据类型封装成为对象,这样可以在对象中定义更多的方法来操作该数据 包装类常用操作就是用于基本数据类型与字符串之间的转换 基本数据类型对应的包装类 byte(Byt ...

  6. Tomcat8-启动脚本分析

    1. Tomcat也是一个java程序 最终的入口启动文件:org.apache.catalina.startup.Bootstrap 最后一条命令: start "Tomcat" ...

  7. python egg for centos 制作

    经常接触Python的同学可能会注意到,当需要安装第三方python包时,可能会用到easy_install命令.easy_install是由PEAK(Python Enterprise Applic ...

  8. 深入理解java集合框架之---------LinkedList

    日常开发中,保存一组数据使用的最多的就是 ArrayList, 其次就是 LinkedList 了. 我们知道 ArrayList 是以数组实现的,遍历时很快,但是插入.删除时都需要移动后面的元素,效 ...

  9. [心平气和读经典]The TCP/IP Guide(004)

    The TCP/IP Guide [Page 44, 45, 46] Structure and Organization of The TCP/IP Guide | TCP/IP指南的组织结构 Yo ...

  10. memcached 学习笔记 1

    一 简介 1 What is Memcached? Free & open source, high-performance, distributed memory object cachin ...