一、平移地图
移动地图的原理是利用手指在屏幕上拖动的距离,转换为在地图上距离,把地图坐标加上偏移的距离实现地图移动。
由于地图是绘制到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版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路 先看一看我的代码运行结果. 代码运行起来初始化状态: 点击开始按钮,唱片机的机械臂匀速接近唱片磁盘,同时唱片磁盘也 ...
随机推荐
-
Python 爬虫3——第一个爬虫脚本的创建
在进行真正的爬虫工程创建之前,我们先要明确我们所要操作的对象是什么?完成所有操作之后要获取到的数据或信息是什么? 首先是第一个问题:操作对象,爬虫全称是网络爬虫,顾名思义,它所操作的对象当然就是网页, ...
-
jQuery EasyUI 使用笔记
大家有四次抢票机会.第一次是放票时间之后的30分钟.第二次机会是开车前的15天.第三个机会是开车前的48小时.第四个机会是开车前的24小时. $("#gys_key").combo ...
-
Linux 下 netbeans 字体抗锯齿正解
转自:http://leenjewel.blog.163.com/blog/static/601937922010124444051/ 说来这个不难,主要是我看网上有的写的不是很明确,甚至有的写的根本 ...
-
nginx中使用srcache_nginx模块构建缓存
nginx中可以将lua嵌,让nginx执行lua脚本,可以处理高并发,非阻塞的处理各种请求,openresty项目中可以使用nignx可以直接构建 srcache_nginx + redis 缓存, ...
-
BZOJ4032 : [HEOI2015]最短不公共子串
第一问: 对B串建立SAM,暴力枚举A的每个子串,在SAM上走,若失配则可行. 第二问: 设g[i][j]表示B串的第i个字符之后最早出现的字符j的位置,暴力枚举A的每个子串,按照g贪心地走,若失配则 ...
-
解决Maven中Missing artifact javax.jms:jms:jar:1.1:compile
搭建好项目后报错: Missing artifact javax.jms:jms:jar:1.1:compile 于POM.xml中 解决方案: 一 :在nexus中配置一个代理仓库 地址为 ...
-
最基本MySQL命令及vi命令
1.MySQL基本命令操作 Mysql的所有命令末尾都需要以分号结束,一条命令可以分成多行书写. 连接数据库:mysql –u root –p: 查看所有数据库:show databases; 创建数 ...
-
selenium webdriver (python)
selenium webdriver (python) 第一版PDF Posted on 2013-08-30 22:59 虫师 阅读(221) 评论(0) 编辑 收藏 前言 如果你是一位有pytho ...
-
python笔记8-列表list操作、多维数组
#!/usr/bin/python #python里面有个这个话,代表在linux下运行的时候#去哪个目录下找python的解释器,在windows上运行不用写# coding:utf-8# __*_ ...
-
Shiro的认证授权
shiro安全框架入门整理 package com.shiro.test; import org.apache.shiro.SecurityUtils; import org.apache.shiro ...