Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

🎈 Modernized and sophisticated tooltips, fully customizable with an arrow and animations for Android and Jetpack Compose.

License

NotificationsYou must be signed in to change notification settings

skydoves/Balloon


🎈 Modernized and sophisticated tooltips, fully customizable with an arrow and animations on Android.


GoogleTwitterLinkedInProfile
LicenseAPIBuild StatusMediumProfileDokka


Who's using Balloon?

👉Check out who's using Balloon

Balloon hits+800,000 downloads every month around the globe! 🎈

globe

Balloon in Jetpack Compose

If you want to use Balloon in your Jetpack Compose project, check out theBalloon in Jetpack Compose section. You can also check out the blog postTooltips for Jetpack Compose: Improve User Experience to the Next Level for more details.

💝 Sponsors

coderabbit

stream

Including in your project

Maven Central

Gradle

Add the dependency below to yourmodule'sbuild.gradle file:

dependencies {    implementation("com.github.skydoves:balloon:1.7.3")}

How to Use

Balloon supports both Kotlin and Java projects, so you can reference it by your language.

Create Balloon with Kotlin

We can create an instance of the Balloon with theBalloon.Builder class.

val balloon=Balloon.Builder(context)  .setWidthRatio(1.0f)  .setHeight(BalloonSizeSpec.WRAP)  .setText("Edit your profile here!")  .setTextColorResource(R.color.white_87)  .setTextSize(15f)  .setIconDrawableResource(R.drawable.ic_edit)  .setArrowPositionRules(ArrowPositionRules.ALIGN_ANCHOR)  .setArrowSize(10)  .setArrowPosition(0.5f)  .setPadding(12)  .setCornerRadius(8f)  .setBackgroundColorResource(R.color.skyBlue)  .setBalloonAnimation(BalloonAnimation.ELASTIC)  .setLifecycleOwner(lifecycle)  .build()

Create Balloon with Kotlin DSL

We can also create an instance of the Balloon with the Kotlin DSL.

Keep reading for more details

You can create an instance of the Balloon withcreateBalloon as the example below:

val balloon= createBalloon(context) {  setWidthRatio(1.0f)  setHeight(BalloonSizeSpec.WRAP)  setText("Edit your profile here!")  setTextColorResource(R.color.white_87)  setTextSize(15f)  setIconDrawableResource(R.drawable.ic_edit)  setArrowPositionRules(ArrowPositionRules.ALIGN_ANCHOR)  setArrowSize(10)  setArrowPosition(0.5f)  setPadding(12)  setCornerRadius(8f)  setBackgroundColorResource(R.color.skyBlue)  setBalloonAnimation(BalloonAnimation.ELASTIC)  setLifecycleOwner(lifecycle)  build()}

Create Balloon with Java

You can create an instance of the Balloon with Java by using theBalloon.Builder class.

Keep reading for more details

You can create an instance of the Balloon as the following example below:

Balloonballoon =newBalloon.Builder(context)    .setArrowSize(10)    .setArrowOrientation(ArrowOrientation.TOP)    .setArrowPositionRules(ArrowPositionRules.ALIGN_ANCHOR)    .setArrowPosition(0.5f)    .setWidth(BalloonSizeSpec.WRAP)    .setHeight(65)    .setTextSize(15f)    .setCornerRadius(4f)    .setAlpha(0.9f)    .setText("You can access your profile from now on.")    .setTextColor(ContextCompat.getColor(context,R.color.white_93))    .setTextIsHtml(true)    .setIconDrawable(ContextCompat.getDrawable(context,R.drawable.ic_profile))    .setBackgroundColor(ContextCompat.getColor(context,R.color.colorPrimary))    .setOnBalloonClickListener(onBalloonClickListener)    .setBalloonAnimation(BalloonAnimation.FADE)    .setLifecycleOwner(lifecycleOwner)    .build();

Show up Balloon

We can show up the Balloon using the functions below. If we useshowAlign__ method, we can show up the Balloon based on alignments (top, bottom, right, left). Also, we can adjust specific positions of the Balloon by usingx-Offset andy-Offset parameters.

