// the find
skydoves/Balloon
:balloon: Modernized and sophisticated tooltips, fully customizable with an arrow and animations for Android and Jetpack Compose.
Balloon is a tooltip and popup library for Android that handles arrow positioning, animations, lifecycle-aware dismissal, and overlay highlighting. It works in both traditional View-based layouts and Jetpack Compose. At 800k monthly downloads it's clearly load-bearing for a lot of production apps.
The arrow auto-positioning logic (ArrowOrientationRules.ALIGN_ANCHOR) flips the arrow orientation when there's not enough screen space, which is the kind of edge case most people would ship broken and fix in a bug report. The lifecycle integration is done right — passing a LifecycleOwner means you don't need to manually call dismiss() in onDestroy. The Compose API uses a Modifier-based approach with BalloonState, which fits naturally into composition rather than bolting on an imperative popup API. The relay/await sequential display API is genuinely useful for onboarding flows without writing state machines.
The Compose integration is a thin wrapper over the View-based Balloon, meaning you're still creating a PopupWindow under the hood in a Compose tree — this will bite you if you need tooltips inside lazy lists or with complex clipping. The persistence feature (setShowCounts / setPreferenceName) uses SharedPreferences under the hood, so it doesn't survive app reinstalls or sync across devices, which is probably not what most onboarding flows actually want. Custom layout support requires findViewById after getContentView(), which is the old View pattern and has no Compose equivalent for custom content. No built-in accessibility support is mentioned — tooltip visibility via TalkBack/screen readers is left entirely to the caller.