---
title: "Annotation Overlay"
canonical_url: "https://www.nutrient.io/guides/android/samples/annotation-overlay-java/"
md_url: "https://www.nutrient.io/guides/android/samples/annotation-overlay-java.md"
last_updated: "2026-05-15T19:10:04.916Z"
description: "Display annotations in overlay mode as separate Android Views above the page."
---

# Annotation Overlay

Display annotations in overlay mode as separate Android Views above the page.

[Get Started](https://www.nutrient.io/sdk/android/getting-started.md)

[All Samples](https://www.nutrient.io/guides/android/samples.md)

[Download](https://www.nutrient.io/guides/android/downloads.md)

[Launch Demo](https://www.nutrient.io/demo/)

---

```java

/*
 *   Copyright © 2018-2026 PSPDFKit GmbH. All rights reserved.
 *
 *   The PSPDFKit Sample applications are licensed with a modified BSD license.
 *   Please see License for details. This notice may not be removed from this file.
 */

package com.pspdfkit.catalog.examples.java;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.annotation.NonNull;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.pspdfkit.annotations.Annotation;
import com.pspdfkit.annotations.AnnotationType;
import com.pspdfkit.catalog.R;
import com.pspdfkit.catalog.SdkExample;
import com.pspdfkit.catalog.tasks.ExtractAssetTask;
import com.pspdfkit.configuration.activity.PdfActivityConfiguration;
import com.pspdfkit.ui.PdfActivity;
import com.pspdfkit.ui.PdfActivityIntentBuilder;
import com.pspdfkit.ui.annotations.OnAnnotationSelectedListener;
import com.pspdfkit.ui.rendering.AnnotationOverlayRenderStrategy;
import java.util.EnumSet;
import java.util.List;

/** Showcases how to display annotations in overlay mode. */
public class AnnotationOverlayExample extends SdkExample {

    public AnnotationOverlayExample(@NonNull final Context context) {
        super(context, R.string.annotationOverlayExampleTitle, R.string.annotationOverlayExampleDescription);
    }

    @Override
    public void launchExample(
            @NonNull final Context context, @NonNull final PdfActivityConfiguration.Builder configuration) {
        // Use custom layout with FAB for per-annotation overlay toggle.
        configuration.layout(R.layout.activity_annotation_overlay);

        // Extract the document from the assets.
        ExtractAssetTask.extract(ANNOTATIONS_EXAMPLE, getTitle(), context, documentFile -> {
            // To start the example create a launch intent using the builder.
            final Intent intent = PdfActivityIntentBuilder.fromUri(context, Uri.fromFile(documentFile)).configuration(configuration.build()).activityClass(AnnotationOverlayActivity.class).build();

            context.startActivity(intent);
        });
    }

    /** Showcases how to enable overlay mode for annotations. */
    public static class AnnotationOverlayActivity extends PdfActivity implements OnAnnotationSelectedListener {

        /**
         * Holds per-type overlay overrides. When overlay is globally off, these types are
         * included in overlay. When overlay is globally on, these types are excluded from overlay.
         */
        @NonNull
        private final EnumSet<AnnotationType> perTypeOverrides = EnumSet.noneOf(AnnotationType.class);

        /** Current strategy used for rendering annotations in overlay. */
        @NonNull
        private AnnotationOverlayRenderStrategy.Strategy currentOverlayRenderingStrategy =
                AnnotationOverlayRenderStrategy.Strategy.AP_STREAM_RENDERING;

        /** Flag indicating whether annotation overlay is enabled. */
        private boolean annotationOverlayEnabled = false;

        /** FAB for toggling overlay on selected annotations. */
        private FloatingActionButton overlayFab;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            // Set up the FAB for toggling overlay on selected annotation types.
            overlayFab = findViewById(R.id.fab_toggle_annotation_overlay);
            registerForContextMenu(overlayFab);
            overlayFab.setOnClickListener(View::showContextMenu);

            // Listen for annotation selection changes to show/hide the FAB.
            requirePdfFragment().addOnAnnotationSelectedListener(this);

            // We'll set overlay render strategy that just returns currently configured strategy for all
            // annotations.
            requirePdfFragment().setAnnotationOverlayRenderStrategy(annotation -> currentOverlayRenderingStrategy);

            // We'll enable overlay for all supported annotation types immediately after activity
            // creation.
            enableOverlayForSupportedAnnotationTypes();
            invalidateOptionsMenu();
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            requirePdfFragment().removeOnAnnotationSelectedListener(this);
        }

        @Override
        public void onAnnotationSelected(@NonNull Annotation annotation, boolean annotationCreated) {
            overlayFab.setVisibility(View.VISIBLE);
        }

        @Override
        public void onAnnotationDeselected(@NonNull Annotation annotation, boolean reselected) {
            if (!reselected) {
                overlayFab.setVisibility(View.GONE);
            }
        }

        @Override
        public boolean onOptionsItemSelected(@NonNull MenuItem item) {
            final int itemId = item.getItemId();
            if (itemId == R.id.toggle_annotation_overlay) {
                if (annotationOverlayEnabled) {
                    disableOverlayForAllAnnotationTypes();
                } else {
                    enableOverlayForSupportedAnnotationTypes();
                }
                invalidateOptionsMenu();
                return true;
            } else if (itemId == R.id.fire_low_memory_notification) { // We fire low memory notification manually
                // to showcase how annotation overlay mode
                // behaves when system is low on memory.
                requirePdfFragment().onLowMemory();
                return true;
            } else if (itemId == R.id.toggle_overlay_rendering_strategy) {
                // Toggle the current overlay rendering strategy.
                if (currentOverlayRenderingStrategy == AnnotationOverlayRenderStrategy.Strategy.AP_STREAM_RENDERING) {
                    currentOverlayRenderingStrategy = AnnotationOverlayRenderStrategy.Strategy.PLATFORM_RENDERING;
                } else {
                    currentOverlayRenderingStrategy = AnnotationOverlayRenderStrategy.Strategy.AP_STREAM_RENDERING;
                }
                // Invalidate options to change button text to current state.
                invalidateOptionsMenu();
                return true;
            }
            return super.onOptionsItemSelected(item);
        }

        private void disableOverlayForAllAnnotationTypes() {
            annotationOverlayEnabled = false;
            perTypeOverrides.clear();
            applyOverlayTypes();
        }

        private void enableOverlayForSupportedAnnotationTypes() {
            annotationOverlayEnabled = true;
            perTypeOverrides.clear();
            applyOverlayTypes();
        }

        private void applyOverlayTypes() {
            final EnumSet<AnnotationType> overlayTypes;
            if (annotationOverlayEnabled) {
                // Start with all types, then remove manually excluded ones.
                overlayTypes = EnumSet.allOf(AnnotationType.class);
                overlayTypes.removeAll(perTypeOverrides);
            } else {
                // Start with none, then add manually included ones.
                overlayTypes = EnumSet.noneOf(AnnotationType.class);
                overlayTypes.addAll(perTypeOverrides);
            }
            requirePdfFragment().setOverlaidAnnotationTypes(overlayTypes);
        }

        @Override
        public boolean onCreateOptionsMenu(@NonNull Menu menu) {
            super.onCreateOptionsMenu(menu);
            if (annotationOverlayEnabled) {
                menu.add(0, R.id.toggle_annotation_overlay, 0, "Disable annotation overlay");
                // Toggling overlay strategy does not make sense when annotation overlay is disabled.
                if (currentOverlayRenderingStrategy == AnnotationOverlayRenderStrategy.Strategy.PLATFORM_RENDERING) {
                    menu.add(0, R.id.toggle_overlay_rendering_strategy, 0, "Use AP stream rendering");
                } else {
                    menu.add(0, R.id.toggle_overlay_rendering_strategy, 0, "Use platform rendering");
                }
            } else {
                menu.add(0, R.id.toggle_annotation_overlay, 0, "Enable annotation overlay");
            }
            menu.add(0, R.id.fire_low_memory_notification, 0, "Fire low memory notification");
            return true;
        }

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo);

            List<Annotation> selectedAnnotations = requirePdfFragment().getSelectedAnnotations();
            if (selectedAnnotations.size()!= 1) return;

            final AnnotationType annotationType = selectedAnnotations.get(0).getType();
            // The effective overlay state for this type is: globally on XOR overridden.
            final boolean effectivelyOverlaid = annotationOverlayEnabled ^ perTypeOverrides.contains(annotationType);
            menu.add(0, R.id.toggle_annotation_overlay, 0, effectivelyOverlaid? "Disable overlay" : "Enable overlay");
        }

        @Override
        public boolean onContextItemSelected(@NonNull MenuItem item) {
            if (requirePdfFragment().getSelectedAnnotations().size()!= 1) {
                return super.onContextItemSelected(item);
            }
            final Annotation annotation =
                    requirePdfFragment().getSelectedAnnotations().get(0);
            final AnnotationType annotationType = annotation.getType();

            final int itemId = item.getItemId();
            if (itemId == R.id.toggle_annotation_overlay) {
                if (perTypeOverrides.contains(annotationType)) {
                    perTypeOverrides.remove(annotationType);
                } else {
                    perTypeOverrides.add(annotationType);
                }
                applyOverlayTypes();
                return true;
            }
            return super.onContextItemSelected(item);
        }
    }
}

```

This code sample is an example that illustrates how to use our SDK. Please adapt it to your specific use case.

---

## Related pages

- [Application Policy](/guides/android/samples/application-policy-kotlin.md)
- [Custom Form Highlight Color](/guides/android/samples/custom-form-highlight-color-java.md)
- [Custom Page Templates](/guides/android/samples/custom-page-templates-java.md)
- [Digital Signature (Basic)](/guides/android/samples/digital-signature-basic-kotlin.md)
- [Disabled Annotation Property](/guides/android/samples/disabled-annotation-property-java.md)
- [Image Document](/guides/android/samples/image-document-kotlin.md)
- [Compose Image Document](/guides/android/samples/compose-image-document-kotlin.md)
- [Inline Multimedia](/guides/android/samples/inline-multimedia-kotlin.md)
- [JavaScript Form Filling](/guides/android/samples/javascript-form-filling-kotlin.md)
- [Overlay Visibility](/guides/android/samples/overlay-visibility-kotlin.md)
- [PdfFragment](/guides/android/samples/pdffragment-kotlin.md)
- [Reader View](/guides/android/samples/reader-view-kotlin.md)
- [Playground](/guides/android/samples/playground-kotlin.md)
- [JavaScript Calculator](/guides/android/samples/javascript-calculator-kotlin.md)
- [Text Field Suggestions](/guides/android/samples/text-field-suggestions-kotlin.md)
- [Thumbnail Bar Modes](/guides/android/samples/thumbnail-bar-modes-kotlin.md)
- [Signature Storage Database](/guides/android/samples/signature-storage-database-kotlin.md)
- [Selection Customization](/guides/android/samples/selection-customization-java.md)
- [Password Protected PDF](/guides/android/samples/password-protected-pdf-kotlin.md)
- [Scientific Paper](/guides/android/samples/scientific-paper-kotlin.md)
- [Try Instant](/guides/android/samples/try-instant-kotlin.md)
- [Merge Documents](/guides/android/samples/merge-documents-kotlin.md)
- [Annotation Rendering](/guides/android/samples/annotation-rendering-kotlin.md)
- [Custom Data Provider](/guides/android/samples/custom-data-provider-kotlin.md)
- [Annotations with Transparency](/guides/android/samples/annotations-with-transparency-kotlin.md)
- [Annotation Flags](/guides/android/samples/annotation-flags-kotlin.md)
- [AI Assistant (Multiple Documents, ViewPager)](/guides/android/samples/ai-assistant-multiple-documents-viewpager-kotlin.md)
- [Custom Sharing Menu](/guides/android/samples/custom-sharing-menu-java.md)
- [Add LTV to Existing Signature](/guides/android/samples/add-ltv-to-existing-signature-kotlin.md)
- [Custom Toolbar Grouping](/guides/android/samples/custom-toolbar-grouping-java.md)
- [Custom Layout](/guides/android/samples/custom-layout-kotlin.md)
- [Custom ActionBar Actions](/guides/android/samples/custom-actionbar-actions-kotlin.md)
- [Custom Activity Toolbars](/guides/android/samples/custom-activity-toolbars-java.md)
- [Custom Note Hinter](/guides/android/samples/custom-note-hinter-kotlin.md)
- [Custom Main Toolbar](/guides/android/samples/custom-main-toolbar-kotlin.md)
- [Annotation Configuration](/guides/android/samples/annotation-configuration-kotlin.md)
- [Annotation Selection Styling](/guides/android/samples/annotation-selection-styling-kotlin.md)
- [Custom Search UI (Compose)](/guides/android/samples/custom-search-ui-compose-kotlin.md)
- [Document Switcher](/guides/android/samples/document-switcher-java.md)
- [File Annotation Creation](/guides/android/samples/file-annotation-creation-kotlin.md)
- [Dynamic Pages on Scroll](/guides/android/samples/dynamic-pages-on-scroll-kotlin.md)
- [Custom Activity Form Editing](/guides/android/samples/custom-activity-form-editing-java.md)
- [Custom Stamp Annotations](/guides/android/samples/custom-stamp-annotations-java.md)
- [Custom Outline Provider](/guides/android/samples/custom-outline-provider-kotlin.md)
- [Compose Navigation](/guides/android/samples/compose-navigation-kotlin.md)
- [Fragment Runtime Configuration](/guides/android/samples/fragment-runtime-configuration-kotlin.md)
- [Instant Document JSON](/guides/android/samples/instant-document-json-kotlin.md)
- [DocumentView Composable](/guides/android/samples/documentview-composable-kotlin.md)
- [Form Creation](/guides/android/samples/form-creation-kotlin.md)
- [Document Download](/guides/android/samples/document-download-kotlin.md)
- [JavaScript Actions](/guides/android/samples/javascript-actions-kotlin.md)
- [Instant JSON Attachment](/guides/android/samples/instant-json-attachment-kotlin.md)
- [Digital Signature (Manual)](/guides/android/samples/digital-signature-manual-kotlin.md)
- [Digital Signature (Third-Party)](/guides/android/samples/digital-signature-third-party-kotlin.md)
- [Inline Search](/guides/android/samples/inline-search-java.md)
- [Form Filling](/guides/android/samples/form-filling-kotlin.md)
- [Form Click Intercept (Compose)](/guides/android/samples/form-click-intercept-compose-kotlin.md)
- [Document Sharing](/guides/android/samples/document-sharing-java.md)
- [Custom Download Dialog](/guides/android/samples/custom-download-dialog-java.md)
- [Download Progress](/guides/android/samples/download-progress-kotlin.md)
- [Popup Toolbar Customization](/guides/android/samples/popup-toolbar-customization-kotlin.md)
- [Custom Sharing Dialog](/guides/android/samples/custom-sharing-dialog-java.md)
- [PDF from Image](/guides/android/samples/pdf-from-image-kotlin.md)
- [Digital Signature (Two-Step)](/guides/android/samples/digital-signature-two-step-kotlin.md)
- [Remote URL](/guides/android/samples/remote-url-kotlin.md)
- [PdfUiFragment](/guides/android/samples/pdfuifragment-kotlin.md)
- [Runtime Configuration](/guides/android/samples/runtime-configuration-kotlin.md)
- [Sound Extraction](/guides/android/samples/sound-extraction-kotlin.md)
- [Document from Canvas](/guides/android/samples/document-from-canvas-kotlin.md)
- [Tabbed Documents](/guides/android/samples/tabbed-documents-kotlin.md)
- [Watermarks](/guides/android/samples/watermarks-kotlin.md)
- [Programmatic Zoom](/guides/android/samples/programmatic-zoom-kotlin.md)
- [Signature Parcelize](/guides/android/samples/signature-parcelize-kotlin.md)
- [OCR](/guides/android/samples/ocr-kotlin.md)
- [Vertical Scrollbar](/guides/android/samples/vertical-scrollbar-java.md)
- [Split View](/guides/android/samples/split-view-java.md)
- [XFDF Import/Export](/guides/android/samples/xfdf-import-export-kotlin.md)
- [UI View Modes](/guides/android/samples/ui-view-modes-kotlin.md)
- [LTV Signature](/guides/android/samples/ltv-signature-kotlin.md)
- [Bookmark Highlighting](/guides/android/samples/bookmark-highlighting-kotlin.md)
- [Custom Annotation Inspector](/guides/android/samples/custom-annotation-inspector-java.md)
- [Annotation Sidebar](/guides/android/samples/annotation-sidebar-kotlin.md)
- [AI Assistant (Single Document)](/guides/android/samples/ai-assistant-single-document-kotlin.md)
- [AI Assistant (Multiple Documents, Compose)](/guides/android/samples/ai-assistant-multiple-documents-compose-kotlin.md)
- [Document Comparison](/guides/android/samples/document-comparison-kotlin.md)
- [Document Processing](/guides/android/samples/document-processing-kotlin.md)
- [Custom Annotation Creation Toolbar](/guides/android/samples/custom-annotation-creation-toolbar-java.md)
- [Custom Electronic Signature](/guides/android/samples/custom-electronic-signature-java.md)
- [E-Learning](/guides/android/samples/e-learning-kotlin.md)
- [Electronic + Digital Signing](/guides/android/samples/electronic-digital-signing-kotlin.md)
- [Generate PDF Report](/guides/android/samples/generate-pdf-report-kotlin.md)
- [Multimedia Annotations](/guides/android/samples/multimedia-annotations-kotlin.md)
- [Forms with JavaScript](/guides/android/samples/forms-with-javascript-kotlin.md)
- [External Document](/guides/android/samples/external-document-kotlin.md)
- [Overlay Views](/guides/android/samples/overlay-views-kotlin.md)
- [Kiosk Grid](/guides/android/samples/kiosk-grid-kotlin.md)
- [Search Indexing](/guides/android/samples/search-indexing-kotlin.md)
- [Annotation Creation](/guides/android/samples/annotation-creation-kotlin.md)
- [Filterable Thumbnail Grid](/guides/android/samples/filterable-thumbnail-grid-kotlin.md)
- [Tabbed Documents (Persistent)](/guides/android/samples/tabbed-documents-persistent-kotlin.md)
- [Measurement Tools](/guides/android/samples/measurement-tools-kotlin.md)
- [HTML-to-PDF Conversion](/guides/android/samples/html-to-pdf-conversion-kotlin.md)
- [AES Encrypted File](/guides/android/samples/aes-encrypted-file-java.md)
- [Construction Floor Plan](/guides/android/samples/construction-floor-plan-kotlin.md)
- [Hide and Reveal Areas](/guides/android/samples/hide-and-reveal-areas-kotlin.md)
- [Multiple Documents (Compose Pager)](/guides/android/samples/multiple-documents-compose-pager-kotlin.md)
- [Screen Reader](/guides/android/samples/screen-reader-java.md)
- [Custom Search UI (Views)](/guides/android/samples/custom-search-ui-views-java.md)