balloon.showAlignTop(anchor:View)// shows the balloon on an anchor view as the top alignment.balloon.showAlignTop(anchor:View, xOff:Int, yOff:Int)// shows top alignment with x-off and y-off.balloon.showAlignBottom(anchor:View)// shows the balloon on an anchor view as the bottom alignment.balloon.showAlignBottom(anchor:View, xOff:Int, yOff:Int)// shows bottom alignment with x-off and y-off.balloon.showAlignEnd(anchor:View)// shows the balloon on an anchor view as the end alignment.balloon.showAlignEnd(anchor:View, xOff:Int, yOff:Int)// shows end alignment with x-off and y-off.balloon.showAlignStart(anchor:View)// shows the balloon on an anchor view as the start alignment.balloon.showAlignStart(anchor:View, xOff:Int, yOff:Int)// shows start alignment with x-off and y-off.balloon.showAsDropDown(anchor:View)// shows the balloon as a dropdown without any alignments.balloon.showAsDropDown(anchor:View, xOff:Int, yOff:Int)// shows no alignments with x-off and y-off.balloon.showAtCenter(anchor:View, xOff:Int, yOff:Int, centerAlign:BalloonCenterAlign.TOP)// shows the balloon over the anchor view (overlap) as the center aligns.

Also, We can show up the Balloon with Kotlin extensions.

myButton.showAlignTop(balloon)

Dismiss Balloon

We can dismiss the Balloon by using theBalloon.dismiss() method.

balloon.dismiss()balloon.dismissWithDelay(1000L)// dismisses 1000 milliseconds later when the popup is shown

We can dismiss automatically with a delay after the Balloon is shown using thesetAutoDismissDuration method.

Balloon.Builder(context)// dismisses automatically 1000 milliseconds later when the popup is shown.   .setAutoDismissDuration(1000L)...

Show up Balloon Sequentially

We can show up a couple of Balloons sequentially with therelayShow__ andawait__ methods.

customListBalloon  .relayShowAlignBottom(customProfileBalloon, circleImageView)// relay to customListBalloon  .relayShowAlignTop(customTagBalloon, bottomNavigationView,130,0)// relay to customProfileBalloon// show sequentially customListBalloon-customProfileBalloon-customTagBallooncustomListBalloon.showAlignBottom(anchorView)
coroutineScope.launch {  customListBalloon.awaitAlignBottom(anchorView)  customProfileBalloon.awaitAlignBottom(circleImageView,0,0)  customTagBalloon.awaitAlignTop(bottomNavigationView,130,0)}

Note: TherelayShow__ andawait__ methods overwrite thesetOnDismissListener internally, so you can't use thesetOnDismissListener at the same time.

Parallel Displaying

We can show multiple balloons at the same time with sequential behavior.

