地图的平移、缩放的实现(android版)
一、平移地图
移动地图的原理是利用手指在屏幕上拖动的距离,转换为在地图上距离,把地图坐标加上偏移的距离实现地图移动。
由于地图是绘制到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版)的更多相关文章
- Java用Dijkstra算法实现地图两点的最短路径查询(Android版)
地图上实现最短路径的查询,据我了解的,一般用Dijkstra算法和A*算法来实现.由于这是一个课程项目,时间比较急,而且自己不熟悉A*算法,所以参考网上的Dijkstra算法(http://blog. ...
- cordova百度地图定位Android版插件
本插件利用百度地图提供的定位功能进行Android版手机定位. 为什么没有iOS版? 因为iOS版有官方的定位插件cordova-plugin-geolocation可以使用. 请参照:cordova ...
- 一步一步手写GIS开源项目-(2)地图平移缩放实现
系列文章目录 一步一步手写GIS开源项目-(1)500行代码实现基础GIS展示功能 一步一步手写GIS开源项目-(2)地图平移缩放实现 项目github地址:https://github.com/Hu ...
- 【OpenGL(SharpGL)】支持任意相机可平移缩放的轨迹球实现
[OpenGL(SharpGL)]支持任意相机可平移缩放的轨迹球 (本文PDF版在这里.) 在3D程序中,轨迹球(ArcBall)可以让你只用鼠标来控制模型(旋转),便于观察.在这里(http://w ...
- 支付宝 Android 版使用的开源组件
支付宝 Android 版使用的开源组件 前言: 花了点时间整理了 支付宝 Android 客户端使用的开源组件,给需要的同学.在你不知道用什么开源框架的时候可以作下参考,毕竟支付宝是阿里的重量级产品 ...
- 用Kotlin破解Android版微信小游戏-跳一跳
前言 微信又更新了,从更新日志上来看,似乎只是一次不痛不痒的小更新.不过,很快就有人发现,原来微信这次搞了个大动作——在小程序里加入了小游戏.今天也是朋友圈被刷爆的缘故. 看到网上 有人弄了一个破解版 ...
- [转]网易云音乐Android版使用的开源组件
原文链接 网易云音乐Android版从第一版使用到现在,全新的 Material Design 界面,更加清新.简洁.同样也是音乐播放器开发者,我们确实需要思考,相同的功能,会如何选择.感谢开源,让我 ...
- 高德地图Demo运行报错 com.android.ide.common.process.ProcessException: Failed to execute aapt
最近由于有需求去做导航方面的Android开发,很是无奈,以前也的确是没有搞过,领导开大会当着所有人的面说这是给我分配的第一个工作,无论如何要做好,突然间感觉压力好大,自己已经多年没有敲过代码,而且A ...
- Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路
Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路 先看一看我的代码运行结果. 代码运行起来初始化状态: 点击开始按钮,唱片机的机械臂匀速接近唱片磁盘,同时唱片磁盘也 ...
随机推荐
- springcloud(七)-Feign声明式REST调用
前言 前面我们使用的RestTemplate实现REST API调用,代码大致如下: public User findById(@PathVariable Long id) { return rest ...
- 查看APK包签名的方法。
1.查看 keystore $ keytool -list -keystore debug.keystore 结果: Keystore type: JKS Keystore provider: SUN ...
- Windows下的VMware导入到Mac的VMware Function
在windows下是以文件夹的形式存在的,但是在Mac下是以.vmwarevm为后缀的文件. 操作步骤: 把windows下的虚拟机整个文件夹拷贝到Mac,然后文件夹后面加上.vmwarevm. 然后 ...
- java 调用 C# 类库 实战视频, 非常简单, 通过 云寻觅 javacallcsharp 生成器 一步即可!
java 调用 C# 类库 实战视频, 非常简单, 通过 云寻觅 javacallcsharp 生成器 一步即可! 通过 云寻觅 javacallcsharp 生成器 自动生成java jni类库, ...
- deepin安装php5.6
sudo su -echo "deb http://ppa.launchpad.net/ondrej/php/ubuntu xenial main" | tee -a /etc/a ...
- CentOS7安装virtualbox
1.进入virtualbox官网 https://www.virtualbox.org/ 2.点击download 3.点击Linux distributions 4.向下翻至如图,并且进入同种框选页 ...
- vue引入bootstrap和fontawesome
npm install jquery npm install bootstrap npm install popper.js. import $ from 'jquery' import 'boots ...
- apollo应用配置集成及使用
apollo应用配置集成及使用 1. 开发环境Apollo地址 用户名:apollo 密码:admin 开发环境Apollo管理台地址:http://localhost:8070/ ...
- python 多线程与GIL
GIL 与 Python 线程的纠葛 GIL 是什么?它对 python 程序会产生怎样的影响?我们先来看一个问题.运行下面这段 python 代码,CPU 占用率是多少? # 请勿在工作中模仿,危险 ...
- 我们的GAME-TECH沙龙北京站完美收官了,都讨论了些啥?
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由 腾讯游戏云 团队首发与云+社区 摘要:4月13日,腾讯游戏云GAME-TECH游戏开发者技术沙龙于北京举办.此次活动是腾讯游戏云游戏 ...