From cdd9651f42de01312ec267715cfd05f4fb70a454 Mon Sep 17 00:00:00 2001 From: seunghwa2 Date: Wed, 17 Feb 2021 15:41:20 +0900 Subject: [PATCH] Textview in the custom layout with no decoration. because using xml is easy and simple --- .../library/tooltip_demo/MainActivity.kt | 24 +++++-- app/src/main/res/layout/custom_tooltip.xml | 7 +- .../android/library/xtooltip/Tooltip.kt | 71 +++++++++++-------- 3 files changed, 64 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/it/sephiroth/android/library/tooltip_demo/MainActivity.kt b/app/src/main/java/it/sephiroth/android/library/tooltip_demo/MainActivity.kt index 226635ab..d9b5348e 100644 --- a/app/src/main/java/it/sephiroth/android/library/tooltip_demo/MainActivity.kt +++ b/app/src/main/java/it/sephiroth/android/library/tooltip_demo/MainActivity.kt @@ -38,19 +38,29 @@ class MainActivity : AppCompatActivity() { tooltip?.dismiss() +// tooltip = Tooltip.Builder(this) +// .anchor(button, 0, 0, false) +// .text(text) +// .styleId(style) +// .typeface(typeface) +// .maxWidth(metrics.widthPixels / 2) +// .arrow(arrow) +// .floatingAnimation(animation) +// .closePolicy(closePolicy) +// .showDuration(showDuration) +// .overlay(overlay) +// .create() + + tooltip = Tooltip.Builder(this) .anchor(button, 0, 0, false) - .text(text) - .styleId(style) - .typeface(typeface) - .maxWidth(metrics.widthPixels / 2) - .arrow(arrow) + .customViewNoDecor(R.layout.custom_tooltip, R.id.tooltip_text) .floatingAnimation(animation) + .text(text) .closePolicy(closePolicy) - .showDuration(showDuration) - .overlay(overlay) .create() + tooltip ?.doOnHidden { tooltip = null diff --git a/app/src/main/res/layout/custom_tooltip.xml b/app/src/main/res/layout/custom_tooltip.xml index 53630eb5..0419c4ce 100644 --- a/app/src/main/res/layout/custom_tooltip.xml +++ b/app/src/main/res/layout/custom_tooltip.xml @@ -11,11 +11,14 @@ android:padding="0dp"> diff --git a/xtooltip/src/main/java/it/sephiroth/android/library/xtooltip/Tooltip.kt b/xtooltip/src/main/java/it/sephiroth/android/library/xtooltip/Tooltip.kt index 5d9eeb5e..1314d269 100644 --- a/xtooltip/src/main/java/it/sephiroth/android/library/xtooltip/Tooltip.kt +++ b/xtooltip/src/main/java/it/sephiroth/android/library/xtooltip/Tooltip.kt @@ -90,6 +90,7 @@ class Tooltip private constructor(private val context: Context, builder: Builder private var mDrawable: TooltipTextDrawable? = null private var mAnchorView: WeakReference? = null private lateinit var mContentView: View + private var isCustomViewNoDecor = false private lateinit var mTextView: TextView private val hideRunnable = Runnable { hide() } @@ -124,7 +125,7 @@ class Tooltip private constructor(private val context: Context, builder: Builder offsetBy( (mNewLocation[0] - mOldLocation!![0]).toFloat(), (mNewLocation[1] - mOldLocation!![1]).toFloat() - ) + ) } mOldLocation!![0] = mNewLocation[0] @@ -137,12 +138,12 @@ class Tooltip private constructor(private val context: Context, builder: Builder init { val theme = context.theme - .obtainStyledAttributes( - null, - R.styleable.TooltipLayout, - builder.defStyleAttr, - builder.defStyleRes - ) + .obtainStyledAttributes( + null, + R.styleable.TooltipLayout, + builder.defStyleAttr, + builder.defStyleRes + ) this.mPadding = theme.getDimensionPixelSize(R.styleable.TooltipLayout_ttlm_padding, 30) mOverlayStyle = theme.getResourceId( @@ -185,6 +186,7 @@ class Tooltip private constructor(private val context: Context, builder: Builder } builder.layoutId?.let { + isCustomViewNoDecor = builder.customViewNoDecor mTextViewIdRes = builder.textId!! mTooltipLayoutIdRes = builder.layoutId!! mIsCustomView = true @@ -229,12 +231,14 @@ class Tooltip private constructor(private val context: Context, builder: Builder } fun update(text: CharSequence?) { - mText = text - if (isShowing && null != mPopupView) { - mTextView.text = if (text is Spannable) { - text - } else { - HtmlCompat.fromHtml(text as String, HtmlCompat.FROM_HTML_MODE_COMPACT) + text?.let { + mText = text + if (isShowing && null != mPopupView) { + mTextView.text = if (text is Spannable) { + text + } else { + HtmlCompat.fromHtml(text as String, HtmlCompat.FROM_HTML_MODE_COMPACT) + } } } } @@ -312,25 +316,26 @@ class Tooltip private constructor(private val context: Context, builder: Builder } mFloatingAnimation?.let { contentView.setPadding(it.radius) } - mTextView = contentView.findViewById(mTextViewIdRes) - with(mTextView) { - mDrawable?.let { background = it } + if(!isCustomViewNoDecor){ + with(mTextView) { + mDrawable?.let { background = it } - if (mShowArrow) - setPadding(mPadding, mPadding, mPadding, mPadding) - else - setPadding(mPadding / 2, mPadding / 2, mPadding / 2, mPadding / 2) + if (mShowArrow) + setPadding(mPadding, mPadding, mPadding, mPadding) + else + setPadding(mPadding / 2, mPadding / 2, mPadding / 2, mPadding / 2) - text = if (mText is Spannable) { - mText - } else { - HtmlCompat.fromHtml(this@Tooltip.mText as String, HtmlCompat.FROM_HTML_MODE_COMPACT) - } + text = if (mText is Spannable) { + mText + } else { + HtmlCompat.fromHtml(this@Tooltip.mText as String, HtmlCompat.FROM_HTML_MODE_COMPACT) + } - mMaxWidth?.let { maxWidth = it } - mTypeface?.let { typeface = it } + mMaxWidth?.let { maxWidth = it } + mTypeface?.let { typeface = it } + } } if (null != mViewOverlay) { @@ -488,7 +493,7 @@ class Tooltip private constructor(private val context: Context, builder: Builder contentPosition.y, contentPosition.x + w, contentPosition.y + h - ) + ) if (!displayFrame.rectContainsWithTolerance(finalRect, mSizeTolerance.toInt())) { Timber.e("content won't fit! $displayFrame, $finalRect") return findPosition(parent, anchor, offset, gravities, params, fitToScreen) @@ -636,7 +641,7 @@ class Tooltip private constructor(private val context: Context, builder: Builder gravities, params, fitToScreen) - ) + ) } fun hide() { @@ -843,6 +848,7 @@ class Tooltip private constructor(private val context: Context, builder: Builder internal var activateDelay = 0L internal var followAnchor = false internal var animationStyle: Int? = null + internal var customViewNoDecor: Boolean = false @LayoutRes internal var layoutId: Int? = null @@ -865,6 +871,13 @@ class Tooltip private constructor(private val context: Context, builder: Builder return this } + fun customViewNoDecor(@LayoutRes layoutId: Int, @IdRes textId: Int): Builder { + this.layoutId = layoutId + this.textId = textId + customViewNoDecor = true + return this + } + fun customView(@LayoutRes layoutId: Int, @IdRes textId: Int): Builder { this.layoutId = layoutId this.textId = textId