lifecycleScope.launch {// shows balloons at the same time  awaitBalloons {// dismissing of any balloon dismisses all of them. Default behaviour    dismissSequentially=false    textView.alignTop(balloonAlignTop)    textView.alignStart(balloonAlignStart)    textView.alignEnd(balloonAlignEnd)    textView.alignBottom(balloonAlignBottom)  }// shows another group after dismissing the previous group.  awaitBalloons {    dismissSequentially=true// balloons dismissed individually    imageView.alignTop(balloonAlignTop)    imageView.alignStart(balloonAlignStart)    imageView.alignEnd(balloonAlignEnd)    imageView.alignBottom(balloonAlignBottom)  }}

Note: The methods insideawaitBalloons areatCenter,asDropdown,alignTop and etc. Don't confuse withshow__ andawait__ methods.

Width and height

We can adjust specific width and height sizes of Balloon with the below builder methods. If we don't set any specific sizes of the width and height of the Balloon, the size of the Balloon will be decided by the content.

Specific size

We can set specific sizes of the Balloon regardless size of the contents.

balloon.setWidth(220)// sets 220dp width size.balloon.setHeight(160)// sets 160dp height size.

Wrap Content Sizes

We can set dynamic sizes of Balloon, which depends on sizes of the internal content.

balloon.setWidth(BalloonSizeSpec.WRAP)// sets width size depending on the content's size.balloon.setHeight(BalloonSizeSpec.WRAP)// sets height size depending on the content's size.

Depending on Screen Size

Also, we can set the width size depending on the ratio of the screen's size (horizontal).

balloon.setWidthRatio(0.5f)// sets width as 50% of the horizontal screen's size.

Padding

Balloon wraps contents. We can adjust the content size of the Balloon by adding paddings on the content like.

balloon.setPadding(6)// sets 6dp padding to all directions (left-top-right-bottom)balloon.setPaddingLeft(8)// sets 8dp padding to content's left.balloon.setPaddingTop(12)// sets 12dp padding to content's top.

Margin

If the location of the balloon according to the anchor would be located at the boundaries on the screen,
the balloon will be stick to the end of the screen. In this case, we can give horizontal margins to the balloon.

.setMargin(12)// sets the margin on the balloon all directions..setMarginLeft(14)// sets the left margin on the balloon..setMarginRight(14)// sets the right margin on the balloon.

Auto-sized text

You can set auto-sized text based on the balloon's window size, specifying minimum and maximum text sizes, as shown in the example below:

.setTextSize(15f).setMinAutoSizeTextSize(14f).setMaxAutoSizeTextSize(18f).setEnableAutoSized(true)

Note: Ensure that the maximum auto text size is set to a value higher than the minimum auto text size.

Arrow Composition

We can customize the arrow on the Balloon with various methods. For more details, check out theBalloon.Builder.

.setIsVisibleArrow(true)// sets the visibility of the arrow..setArrowSize(10)// sets the arrow size..setArrowSize(BalloonSizeSpec.WRAP)// sets arrow size depending on the original resources' size..setArrowPosition(0.8f)// sets the arrow position using the popup size's ratio (0 ~ 1.0).setArrowOrientation(ArrowOrientation.TOP)// sets the arrow orientation. top, bottom, left, right.setArrowDrawable(ContextCompat.getDrawable(context,R.drawable.arrow))// sets the arrow drawable.

ArrowPositionRules

We can decide the position of the arrow depending on the aligning rules with theArrowPositionRules.

// Align the arrow position depending on an anchor.// if `arrowPosition` is 0.5, the arrow will be located in the middle of an anchor..setArrowPositionRules(ArrowPositionRules.ALIGN_ANCHOR)// Align the arrow position depending on the balloon popup body.// if `arrowPosition` is 0.5, the arrow will be located in the middle of the tooltip..setArrowPositionRules(ArrowPositionRules.ALIGN_BALLOON)// default

ArrowOrientationRules

We can decide the orientation of the arrow depending on the aligning rules with theArrowOrientationRules.

// Align depending on the position of an anchor.// For example, `arrowOrientation` is ArrowOrientation.TOP and// we want to show up the balloon under an anchor using the `Balloon.showAlignBottom`.// However, if there is not enough free space to place the tooltip at the bottom of the anchor,// tooltips will be placed top of the anchor and the orientation of the arrow will be `ArrowOrientation.BOTTOM`..setArrowOrientationRules(ArrowOrientationRules.ALIGN_ANCHOR)// default// Align to fixed ArrowOrientation value..setArrowOrientationRules(ArrowOrientationRules.ALIGN_FIXED)

Below previews are shows examples ofsetArrowOrientation andsetArrowPosition methods.
ThesetArrowPosition measures the Balloon's size and sets the arrow's position with the ratio value.

Orientation: BOTTOM
Position: 0.62
showAlignTop
Orientation: TOP
Position : 0.5
showAlignBottom
Orientation: START
Position: 0.5
showAlignStart
Orientation: END
Position: 0.5
showAlignEnd

Text Composition

We can customize the text on the Balloon.

.setText("You can edit your profile now!").setTextSize(15f).setTextTypeface(Typeface.BOLD).setTextColorResource(R.color.colorAccent)).setTextGravity(Gravity.START)

If your text includes HTML tags, you can render the text by enabling HTML option withsetTextIsHtml method.

.setTextIsHtml(true)

This method will parse the text with theHtml.fromHtml(text) internally.

TextForm

TextForm has some attributes forTextView to customize the text of the Balloon. You can create theTextForm instance and reuse it on multiple Balloons.

val textForm=TextForm.Builder(context)  .setText("Edit your profile here!")  .setTextColorResource(R.color.white_87)  .setTextSize(14f)  .setTextTypeface(Typeface.BOLD)  .build()val balloon=Balloon.Builder(context)  .setTextForm(textForm)...
Create TextForm with Kotlin DSL

You can create an instance of theTextForm with Kotlin DSL as the example below:

val textForm= textForm(context) {  setText("Edit your profile here!")  setTextColorResource(R.color.white_87)  setTextSize(14f)  setTextTypeface(Typeface.BOLD)}val balloon=Balloon.Builder(context)  .setTextForm(textForm)...
Create TextForm with Java

You can create an instance of theTextForm with Java as the example below:

TextFormtextForm =newTextForm.Builder(context)  .setText("Edit your profile here!")  .setTextColorResource(R.color.white_87)  .setTextSize(14f)  .setTextTypeface(Typeface.BOLD)  .build();Balloonballoon =newBalloon.Builder(context)  .setTextForm(textForm)  ...

