热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ArcGISforAndroid中实现要素绘制时固定MapView

最近在项目中遇到这么一个情况,在MapView中要求实现绘制点、线、面。在这里面就会遇到这么一个问题,绘制折线和多边形型时,每点击一个点屏幕就会跟着晃,使用起来很不方便(使用Not

  最近在项目中遇到这么一个情况,在MapView中要求实现绘制点、线、面。

  在这里面就会遇到这么一个问题,绘制折线和多边形型时,每点击一个点屏幕就会跟着晃,使用起来很不方便(使用Note2 触控笔),所以有没有一种方法让我点击绘制界面开始,地图界面锁死,在绘制结束时ontouch事件才响应。

  现在先说说思路,一般来说我设置MapView的OnTouch事件为Null,屏幕就不会跟着动了,但是同时OnTouch事件也没法使用了,这个方法不可用。但是流状线和流状面绘制是怎么实现的呢?经过查询,在OnTouch的中有以下两个方法:

  public boolean onDragPointerMove(MotionEvent from, MotionEvent to) 

  public boolean onDragPointerUp(MotionEvent from, MotionEvent to) 

这两个方法分别对应了按下时的滑动事件和滑动松开事件,我们让这两个方法在绘制折线和自定义面时返回false,屏幕就不会跟着跑了 。

MapOnTouchListener类如下:

  public class MyTouchListener extends MapOnTouchListener 
    {
        MultiPath polyline,polygon,line,freepolygon;
        DrawType type = DrawType.None;
        Point startPoint = null;
        MapView map = null;
        DrawWidget drawwidget =null;
        
        private View calloutView =null;
      
        int graphicFreelineId = 0;
        int graphicLineId = 0;
        int graphicFreePloygOnId= 0;
        int graphicPloygOnId= 0;
   
        public MyTouchListener(Context context, MapView view,DrawWidget  d,View v) {  
            super(context, view);  
            map = view;
            drawwidget=d;
            calloutView = v;
       }
     
        public void setType(DrawType type) {
          this.type = type;
        }
        public DrawType getType() {
          return this.type;
        }
        
        @Override
        public boolean onSingleTap(MotionEvent e) 
        {
            if(type == DrawType.Point) 
            {
                Geometry geo = map.toMapPoint(new Point(e.getX(), e.getY()));
                Graphic gra = addGeometryToLocalDB(geo);            
                if(gra!=null){
                    GraUID =mGraphicsLayer.addGraphic(gra);//添加要素至数据库
                    //弹出callout窗口
                    Point coordinate=(Point) geo;
                    drawwidget.showCallout(coordinate, calloutView);        
                    mMyTouchListener.setType(DrawType.None);
                }         
                return true;
            }else if(type == DrawType.Line){
                //获取屏幕点击坐标点
                Point point = map.toMapPoint(new Point(e.getX(), e.getY()));              
                if (startPoint == null) {                    
                    startPoint = point;        
                    line = new Polyline();
                    line.startPath(point);        
                    //添加节点信息
                    Graphic graphic = new Graphic(point,new SimpleMarkerSymbol(Color.BLACK,5,STYLE.CIRCLE));
                    tmpLayer.addGraphic(graphic);
                    //添加线要素             
                    Graphic graphic_line = new Graphic(line,FeatureSymbol.lineSymbol_new);
                    graphicLineId = mGraphicsLayer.addGraphic(graphic_line);    
                } else{                    
                    //添加线要素节点
                    Graphic graphic_t = new Graphic(point,new SimpleMarkerSymbol(Color.BLACK,5,STYLE.CIRCLE));
                    tmpLayer.addGraphic(graphic_t);    
                    //更新线信息
                    line.lineTo(point);
                    mGraphicsLayer.updateGraphic(graphicLineId, line); 
                }               
            }else if(type == DrawType.Polygon){
                //获取屏幕点击坐标点
                Point point = map.toMapPoint(new Point(e.getX(), e.getY()));              
                if (startPoint == null) {
                    startPoint = point;        
                    polygon = new Polygon();
                    polygon.startPath(point);        
                    //添加节点信息
                    Graphic graphic = new Graphic(point,new SimpleMarkerSymbol(Color.BLACK,5,STYLE.CIRCLE));
                    tmpLayer.addGraphic(graphic);
                    //添加多边形要素             
                    Graphic graphic_polygon = new Graphic(polygon,FeatureSymbol.polygonSymbol_new);
                    graphicPloygonId = mGraphicsLayer.addGraphic(graphic_polygon);          
                } else{                    
                    //添加要素节点
                    Graphic graphic_t = new Graphic(point,new SimpleMarkerSymbol(Color.BLACK,5,STYLE.CIRCLE));
                    tmpLayer.addGraphic(graphic_t);    
                    //更新多边形信息
                    polygon.lineTo(point);
                    mGraphicsLayer.updateGraphic(graphicPloygonId, polygon); 
                }               
            }
            return false;
        }
        
        @Override
        public boolean onDoubleTap(MotionEvent event) {
            tmpLayer.removeAll();
            if (type == DrawType.Line) {    
                if(line!=null){
                    Graphic gral = addGeometryToLocalDB(line);//添加要素至数据库
                    if(gral!=null){
                        mGraphicsLayer.updateGraphic(graphicLineId,gral); 
                        drawwidget.showCallout(startPoint, calloutView);
                    }else{
                        mGraphicsLayer.removeGraphic(graphicLineId);
                    }    
                }else{
                    Toast.makeText(DrawWidget.super.context,"未添加任务要素!",Toast.LENGTH_SHORT).show();
                }
                GraUID =graphicLineId;
                startPoint = null;
                line = null;
                mMyTouchListener.setType(DrawType.None);
                 DrawWidget.super.showMessageBox("折线绘制结束!");
                return true;
            }else if(type == DrawType.Polygon){        
                if(polygon!=null){
                    Graphic gra = addGeometryToLocalDB(polygon);
                    if(gra!=null){
                        mGraphicsLayer.updateGraphic(graphicPloygonId,gra ); //添加要素至数据库    
                        //弹出callout窗口
                        drawwidget.showCallout(startPoint, calloutView);  
                    }else{
                        mGraphicsLayer.removeGraphic(graphicPloygonId);
                    }  
                }else{
                    Toast.makeText(DrawWidget.super.context,"未添加任务要素!",Toast.LENGTH_SHORT).show();
                }
                GraUID =graphicPloygonId;
                startPoint = null;
                polygon = null;
                mMyTouchListener.setType(DrawType.None);
                DrawWidget.super.showMessageBox("多边形绘制结束!");
                return true;        
            }
            return super.onDoubleTap(event);
        }
        
        //@Override
        public boolean onDragPointerMove(MotionEvent from, MotionEvent to) 
        {
            Point mapPt = map.toMapPoint(to.getX(), to.getY());
            if (type == DrawType.Freeline) 
            {
                if (startPoint == null) 
                {
                    polyline = new Polyline();
                    startPoint = map.toMapPoint(from.getX(), from.getY());
                    polyline.startPath((float) startPoint.getX(), (float) startPoint.getY());
                    graphicFreelineId = mGraphicsLayer.addGraphic(new Graphic(polyline,FeatureSymbol.lineSymbol_new));
                }
                polyline.lineTo((float) mapPt.getX(), (float) mapPt.getY());
                mGraphicsLayer.updateGraphic(graphicFreelineId,new Graphic(polyline,FeatureSymbol.lineSymbol_new));
                return true;
            }
            else if (type == DrawType.FreePolygon) 
            {
                //polygonSymbol.setAlpha(80);
                if (startPoint == null) 
                {
                    freepolygon = new Polygon();
                    startPoint = map.toMapPoint(from.getX(), from.getY());
                    freepolygon.startPath((float) startPoint.getX(), (float) startPoint.getY());
                    graphicFreePloygonId = mGraphicsLayer.addGraphic(new Graphic(freepolygon,FeatureSymbol.polygonSymbol_new));
                }
                freepolygon.lineTo((float) mapPt.getX(), (float) mapPt.getY());
                mGraphicsLayer.updateGraphic(graphicFreePloygonId, new Graphic(freepolygon,FeatureSymbol.polygonSymbol_new));
                return true;
            }else if(type == DrawType.Polygon||type == DrawType.Line){
                return false;//返回false,使屏幕不滑动固定死(两个位置)
            }
            return super.onDragPointerMove(from, to);
        }

        @Override
        public boolean onDragPointerUp(MotionEvent from, MotionEvent to) 
        {
            if(type == DrawType.Line ||type == DrawType.Polygon){
                return false;//返回false,使屏幕不滑动固定死(两个位置)
            }else if(type ==DrawType.Freeline ){
                Graphic gral = addGeometryToLocalDB(polyline);//添加要素至数据库
                if(gral!=null){
                    mGraphicsLayer.updateGraphic(graphicFreelineId,gral);
                    drawwidget.showCallout(startPoint, calloutView);
                }else{
                    mGraphicsLayer.removeGraphic(graphicFreelineId);
                }
                GraUID = graphicFreelineId;
                startPoint = null;
                polyline = null;//流状线
                DrawWidget.super.mapView.setOnTouchListener(mDefaultMyTouchListener);
            }else if(type == DrawType.FreePolygon){
                Graphic gra = addGeometryToLocalDB(freepolygon);
                if(gra!=null){
                    mGraphicsLayer.updateGraphic(graphicFreePloygonId,gra);//添加要素至数据库
                    drawwidget.showCallout(startPoint, calloutView);
                }else{
                    mGraphicsLayer.removeGraphic(graphicFreePloygonId);
                }            
                GraUID = graphicFreePloygonId;
                startPoint = null;
                freepolygon = null;//流状面
                DrawWidget.super.mapView.setOnTouchListener(mDefaultMyTouchListener);
            } 
            return super.onDragPointerUp(from, to);
        }

 


推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了iOS开发中检测和解决内存泄漏的方法,包括静态分析、使用instruments检查内存泄漏以及代码测试等。同时还介绍了最能挣钱的行业,包括互联网行业、娱乐行业、教育行业、智能行业和老年服务行业,并提供了选行业的技巧。 ... [详细]
  • macOS命令行创建Android模拟器
    macOS下不安装AndroidStudio使用VSCode来开发Flutter应用使用命令行创建和管理Android模拟器设备avdmanageravdmanager 是一种命令 ... [详细]
  • 关于extjs开发实战pdf的信息
    本文目录一览:1、extjs实用开发指南2、本 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了10分钟了解Android的事件分发相关的知识,希望对你有一定的参考价值。什么是事件分发?大家 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • android 触屏处理流程,android触摸事件处理流程 ? FOOKWOOD「建议收藏」
    android触屏处理流程,android触摸事件处理流程?FOOKWOOD「建议收藏」最近在工作中,经常需要处理触摸事件,但是有时候会出现一些奇怪的bug,比如有时候会检测不到A ... [详细]
  • 涉及的知识点-ViewGroup的测量与布局-View的测量与布局-滑动冲突的处理-VelocityTracker滑动速率跟踪-Scroller实现弹性滑动-屏幕宽高的获取等实现步 ... [详细]
author-avatar
韩晓亮2602918655
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有