zoukankan      html  css  js  c++  java
  • 地图的平移、缩放的实现(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);
            }
        }
    }        
  • 相关阅读:
    kafka消费者如何才能从头开始消费某个topic的全量数据
    kafka消费者客户端启动之后消费不到消息的原因分析
    JMeter测试工具中的参数化使用[函数助手]
    在IDEA中使用gradle配置打可执行jar包[可执行jar与其所依赖的jar分离]
    一次tomcat配置参数调优Jmeter压力测试记录前后对比
    IntelliJ IDEA 14.1.4导入项目启动报错:Error during artifact deployment.[组件部署期间出错]
    BZOJ2861 : 双向边定向为单向边
    BZOJ4313 : 三维积木
    BZOJ4714 : 旋转排列
    BZOJ1395 : [Baltic2005]Trip
  • 原文地址:https://www.cnblogs.com/gdguansun/p/4793097.html
Copyright © 2011-2022 走看看