Icon Composition

We can customize the icon on the balloon.

.setIconSpace(10)// sets right margin of the icon..setIconSize(20)// sets size of the icon..setIconDrawable(ContextCompat.getDrawable(context,R.drawable.ic_edit))// sets a drawable resource.

IconForm

IconForm has some attributes forImageView to customize the icon of the Balloon. You can create theIconForm instance and reuse it on multiple Balloons.

val iconForm=IconForm.Builder(context)  .setDrawable(ContextCompat.getDrawable(context,R.drawable.arrow))  .setIconColor(ContextCompat.getColor(context,R.color.skyblue))  .setIconSize(20)  .setIconSize(12)  .build()val balloon=Balloon.Builder(context)  .setIconForm(iconForm)...
Create IconForm with Kotlin DSL

You can create an instance of theIconForm with Kotlin DSL as the example below:

val iconForm= iconForm(context) {  setDrawable(ContextCompat.getDrawable(context,R.drawable.arrow))  setIconColor(ContextCompat.getColor(context,R.color.skyblue))  setIconSize(20)  setIconSize(12)}val balloon=Balloon.Builder(context)  .setIconForm(iconForm)...
Create IconForm with Java

You can create an instance of theIconForm with Java as the example below:

IconFormiconForm =newIconForm.Builder(context)  .setDrawable(ContextCompat.getDrawable(context,R.drawable.arrow))  .setIconColor(ContextCompat.getColor(context,R.color.skyblue))  .setIconSize(20)  .setIconSize(12)  .build();Balloonballoon =newBalloon.Builder(context)  .setIconForm(iconForm)  ...

OnBalloonClickListener, OnBalloonDismissListener, OnBalloonOutsideTouchListener

We can listen to if the Balloon is clicked, dismissed, and touched outside with the below listeners.

.setOnBalloonClickListener {Toast.makeText(context,"clicked",Toast.LENGTH_SHORT).show() }.setOnBalloonDismissListener {Toast.makeText(context,"dismissed",Toast.LENGTH_SHORT).show() }.setOnBalloonOutsideTouchListener {Toast.makeText(context,"touched outside",Toast.LENGTH_SHORT).show() }
Set Listeners with Java

You can set listeners with Java as the example below:

