{"id":2937934,"date":"2025-09-02T08:08:08","date_gmt":"2025-09-02T15:08:08","guid":{"rendered":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2937934"},"modified":"2025-09-02T08:08:08","modified_gmt":"2025-09-02T15:08:08","slug":"implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool","title":{"rendered":"How to implement custom geometry editing workflows with the programmatic reticle tool"},"author":359632,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[738191],"tags":[780803,27971,771862,28391,780807],"industry":[],"product":[769142,776202,768902,769152,768912,36601],"class_list":["post-2937934","blog","type-blog","status-publish","format-standard","hentry","category-developers","tag-arcgis-maps-sdk-for-native-maps","tag-editing","tag-feature","tag-geometry","tag-reticle","product-sdk-net","product-sdk-flutter","product-sdk-kotlin","product-sdk-qt","product-sdk-swift","product-developers"],"acf":{"authors":[{"ID":359632,"user_firstname":"Hamish","user_lastname":"Duff","nickname":"Hamish Duff","user_nicename":"hduff","display_name":"Hamish Duff","user_email":"hduff@esri.com","user_url":"","user_registered":"2024-07-26 10:03:08","user_description":"I'm a product engineer on the ArcGIS Maps SDKs for Native Apps team.","user_avatar":"<img data-del=\"avatar\" src='https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/07\/99325835-213x200.jpeg' class='avatar pp-user-avatar avatar-96 photo ' height='96' width='96'\/>"}],"short_description":"Learn how to use the programmatic reticle tool to implement custom geometry editing workflows in v200.8 of the Native Maps SDKs","flexible_content":[{"acf_fc_layout":"content","content":"<h2>Introduction<\/h2>\n<p>In GIS workflows, geometry editing is important for maintaining and enhancing spatial accuracy. It involves creating, editing, and updating map features to digitize new elements, refine existing boundaries, or integrate additional geographic data.<\/p>\n<p>ArcGIS Maps SDKs for Native Apps (Native Maps SDKs) offer geometry editing tools out of the box to help you quickly implement solutions to fit your workflow. The <a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.view.geometryeditor\/-vertex-tool\/index.html\">VertexTool<\/a> and <a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.view.geometryeditor\/-reticle-vertex-tool\/index.html\">ReticleVertexTool<\/a> are powerful tools the <a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.view.geometryeditor\/-geometry-editor\/index.html\">GeometryEditor<\/a> can use for a precise editing experience. Both of these tools are primarily driven by tap interactions based on an <a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.view.geometryeditor\/-interaction-configuration\/index.html\">InteractionConfiguration<\/a>. However, users have been requesting more ways to trigger these interactions besides taps, such as buttons or other triggers of their choosing. We introduced the <a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.view.geometryeditor\/-programmatic-reticle-tool\/index.html\">ProgrammaticReticleTool<\/a> in 200.8 of Native Maps SDKs to address these requests and facilitate triggers other than taps\/mouse clicks.<\/p>\n<p>In this blog, we will briefly explain what the reticle is and how it works. We will then explore how to use the <code>ProgrammaticReticleTool<\/code> to implement custom geometry editing workflows such as those driven by buttons or other triggers and those using custom context menus.<\/p>\n<p>It is assumed that you are already familiar with Native Maps SDKs geometry editing workflows. If you are not, please take a look at the <a href=\"https:\/\/mediaspace.esri.com\/media\/t\/1_p4dxtj9h?st=1720\">Feature Editing Workflows presentation<\/a> from the 2025 Esri Developer &amp; Technology Summit and the <a href=\"https:\/\/developers.arcgis.com\/kotlin\/edit-features\/edit-geometry\/\">Edit geometry documentation<\/a>.<\/p>\n<p><em>Note: While this blog&#8217;s concepts apply to all platforms in Native Maps SDKs (Kotlin, Qt, Swift, Flutter, and .NET), the code snippets are Kotlin.<\/em><\/p>\n"},{"acf_fc_layout":"content","content":"<ol style=\"list-style-type: decimal\">\n<li><a href=\"#reticle_background\">A brief background on the reticle<\/a><\/li>\n<li><a href=\"#example_workflows\">Example workflows<\/a>\n<ol style=\"list-style-type: lower-alpha;padding-left: 20px\">\n<li><a href=\"#multifunctional_button\">Multifunctional button workflow<\/a><\/li>\n<li><a href=\"#tap_select_zoom\">Tap to select and zoom<\/a><\/li>\n<li><a href=\"#other_triggers\">Using other triggers<\/a><\/li>\n<\/ol>\n<\/li>\n<li><a href=\"#summary\">Summary<\/a><\/li>\n<\/ol>\n<p>&nbsp;<\/p>\n"},{"acf_fc_layout":"kaltura","video_id":"1_myufg7ca","time":false,"start":0,"stop":""},{"acf_fc_layout":"content","content":"<h2><\/h2>\n<h2 id=\"reticle_background\">A brief background on the reticle<\/h2>\n<p>The <code>ReticleVertexTool<\/code>, introduced in 200.5, enhanced the mobile editing experience by enabling a reticle-based workflow that delivers greater precision on touch-based devices.<\/p>\n<p>The reticle is a visual guide displayed on top of the <a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.view\/-map-view\/index.html\">MapView<\/a> that stays in place as you pan or zoom the map. The default crosshair appearance of the reticle gives a visual indication of the precise location where a geometry operation (such as placing or selecting a vertex) will occur.<\/p>\n<p>Using the reticle you can edit geometries without your finger or stylus obstructing the area you are working on.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2938096,"id":2938096,"title":"GeometryEditorReticle","filename":"GeometryEditorReticle-1.gif","filesize":21890813,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/GeometryEditorReticle-1.gif","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool\/geometryeditorreticle-3","alt":"","author":"359632","description":"","caption":"GeometryEditor Reticle","name":"geometryeditorreticle-3","status":"inherit","uploaded_to":2937934,"date":"2025-09-01 16:16:19","modified":"2025-09-01 16:16:32","menu_order":0,"mime_type":"image\/gif","type":"image","subtype":"gif","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":416,"height":456,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/GeometryEditorReticle-1-213x200.gif","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/GeometryEditorReticle-1.gif","medium-width":238,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/GeometryEditorReticle-1.gif","medium_large-width":416,"medium_large-height":456,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/GeometryEditorReticle-1.gif","large-width":416,"large-height":456,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/GeometryEditorReticle-1.gif","1536x1536-width":416,"1536x1536-height":456,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/GeometryEditorReticle-1.gif","2048x2048-width":416,"2048x2048-height":456,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/GeometryEditorReticle-1.gif","card_image-width":416,"card_image-height":456,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/GeometryEditorReticle-1.gif","wide_image-width":416,"wide_image-height":456}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<p>The <code>ProgrammaticReticleTool<\/code>, added in 200.8, has programmatic hooks which allow you to:<\/p>\n<ul>\n<li><strong>Select<\/strong> a vertex or mid-vertex at the reticle position.<\/li>\n<li><strong>Pick up<\/strong> the selected vertex or mid-vertex.<\/li>\n<li><strong>Place<\/strong> a new vertex or drop the currently picked up vertex.<\/li>\n<\/ul>\n"},{"acf_fc_layout":"content","content":"<p><em>Note: <code>ProgrammaticReticleTool<\/code> functionality mirrors that of the <code>ReticleVertexTool<\/code> with the main difference being that <code>ProgrammaticReticleTool<\/code> can be programmatically called without the need for tap interaction.<\/em><\/p>\n<h2 id=\"example_workflows\">Example workflows<\/h2>\n<p>In this next section, we\u2019ll explore some example workflows to give you an idea of the range of intuitive and powerful user experiences that can be implemented with the <code>ProgrammaticReticleTool<\/code>.<\/p>\n<p>We\u2019ll look at:<\/p>\n<ul>\n<li>How to design a multifunctional button workflow where a single control adapts its behavior based on the reticle\u2019s context.<\/li>\n<li>How to use a new method of identification introduced at 200.8 to leverage tap interactions to select or navigate to geometry editor elements.<\/li>\n<li>Ways to place vertices using alternative triggers beyond standard button presses.<\/li>\n<\/ul>\n<p>Together, these techniques will help you build editing workflows that are both efficient and user-friendly.<\/p>\n<p>To view the context of the code snippets featured in this blog, see the full code and try the app out yourself, clone the repo on <a href=\"https:\/\/github.com\/duffh\/ProgrammaticReticleToolDemo\">GitHub<\/a>.<\/p>\n<h3 id=\"multifunctional_button\">Multifunctional button workflow<\/h3>\n<p>Using the <a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.view.geometryeditor\/-geometry-editor\/hovered-element.html\">GeometryEditor.hoveredElement<\/a> and <a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.view.geometryeditor\/-geometry-editor\/picked-up-element.html\">GeometryEditor.pickedUpElement<\/a> properties and associated events, you can implement a workflow that updates button text and functionality depending on the currently hovered and picked-up elements.<\/p>\n<p>For example, when the reticle is positioned over an element with which you would like to enable a user to interact, you can update button text to say &#8220;Pick up point.&#8221; When an element has been picked up, the text can be updated to say &#8220;Drop point.&#8221; If no element is hovered or picked up, you could update the button text to say &#8220;Insert point.&#8221;<\/p>\n<p>Using this approach you can keep the UX clear, simple and engaging.<\/p>\n"},{"acf_fc_layout":"image","image":{"ID":2937976,"id":2937976,"title":"HoverPickUp","filename":"HoverPickUp.gif","filesize":2465197,"url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/HoverPickUp.gif","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool\/hoverpickup","alt":"","author":"359632","description":"","caption":"Multifunctional button example workflow","name":"hoverpickup","status":"inherit","uploaded_to":2937934,"date":"2025-08-29 15:43:17","modified":"2025-08-29 16:34:25","menu_order":0,"mime_type":"image\/gif","type":"image","subtype":"gif","icon":"https:\/\/www.esri.com\/arcgis-blog\/wp-includes\/images\/media\/default.png","width":438,"height":410,"sizes":{"thumbnail":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/HoverPickUp-213x200.gif","thumbnail-width":213,"thumbnail-height":200,"medium":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/HoverPickUp.gif","medium-width":279,"medium-height":261,"medium_large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/HoverPickUp.gif","medium_large-width":438,"medium_large-height":410,"large":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/HoverPickUp.gif","large-width":438,"large-height":410,"1536x1536":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/HoverPickUp.gif","1536x1536-width":438,"1536x1536-height":410,"2048x2048":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/HoverPickUp.gif","2048x2048-width":438,"2048x2048-height":410,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/HoverPickUp.gif","card_image-width":438,"card_image-height":410,"wide_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/HoverPickUp.gif","wide_image-width":438,"wide_image-height":410}},"image_position":"center","orientation":"horizontal","hyperlink":""},{"acf_fc_layout":"content","content":"<h4><strong>Picking up a point<\/strong><\/h4>\n<p>Use the <code>GeometryEditor.hoveredElement<\/code> event to update the button text when hovering over an element. You can also check the <code>GeometryEditor.pickedUpElement<\/code> property to ensure an element is not already picked up.<\/p>\n<p>The following code snippet demonstrates selection and pick up when an element is hovered and no element is currently picked up:<\/p>\n<pre><code><span style=\"color: #6a737d\">\/\/ Check that an element is currently hovered and no element is picked up.<\/span>\r\n<span style=\"color: #d73a49\">if<\/span> (geometryEditor.HoveredElement != <span style=\"color: #005cc5\">null<\/span> &amp;&amp; geometryEditor.pickedUpElement.value == <span style=\"color: #005cc5\">null<\/span>)\r\n{\r\n\u00a0 \u00a0 <span style=\"color: #6a737d\">\/\/ Select the vertex or mid-vertex.<\/span>\r\n\u00a0 \u00a0 programmaticReticleTool.selectElementAtReticle()\r\n\r\n\u00a0 \u00a0 <span style=\"color: #6a737d\">\/\/ Pick up the selected element.<\/span>\r\n\u00a0 \u00a0 programmaticReticleTool.pickUpSelectedElement()\r\n}\r\n<\/code><\/pre>\n<p>Pick up and selection are limited to vertices and mid-vertices.<\/p>\n<p>A vertex or mid-vertex can be selected at the reticle position using the <code>ProgrammaticReticleTool<\/code> alternatively you can use the various selection methods on the <code>GeometryEditor<\/code> such as <code>GeometryEditor.selectVertex(partIndex: Int, vertexIndex: Int)<\/code>.<\/p>\n<h4><strong>Placing a point<\/strong><\/h4>\n<p>Check the <code>GeometryEditor.pickedUpElement<\/code> and update the button text to indicate whether or not a new vertex will be inserted or an existing vertex will be dropped.<\/p>\n<p>Insert a new vertex or drop a picked up element using:<\/p>\n<pre><code><span style=\"color: #6a737d\">\/\/ Place a new vertex or drop the existing picked up vertex.<\/span>\r\nprogrammaticReticleTool.placeElementAtReticle()\r\n<\/code><\/pre>\n<p>If no element is currently picked up, a new vertex is placed; if there is currently a picked-up element, then the picked-up element is placed at the reticle position.<\/p>\n<p><em>Note: If you want to undo a pick up action, you can return the picked-up element to its previous position by using <code>GeometryEditor.cancelCurrentAction()<\/code>.<\/em><\/p>\n<h3 id=\"tap_select_zoom\">Tap to select and zoom<\/h3>\n<p>The v200.8 release also introduced a new method of identification on the <code>MapView<\/code> to return an <a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.view\/-identify-geometry-editor-result\/index.html\">IdentifyGeometryEditorResult<\/a> with a collection of <a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/arcgis-maps-kotlin\/com.arcgismaps.mapping.view.geometryeditor\/-geometry-editor-element\/index.html\">GeometryEditorElement<\/a> objects.<\/p>\n<p>You can use this new identification in conjunction with the <code>ProgrammaticReticleTool<\/code> to, for example, quickly select and change the viewpoint to the position of a tapped <code>GeometryEditorElement<\/code>.<\/p>\n<pre><code><span style=\"color: #6a737d\">\/\/ Identify geometry editor elements at the tapped position.<\/span>\r\n<span style=\"color: #d73a49\">val<\/span> identifyResult = mapViewProxy.identifyGeometryEditor(tapPosition, tolerance = <span style=\"color: #005cc5\">15.<\/span>dp).getOrNull() ?: <span style=\"color: #d73a49\">return<\/span>\r\n\r\n<span style=\"color: #6a737d\">\/\/ Get the first geometry editor element in the result.<\/span>\r\n<span style=\"color: #d73a49\">val<\/span> topElement = identifyResult.elements.firstOrNull() ?: <span style=\"color: #d73a49\">return<\/span>\r\n\r\n<span style=\"color: #6a737d\">\/\/ Create a short duration to use when updating the map viewpoint.<\/span>\r\n<span style=\"color: #d73a49\">val<\/span> duration = <span style=\"color: #005cc5\">300.<\/span>toDuration(DurationUnit.MILLISECONDS)\r\n<span style=\"color: #d73a49\">when<\/span> (topElement) {\r\n\u00a0 \u00a0 <span style=\"color: #d73a49\">is<\/span> GeometryEditorVertex -&gt; {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 <span style=\"color: #6a737d\">\/\/ Select the identified vertex.<\/span>\r\n\u00a0 \u00a0 \u00a0 \u00a0 geometryEditor.selectVertex(topElement.partIndex, topElement.vertexIndex)\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 <span style=\"color: #6a737d\">\/\/ Update the viewpoint.<\/span>\r\n\u00a0 \u00a0 \u00a0 \u00a0 mapViewProxy.setViewpointAnimated(Viewpoint(topElement.point), duration)\r\n\u00a0 \u00a0 }\r\n\u00a0 \u00a0 <span style=\"color: #d73a49\">is<\/span> GeometryEditorMidVertex -&gt; {\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 <span style=\"color: #6a737d\">\/\/ Select the identified mid-vertex.<\/span>\r\n\u00a0 \u00a0 \u00a0 \u00a0 geometryEditor.selectMidVertex(topElement.partIndex, topElement.segmentIndex)\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 <span style=\"color: #6a737d\">\/\/ Update the viewpoint.<\/span>\r\n\u00a0 \u00a0 \u00a0 \u00a0 mapViewProxy.setViewpointAnimated(Viewpoint(topElement.point), duration)\r\n\r\n\u00a0 \u00a0 }\r\n\u00a0 \u00a0 <span style=\"color: #d73a49\">else<\/span> -&gt; { <span style=\"color: #6a737d\">\/* Only zoom to vertices and mid-vertices. *\/<\/span> }\r\n}\r\n<\/code><\/pre>\n<p>The identify method lets you pick the balance between <code>MapView<\/code> interaction and other triggers that is best suited to your workflow.<\/p>\n"},{"acf_fc_layout":"kaltura","video_id":"1_zu1rnfkg","time":false,"start":0,"stop":""},{"acf_fc_layout":"content","content":"<p>You can build on this workflow by identifying geometry elements on a long press and displaying a context menu at their position to provide enhanced editing options such as vertex deletion.<\/p>\n<p>In the example shown below, a context menu featuring options to zoom to or delete an identified <code>GeometryEditorElement<\/code> can be used to speed up geometry editing operations.<\/p>\n"},{"acf_fc_layout":"kaltura","video_id":"1_gwzjgjwp","time":false,"start":0,"stop":""},{"acf_fc_layout":"content","content":"<h3 id=\"other_triggers\">Using other triggers<\/h3>\n<p>I&#8217;ve primarily covered button-driven workflows in this blog and the example app but any trigger can be used with the programmatic calls.<\/p>\n<p>The <code>ProgrammaticReticleTool<\/code> enables you to trigger selection, pick up and placement using voice activation, keyboard shortcuts or gesture-based controls to improve the accessibility of your applications.<\/p>\n<p>The workflows outlined in this blog are just a few examples of possible workflows that you can implement with this API; many more possibilities are available for you to experiment with.<\/p>\n<h2 id=\"summary\">Summary<\/h2>\n<p>The <code>ProgrammaticReticleTool<\/code> is a new geometry editing tool that allows you to trigger editing actions programmatically\u2014such as through buttons or other custom inputs\u2014rather than relying solely on touch interactions.<\/p>\n<p>With this tool you can:<\/p>\n<ul>\n<li><strong>Select<\/strong> a vertex or mid-vertex at the reticle position.<\/li>\n<li><strong>Pick up<\/strong> the selected element.<\/li>\n<li><strong>Place<\/strong> a new vertex or drop a picked-up element.<\/li>\n<\/ul>\n<p>The <code>ProgrammaticReticleTool<\/code> enables workflows such as:<\/p>\n<ul>\n<li>Multifunctional buttons that adapt their behavior based on reticle context.<\/li>\n<li>Tap-to-select-and-zoom functionality.<\/li>\n<li>Custom context menus for quick actions.<\/li>\n<li>Alternative triggers for geometry editing including gestures, voice activation and keyboard controls.<\/li>\n<\/ul>\n<p>Applicable across Qt, Kotlin, Swift, Flutter and .NET Maps SDKs, the <code>ProgrammaticReticleTool<\/code> offers a flexible, precise, and customizable approach to geometry editing, empowering developers to create user-friendly, context-aware GIS editing experiences.<\/p>\n<p>Tell us about your experience with the <code>ProgrammaticReticleTool<\/code> in the <a href=\"https:\/\/community.esri.com\/t5\/arcgis-maps-sdks-for-native-apps\/ct-p\/arcgis-runtime-sdks\">Esri Community<\/a>\u00a0forums, and if you haven\u2019t already, check out our developer documentation for more tips and guides on how to use Kotlin Maps SDK.<\/p>\n<h3>Useful resources<\/h3>\n<p>Kotlin Maps SDK samples applications showcase capabilities and functionality offered by Native Maps SDKs via simple workflows. This blog post can be used in conjunction with the Kotlin samples applications to implement the broad range of functionality offered by Kotlin Maps SDK.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/duffh\/ProgrammaticReticleToolDemo\">ProgrammaticReticleToolDemo<\/a>: the project described in this article<\/li>\n<li>Edit geometries with programmatic reticle tool Native Maps SDKs sample: <a href=\"https:\/\/developers.arcgis.com\/kotlin\/sample-code\/edit-geometries-with-programmatic-reticle-tool\/\">Kotlin<\/a> | <a href=\"https:\/\/developers.arcgis.com\/net\/maui\/sample-code\/edit-geometries-with-programmatic-reticle-tool\/\">.NET<\/a> | <a href=\"https:\/\/developers.arcgis.com\/swift\/sample-code\/edit-geometries-with-programmatic-reticle-tool\/\">Swift<\/a> | <a href=\"https:\/\/developers.arcgis.com\/flutter\/sample-code\/edit-geometries-with-programmatic-reticle-tool\/\">Flutter<\/a><\/li>\n<li><a href=\"https:\/\/developers.arcgis.com\/kotlin\/sample-code\/\">Kotlin Maps SDK sample code<\/a><\/li>\n<li><a href=\"https:\/\/developers.arcgis.com\/kotlin\/api-reference\/index.html\">Kotlin Maps SDK API Reference<\/a><\/li>\n<li><a href=\"https:\/\/developers.arcgis.com\/documentation\/mapping-and-location-services\/get-started\/\">Sign up for an ArcGIS Location Platform or ArcGIS Online trial account<\/a><\/li>\n<\/ul>\n"}],"related_articles":[{"ID":2912232,"post_author":"3811","post_date":"2025-07-30 06:30:04","post_date_gmt":"2025-07-30 13:30:04","post_content":"","post_title":"What\u2019s new in ArcGIS Maps SDKs for Native Apps 200.8","post_excerpt":"","post_status":"publish","comment_status":"open","ping_status":"closed","post_password":"","post_name":"whats-new-in-arcgis-maps-sdks-for-native-apps-200-8","to_ping":"","pinged":"","post_modified":"2025-12-03 17:17:16","post_modified_gmt":"2025-12-04 01:17:16","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2912232","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":2751222,"post_author":"359632","post_date":"2025-04-15 09:15:47","post_date_gmt":"2025-04-15 16:15:47","post_content":"","post_title":"How to perform snap geometry edits with utility network connectivity rules","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"how-to-perform-snap-geometry-edits-with-utility-network-connectivity-rules","to_ping":"","pinged":"","post_modified":"2025-04-15 12:20:43","post_modified_gmt":"2025-04-15 19:20:43","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2751222","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"},{"ID":2048452,"post_author":"6351","post_date":"2023-08-23 08:00:57","post_date_gmt":"2023-08-23 15:00:57","post_content":"","post_title":"Migrating your legacy .NET SketchEditor code to the new GeometryEditor","post_excerpt":"","post_status":"publish","comment_status":"closed","ping_status":"closed","post_password":"","post_name":"migrating-your-legacy-sketcheditor-code-to-the-new-geometryeditor","to_ping":"","pinged":"","post_modified":"2024-04-12 01:15:46","post_modified_gmt":"2024-04-12 08:15:46","post_content_filtered":"","post_parent":0,"guid":"https:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=2048452","menu_order":0,"post_type":"blog","post_mime_type":"","comment_count":"0","filter":"raw"}],"show_article_image":false,"card_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/09\/ProgrammaticReticleToolCard.png","wide_image":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Implement custom geometry editing workflows with the reticle tool<\/title>\n<meta name=\"description\" content=\"Learn how to use the programmatic reticle tool to implement custom geometry editing workflows in v200.8 of the Native Maps SDKs\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to implement custom geometry editing workflows with the programmatic reticle tool\" \/>\n<meta property=\"og:description\" content=\"Learn how to use the programmatic reticle tool to implement custom geometry editing workflows in v200.8 of the Native Maps SDKs\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool\"},\"author\":{\"name\":\"Hamish Duff\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/776665929a66fa840b76139acd87f394\"},\"headline\":\"How to implement custom geometry editing workflows with the programmatic reticle tool\",\"datePublished\":\"2025-09-02T15:08:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool\"},\"wordCount\":12,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"ArcGIS Maps SDK for Native Maps\",\"editing\",\"feature\",\"geometry\",\"reticle\"],\"articleSection\":[\"Developers\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool\",\"name\":\"Implement custom geometry editing workflows with the reticle tool\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2025-09-02T15:08:08+00:00\",\"description\":\"Learn how to use the programmatic reticle tool to implement custom geometry editing workflows in v200.8 of the Native Maps SDKs\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to implement custom geometry editing workflows with the programmatic reticle tool\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/776665929a66fa840b76139acd87f394\",\"name\":\"Hamish Duff\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/07\/99325835-213x200.jpeg\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/07\/99325835-213x200.jpeg\",\"caption\":\"Hamish Duff\"},\"description\":\"I'm a product engineer on the ArcGIS Maps SDKs for Native Apps team.\",\"url\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Implement custom geometry editing workflows with the reticle tool","description":"Learn how to use the programmatic reticle tool to implement custom geometry editing workflows in v200.8 of the Native Maps SDKs","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool","og_locale":"en_US","og_type":"article","og_title":"How to implement custom geometry editing workflows with the programmatic reticle tool","og_description":"Learn how to use the programmatic reticle tool to implement custom geometry editing workflows in v200.8 of the Native Maps SDKs","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","twitter_card":"summary_large_image","twitter_site":"@ESRI","twitter_misc":{"Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool"},"author":{"name":"Hamish Duff","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/776665929a66fa840b76139acd87f394"},"headline":"How to implement custom geometry editing workflows with the programmatic reticle tool","datePublished":"2025-09-02T15:08:08+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool"},"wordCount":12,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["ArcGIS Maps SDK for Native Maps","editing","feature","geometry","reticle"],"articleSection":["Developers"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool","name":"Implement custom geometry editing workflows with the reticle tool","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2025-09-02T15:08:08+00:00","description":"Learn how to use the programmatic reticle tool to implement custom geometry editing workflows in v200.8 of the Native Maps SDKs","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/sdk-kotlin\/developers\/implement-custom-geometry-editing-workflows-with-programmatic-reticle-tool#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"How to implement custom geometry editing workflows with the programmatic reticle tool"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/776665929a66fa840b76139acd87f394","name":"Hamish Duff","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/07\/99325835-213x200.jpeg","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2024\/07\/99325835-213x200.jpeg","caption":"Hamish Duff"},"description":"I'm a product engineer on the ArcGIS Maps SDKs for Native Apps team.","url":""}]}},"text_date":"September 2, 2025","author_name":"Hamish Duff","author_page":false,"custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/Newsroom-Keyart-Wide-1920-x-1080.jpg","primary_product":"ArcGIS Maps SDK for Kotlin","tag_data":[{"term_id":780803,"name":"ArcGIS Maps SDK for Native Maps","slug":"arcgis-maps-sdk-for-native-maps","term_group":0,"term_taxonomy_id":780803,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"},{"term_id":27971,"name":"editing","slug":"editing","term_group":0,"term_taxonomy_id":27971,"taxonomy":"post_tag","description":"","parent":0,"count":166,"filter":"raw"},{"term_id":771862,"name":"feature","slug":"feature","term_group":0,"term_taxonomy_id":771862,"taxonomy":"post_tag","description":"","parent":0,"count":3,"filter":"raw"},{"term_id":28391,"name":"geometry","slug":"geometry","term_group":0,"term_taxonomy_id":28391,"taxonomy":"post_tag","description":"","parent":0,"count":9,"filter":"raw"},{"term_id":780807,"name":"reticle","slug":"reticle","term_group":0,"term_taxonomy_id":780807,"taxonomy":"post_tag","description":"","parent":0,"count":1,"filter":"raw"}],"category_data":[{"term_id":738191,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":738191,"taxonomy":"category","description":"","parent":0,"count":422,"filter":"raw"}],"product_data":[{"term_id":769142,"name":"ArcGIS Maps SDK for .NET","slug":"sdk-net","term_group":0,"term_taxonomy_id":769142,"taxonomy":"product","description":"","parent":36601,"count":39,"filter":"raw"},{"term_id":776202,"name":"ArcGIS Maps SDK for Flutter","slug":"sdk-flutter","term_group":0,"term_taxonomy_id":776202,"taxonomy":"product","description":"","parent":36601,"count":18,"filter":"raw"},{"term_id":768902,"name":"ArcGIS Maps SDK for Kotlin","slug":"sdk-kotlin","term_group":0,"term_taxonomy_id":768902,"taxonomy":"product","description":"","parent":36601,"count":33,"filter":"raw"},{"term_id":769152,"name":"ArcGIS Maps SDK for Qt","slug":"sdk-qt","term_group":0,"term_taxonomy_id":769152,"taxonomy":"product","description":"","parent":36601,"count":36,"filter":"raw"},{"term_id":768912,"name":"ArcGIS Maps SDK for Swift","slug":"sdk-swift","term_group":0,"term_taxonomy_id":768912,"taxonomy":"product","description":"","parent":36601,"count":32,"filter":"raw"},{"term_id":36601,"name":"Developers","slug":"developers","term_group":0,"term_taxonomy_id":36601,"taxonomy":"product","description":"","parent":0,"count":763,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=sdk-kotlin","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2937934","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/359632"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=2937934"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/2937934\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=2937934"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=2937934"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=2937934"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=2937934"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=2937934"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}