> For the complete documentation index, see [llms.txt](https://docs.apryse.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.apryse.com/android/annotation/tools.md).

# Annotation interactive tools overview

Discover how annotation interactive tools work and enhance user interaction with documents. Learn about creating, customizing, and utilizing various tools for a seamless viewing experience. Explore th

## What are annotation interactive tools?

The principal means of user interaction with the document being viewed, other than buttons, is the currently active tool. Selection, panning, and annotation creation, are all achieved using different tools. We provide many default tools to provide a full viewing experience out of the box. But fortunately API hooks for the tools appearance and logic is provided, so you can always achieve whatever customization you like using our existing API, or with your changes.

By default each annotation type has an associated tool to allow you to create those annotations. It's possible to create multiple tools for the same annotation type, for example a rectangle tool with a default color of blue and another tool with a default color of red. When creating a custom annotation you'll need to create an associated annotation tool to define how the user can create that annotation.

## Technical overview

The tools listed above handle interactions by receiving touch and gesture events forwarded from [`PDFViewCtrl`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/PDFViewCtrl.html). When touches or gestures are made, `PDFViewCtrl` sends corresponding events to its [`ToolManager`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/tools/ToolManager.html).

The `ToolManager` is then responsible for passing the event to the current tool. If the current tool has fully handled the event, the event processing is finished. If the current tool cannot fully handle the event, the tool manager then forwards the event to the next tool.

The `Tool` class implements the `ToolManager.Tool` interface, thus handling all events passed to it from `ToolManager`. The `ToolManager` is responsible for passing the event to the current tool. If the current tool has fully handled the event, the processing of the event is finished. If the current tool cannot fully handle the event, the tool manager then forwards the event to the next tool.

![](https://226546913-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0QItsdFBmuuL9ezHimHy%2Fuploads%2Fgit-blob-f4a9aeb1ec5f14f75232fb7f0e458fb76e103f38%2F6f270a7d76aae9a93d66a7b27a5e849f454c6d14-992x267.png?alt=media)

## Annotation and its creation tool

The following table shows which tool mode is selected when a new annotation is created:

| `Tool`                                                                                                                 | `ToolMode`                 | `Annot`          |
| ---------------------------------------------------------------------------------------------------------------------- | -------------------------- | ---------------- |
| `AreaMeasureCreate`                                                                                                    | `AREA_MEASURE_CREATE`      | `Polygon`        |
| `ArrowCreate`                                                                                                          | `ARROW_CREATE`             | `Line`           |
| `CalloutCreate`                                                                                                        | `CALLOUT_CREATE`           | `FreeText`       |
| `CheckboxFieldCreate`                                                                                                  | `FORM_CHECKBOX_CREATE`     | `Widget`         |
| `CloudCreate`                                                                                                          | `CLOUD_CREATE`             | `Polygon`        |
| [`DigitalSignature`](https://sdk.apryse.com/api/android/javadoc/reference/com/pdftron/pdf/tools/DigitalSignature.html) | `DIGITAL_SIGNATURE`        | `Widget`         |
| `FileAttachmentCreate`                                                                                                 | `FILE_ATTACHMENT_CREATE`   | `FileAttachment` |
| `FreehandCreate`                                                                                                       | `INK_CREATE`               | `Ink`            |
| `FreeTextCreate`                                                                                                       | `TEXT_CREATE`              | `FreeText`       |
| `LineCreate`                                                                                                           | `LINE_CREATE`              | `Line`           |
| `OvalCreate`                                                                                                           | `OVAL_CREATE`              | `Circle`         |
| `PerimeterMeasureCreate`                                                                                               | `PERIMETER_MEASURE_CREATE` | `PolyLine`       |
| `PolygonCreate`                                                                                                        | `POLYGON_CREATE`           | `Polygon`        |
| `PolylineCreate`                                                                                                       | `POLYLINE_CREATE`          | `PolyLine`       |
| `RectCreate`                                                                                                           | `RECT_CREATE`              | `Square`         |
| `RectLinkCreate`                                                                                                       | `RECT_LINK`                | `Link`           |
| `RubberStampCreate`                                                                                                    | `RUBBER_STAMPER`           | `RubberStamp`    |
| `RulerCreate`                                                                                                          | `RULER_CREATE`             | `Line`           |
| `StickyNoteCreate`                                                                                                     | `TEXT_ANNOT_CREATE`        | `Text`           |
| `Signature`                                                                                                            | `SIGNATURE`                | `Widget`         |
| `SignatureFieldCreate`                                                                                                 | `FORM_SIGNATURE_CREATE`    | `Widget`         |
| `SoundCreate`                                                                                                          | `SOUND_CREATE`             | `Sound`          |
| `TextFieldCreate`                                                                                                      | `FORM_TEXT_FIELD_CREATE`   | `Widget`         |
| `TextHighlightCreate`                                                                                                  | `TEXT_HIGHLIGHT`           | `Highlight`      |
| `TextLinkCreate`                                                                                                       | `TEXT_LINK_CREATE`         | `Link`           |
| `TextSquigglyCreate`                                                                                                   | `TEXT_SQUIGGLY`            | `Squiggly`       |
| `TextStrikeoutCreate`                                                                                                  | `TEXT_STRIKEOUT`           | `StrikeOut`      |
| `TextUnderlineCreate`                                                                                                  | `TEXT_UNDERLINE`           | `Underline`      |

## Annotation and its handling tool

The following table shows which tool mode is selected when an annotation is selected for editing/handling:

| `Annot`          | `Tool`                   | `ToolMode`                  |
| ---------------- | ------------------------ | --------------------------- |
| `Circle`         | `AnnotEdit`              | `ANNOT_EDIT`                |
| `FileAttachment` | `AnnotEdit`              | `ANNOT_EDIT`                |
| `FreeText`       | `AnnotEdit`              | `ANNOT_EDIT`                |
| `Highlight`      | `AnnotEditTextMarkup`    | `ANNOT_EDIT_TEXT_MARKUP`    |
| `Ink`            | `Eraser`                 | `INK_ERASER`                |
| `Line`           | `AnnotEditLine`          | `ANNOT_EDIT_LINE`           |
| `Link`           | `LinkAction`             | `LINK_ACTION`               |
| `PolyLine`       | `AnnotEditAdvancedShape` | `ANNOT_EDIT_ADVANCED_SHAPE` |
| `Polygon`        | `AnnotEditAdvancedShape` | `ANNOT_EDIT_ADVANCED_SHAPE` |
| `RichMedia`      | `RichMedia`              | `RICH_MEDIA`                |
| `Sound`          | `AnnotEdit`              | `ANNOT_EDIT`                |
| `StrikeOut`      | `AnnotEditTextMarkup`    | `ANNOT_EDIT_TEXT_MARKUP`    |
| `Square`         | `AnnotEdit`              | `ANNOT_EDIT`                |
| `Squiggly`       | `AnnotEditTextMarkup`    | `ANNOT_EDIT_TEXT_MARKUP`    |
| `Underline`      | `AnnotEditTextMarkup`    | `ANNOT_EDIT_TEXT_MARKUP`    |

The `ToolManager` uses the `Pan` tool as its default tool. The `Pan` tool handles almost all user actions, such as tapping on an annotation, long-pressing to show the Quick Menu, and so forth. When the user taps on an annotation, the `Pan` tool is exchanged for a new tool for handling the tap event, the identity of the new tool corresponding to the selected annotation. For example, if, while using the `Pan` tool, the user taps on a `Link` annotation, the `Pan` tool will set the next tool to be the `LinkAction` tool. Then, the `Link` annotation will be handled by the `LinkAction` tool using `LinkAction.onSingleTapConfirmed(MotionEvent)`. Besides gesture events such as `onSingleTapConfirmed`, `onUp`, and so forth, `ToolManager.onQuickMenuClicked(QuickMenuItem)` also follows the same flow.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.apryse.com/android/annotation/tools.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