balloon.setOnBalloonClickListener(newOnBalloonClickListener() {@OverridepublicvoidonBalloonClick() {// doSomething;  }});balloon.setOnBalloonDismissListener(newOnBalloonDismissListener() {@OverridepublicvoidonBalloonDismiss() {// doSomething;  }});balloon.setOnBalloonOutsideTouchListener(newOnBalloonOutsideTouchListener() {@OverridepublicvoidonBalloonOutsideTouch() {// doSomething;  }});

Custom Balloon Layout

You can fully customize the layout of the Balloon with the method below:

.setLayout(R.layout.my_balloon_layout)

You can build the Balloon with your own layout as the following example:

First, create your XML layout file likelayout_custom_profile to your taste and set it with thesetLayout method.

val balloon=Balloon.Builder(context)  .setLayout(R.layout.layout_custom_profile)  .setArrowSize(10)  .setArrowOrientation(ArrowOrientation.TOP)  .setArrowPosition(0.5f)  .setWidthRatio(0.55f)  .setHeight(250)  .setCornerRadius(4f)  .setBackgroundColor(ContextCompat.getColor(this,R.color.black))  .setBalloonAnimation(BalloonAnimation.CIRCULAR)  .setLifecycleOwner(lifecycleOwner)  .build()

That's all. If you need to get Views or need some interactions, you can get your custom layout with thegetContentView() method from your instance of the Balloon.

val button:Button=  balloon.getContentView().findViewById(R.id.button_edit)button.setOnClickListener {Toast.makeText(context,"Edit",Toast.LENGTH_SHORT).show()  balloon.dismiss()}
Image

Stroke

You can apply a custom stroke to the balloon container and its arrow using the code below:

val balloon=Balloon.Builder(context)..  .setBalloonStroke(        color=Color.White.toArgb(),        thickness=4f,      )  .build()

Persistence

If you want to show up the Balloon only once or a specific number of times, you can implement it as the following example:

balloon.setPreferenceName("MyBalloon")// sets preference name of the Balloon.balloon.setShowCounts(3)// show-up three of times the popup. the default value is 1.balloon.runIfReachedShowCounts {// do something after the preference showing counts is reached the goal.  }

Also, you can clear all persisted preferences with the method below:

balloon.clearAllPreferences()

Avoid Memory leak

Dialog, PopupWindow etc, can have memory leak issues if not dismissed before the activity or fragment is destroyed.
But Lifecycles are now integrated with the Support Library since Architecture Components 1.0 Stable was released.
So we can solve the memory leak issue very easily like the below.

Just usesetLifecycleOwner method. Then thedismiss() method will be called automatically before your activity or fragment would be destroyed.

.setLifecycleOwner(lifecycleOwner)

Lazy initialization

You can initialize a property of the Balloon lazily with theballoon() extension andBalloon.Factory abstract class.
Theballoon() extension keyword can be used on yourActivity,Fragment, andView.

Before
CustomActivity.kt

classCustomActivity :AppCompatActivity() {privateval profileBalloon by lazy {BalloonUtils.getProfileBalloon(context=this, lifecycleOwner=this) }// ...}

After
CustomActivity.kt

classCustomActivity :AppCompatActivity() {privateval profileBalloon by balloon<ProfileBalloonFactory>()// ...}

We should create a class which extendsBalloon.Factory.
An implementation class of the factory must have a default(non-argument) constructor.

ProfileBalloonFactory.kt

classProfileBalloonFactory :Balloon.Factory() {overridefuncreate(context:Context,lifecycle:LifecycleOwner):Balloon {return createBalloon(context) {      setLayout(R.layout.layout_custom_profile)      setArrowSize(10)      setArrowOrientation(ArrowOrientation.TOP)      setArrowPosition(0.5f)      setWidthRatio(0.55f)      setHeight(250)      setCornerRadius(4f)      setBackgroundColor(ContextCompat.getColor(context,R.color.background900))      setBalloonAnimation(BalloonAnimation.CIRCULAR)      setLifecycleOwner(lifecycle)    }  }}

BalloonOverlay

We can show up an overlay over the whole screen except an anchor view.

balloon.setIsVisibleOverlay(true)// sets the visibility of the overlay for highlighting an anchor.balloon.setOverlayColorResource(R.color.overlay)// background color of the overlay using a color resource.balloon.setOverlayPadding(6f)// sets a padding value of the overlay shape internally.balloon.setOverlayPaddingColorResource(R.color.colorPrimary)// sets color of the overlay padding using a color resource.balloon.setBalloonOverlayAnimation(BalloonOverlayAnimation.FADE)// default is fade.balloon.setDismissWhenOverlayClicked(false)// disable dismissing the balloon when the overlay is clicked.

We can change the shape of the highlighting using the.setOverlayShape method.

balloon.setOverlayShape(BalloonOverlayOval)// default shapeballoon.setOverlayShape(BalloonOverlayRect)balloon.setOverlayShape(BalloonOverlayCircle(radius=36f))balloon.setOverlayShape(BalloonOverlayRoundRect(12f,12f))
OVALCIRCLERECTROUNDRECT

Also, we can set the specific position of the overlay shape with the method below:

balloon.setOverlayPosition(Point(x, y))// sets a specific position of the overlay shape.

BalloonAnimation

We can implement popup animations while showing and dismissing.

BalloonAnimation.NONEBalloonAnimation.FADEBalloonAnimation.OVERSHOOTBalloonAnimation.ELASTICBalloonAnimation.CIRCULAR
FADEOVERSHOOTELASTICCIRCULAR

BalloonHighlightAnimation

We can give a repeated dynamic animations to the Balloon while it's showing up. The animation would work differently by the position of the arrow.

HEARTBEATSHAKEBREATHROTATE
BalloonHighlightAnimation.NONEBalloonHighlightAnimation.HEARTBEATBalloonHighlightAnimation.SHAKEBalloonHighlightAnimation.BREATHBalloonHighlightAnimation.ROTATE.setBalloonHighlightAnimation(BalloonHighlightAnimation.SHAKE)

We can implement the rotate animation like the example below:

.setBalloonHighlightAnimation(BalloonHighlightAnimation.ROTATE).setBalloonRotationAnimation(BalloonRotateAnimation.Builder().setLoops(2).setSpeeds(2500).setTurns(INFINITE).build())

Balloon builder methods

For more details, you can check out the documentations below:

Balloon in Jetpack Compose

Balloon allows you to display tooltips in Jetpack Compose easily using theModifier.balloon() API.

Maven Central

Add the dependency below to yourmodule'sbuild.gradle file:

dependencies {    implementation("com.github.skydoves:balloon-compose:$version")}

Modifier.balloon

You can create and display tooltips using theModifier.balloon() extension along withrememberBalloonState(), as demonstrated in the following example:

// Create and remember a builder for the Balloon.val builder= rememberBalloonBuilder {  setArrowSize(10)  setArrowPosition(0.5f)  setArrowPositionRules(ArrowPositionRules.ALIGN_ANCHOR)  setWidth(BalloonSizeSpec.WRAP)  setHeight(BalloonSizeSpec.WRAP)  setPadding(12)  setMarginHorizontal(12)  setCornerRadius(8f)  setBackgroundColorResource(R.color.skyBlue)  setBalloonAnimation(BalloonAnimation.ELASTIC)}// Create and remember the balloon state.val balloonState= rememberBalloonState(builder)Button(  modifier=Modifier    .align(Alignment.Center)    .balloon(balloonState) {Text(text="Now you can edit your profile!")    },  onClick= { balloonState.showAlignTop() },) {Text(text="Show Balloon")}

BalloonState

BalloonState is a state holder for managing balloon display and interactions. It provides control over the balloon lifecycle, including showing, dismissing, updating, and setting up listeners. You can create an instance usingrememberBalloonState():

val balloonState= rememberBalloonState(builder)// Show the balloonballoonState.showAlignTop()balloonState.showAlignBottom()balloonState.showAlignStart()balloonState.showAlignEnd()balloonState.showAtCenter()// Dismiss the balloonballoonState.dismiss()// Check if the balloon is showingif (balloonState.isShowing) {// ...}

Various Balloon Positions

You can display the balloon in different positions relative to the anchor composable:

val balloonState= rememberBalloonState(builder)Column {Button(    modifier=Modifier.balloon(balloonState) {Text("Tooltip content") },    onClick= { balloonState.showAlignTop() },// Shows above the button  ) {Text(text="Show Top")  }Button(    modifier=Modifier.balloon(balloonState) {Text("Tooltip content") },    onClick= { balloonState.showAlignBottom() },// Shows below the button  ) {Text(text="Show Bottom")  }Button(    modifier=Modifier.balloon(balloonState) {Text("Tooltip content") },    onClick= { balloonState.showAlignStart() },// Shows at the start of the button  ) {Text(text="Show Start")  }Button(    modifier=Modifier.balloon(balloonState) {Text("Tooltip content") },    onClick= { balloonState.showAlignEnd() },// Shows at the end of the button  ) {Text(text="Show End")  }}

Auto-Display Balloon on Layout Ready

To automatically show a Balloon when your layout is drawn, you can useLaunchedEffect:

val balloonState= rememberBalloonState(builder)LaunchedEffect(Unit) {  balloonState.showAlignTop()}Button(  modifier=Modifier.balloon(balloonState) {Text(text="Now you can edit your profile!")  },  onClick= { balloonState.showAlignTop() },) {Text(text="Show Balloon")}

Compose Extensions

Theballoon-compose package provides useful Compose extensions, such as setting a color withandroidx.compose.ui.graphics.Color:

val builder= rememberBalloonBuilder {  setText("Now you can edit your profile!")  setArrowSize(10)  setWidthRatio(1.0f)  setHeight(BalloonSizeSpec.WRAP)  setArrowOrientation(ArrowOrientation.BOTTOM)  setArrowPosition(0.5f)  setPadding(12)  setMarginHorizontal(12)  setTextSize(15f)  setCornerRadius(8f)  setTextColor(Color.White)// Set text color with Compose color.  setBackgroundColor(Color.White)// Set background color with Compose color.  setIconDrawableResource(R.drawable.ic_edit)}

Listening to Balloon Events

You can set listeners on theBalloonState to respond to balloon events:

val balloonState= rememberBalloonState(builder)// Set click listenerballoonState.setOnBalloonClickListener {// Handle balloon click}// Set dismiss listenerballoonState.setOnBalloonDismissListener {// Handle balloon dismiss}// Set outside touch listenerballoonState.setOnBalloonOutsideTouchListener { view, event->// Handle outside touch}

Find this library useful? ❤️

Support it by joiningstargazers for this repository. ⭐
Also,follow me on GitHub for my next creations! 🤩

License

Copyright 2019 skydoves (Jaewoong Eum)Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at   http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.

About

🎈 Modernized and sophisticated tooltips, fully customizable with an arrow and animations for Android and Jetpack Compose.

Topics

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Contributors30

Languages


[8]ページ先頭

©2009-2026 Movatter.jp