ArcGIS for Android 中实现要素绘制时固定MapView
最近在项目中遇到这么一个情况,在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);
}
ArcGIS for Android 中实现要素绘制时固定MapView的更多相关文章
- Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
Android中View的绘制过程 onMeasure方法简述 附有自定义View例子 Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android fr ...
- 【转】Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布 ...
- Android 中View的绘制机制源代码分析 三
到眼下为止,measure过程已经解说完了,今天開始我们就来学习layout过程.只是在学习layout过程之前.大家有没有发现我换了编辑器,哈哈.最终下定决心从Html编辑器切换为markdown编 ...
- Android 中View的绘制机制源代码分析 一
尊重原创: http://blog.csdn.net/yuanzeyao/article/details/46765113 差点儿相同半年没有写博客了,一是由于工作比較忙,二是认为没有什么内容值得写, ...
- Android 中View的绘制机制源代码分析 二
尊重原创:http://blog.csdn.net/yuanzeyao/article/details/46842891 本篇文章接着上篇文章的内容来继续讨论View的绘制机制,上篇文章中我们主要解说 ...
- Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程
最近在面试Android,今天出了一个这样的题目,即如题: 我当时以为生命周期是这样的: onCreate --> onStart -- ---> onResume ---> onP ...
- Android中使用ListView绘制自定义表格(2)
上回再写了<Android中使用ListView绘制自定义表格>后,很多人留言代码不全和没有数据样例.但因为项目原因,没法把源码全部贴上来.近两天,抽空简化了一下,做了一个例子. 效果图如 ...
- Android中View的绘制流程(专题讲解)
Android中的UI视图有两种方式实现:.xml文件(实现代码和UI的分离)和代码实现. Android的UI框架基本概念: 1. Activity:基本的页面单元,Activity包含一个Wind ...
- Android中实现照片滑动时左右进出的动画的xml代码
场景 Android中通过ImageSwitcher实现相册滑动查看照片功能(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/det ...
随机推荐
- 我的笔记文档版本控制系统-MediaWiki-回到顶部/链接放大/升级
为了练习自己的JS.CSS基本功,这些天和MediaWiki干上了!^_^ 下面是我的MediaWiki新添加的功能: 回到顶部 链接放大 MediaWiki升级 回到顶部 回到顶部是很多网站的基本功 ...
- Web应用之ActionForm
看链接: 主要就是讲了一下form表单的传递,bean的工作原理. http://blog.csdn.net/java_pengjin/article/details/5987330
- Cactus详细讲解
Cactus建议一年以上有经验的人玩,刚入门MVC,不了解下列组件请先自行学习,切勿好高骛远. Cactus的组成(基于.net4.5.2):Dapper+MVC4+autofac 前端css框架pu ...
- Redis常见7种使用场景(PHP)
转发:https://www.jianshu.com/p/2f3add45351b Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并 ...
- MATLAB求解非齐次线性方程组
例如方程组: 法1:左除法 >> A=[3 1 -1;1 2 4;-1 4 5];b=[3.6;2.1;-1.4]; >> x=A\b x = 1.4818 -0.4606 0 ...
- C4-总结
呃,很难受的比赛,中途做到口干舌燥还想尿尿//哦,题目,出的很棒,什么都可以做做,什么都做不下来. 怎么说呢?好像也没犯什么错误,除了日常开始手抖了一下...后面状态进入挺快的,而且遗憾?3-2吧,t ...
- SQL Server 2012 安装——安装 OR 卸载
前言 上篇介绍了.net framework 3.5的安装,这次介绍一下,SQL Server2012的安装和彻底卸载.根据百度,下面是自己根据自己实际情况整理的安装步骤: 安装 见安装步骤( ...
- 洛谷P1066 2^k进制数
P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. ( ...
- 洛谷P1053 篝火晚会
P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同学,编号从1到 ...
- 谢特——后缀数组+tire 树
题目 [题目描述] 由于你成功地在 $ \text{1 s} $ 内算出了上一题的答案,英雄们很高兴并邀请你加入了他们的游戏.然而进入游戏之后你才发现,英雄们打的游戏和你想象的并不一样…… 英雄们打的 ...