gpt4 book ai didi

android - 围绕图像流动 TextView

转载 作者:IT老高 更新时间:2023-10-28 13:40:55 24 4
gpt4 key购买 nike

我花了几个小时寻找答案,但真的不知道如何解决它。那么让我们开始吧:

有一个图像和一个 TextView,我需要像这样在 ImageView 周围流动 TextView:

enter image description here

第一个可能的解决方案是使用 https://github.com/deano2390/FlowTextView但它没有扩展 TextView 所以这个库不适合我,原因有很多。

第二种解决方案是使用 LeadingMarginSpan.LeadingMarginSpan2 跨度,但它会影响文本中每 n 行的 each 段落(如在此答案中 -> How to layout text to flow around an image ),所以我得到这样的结果:

enter image description here

但我只想为前 n 行设置边距!然后我决定实现 LeadingMarginSpan.Standart 并创建一个计数器并在 getLeadingMargin(first: Boolean): Int 函数调用中递增它。当计数器达到所需值时,函数返回 0 作为边距宽度。而且又失败了!而不是填充 TextView 行,文本只是向左移动并且没有传播到 View 的末尾!

UPD:是的,我在这里使用了 onGlobalLayoutListener

enter image description here

好吧,谷歌搜索另一个解决方案我找到了这个答案 https://stackoverflow.com/a/27064368/7218592好的,我已经按照描述完成了所有工作并实现了代码:

            //set left margin of desirable width
val params: RelativeLayout.LayoutParams = RelativeLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
params.leftMargin = holder.imageContainerHeight!!
params.addRule(RelativeLayout.BELOW, holder.mNumberAndTimeInfo!!.id)
holder.mCommentTextView!!.layoutParams = params
if (holder.commentTextViewOnGlobalLayoutListener != null)
holder.mCommentTextView!!.viewTreeObserver.removeOnGlobalLayoutListener(
holder.commentTextViewOnGlobalLayoutListener)

//add onGlobalLayoutListener
holder.mCommentTextView!!.viewTreeObserver.addOnGlobalLayoutListener(
if (holder.commentTextViewOnGlobalLayoutListener != null)
holder.commentTextViewOnGlobalLayoutListener
else CommentTextViewOnGlobalLayoutListener(holder,
SpannableString(HtmlCompat.fromHtml(
mView.getActivity(), commentDocument.html(), 0,
null, SpanTagHandlerCompat(mView.getActivity())))))`

我的 OnGlobalLayoutListener 看起来像这样:`

class CommentTextViewOnGlobalLayoutListener(
val holder: CommentAndFilesListViewViewHolder, val commentSpannable: Spannable) :
ViewTreeObserver.OnGlobalLayoutListener {
val LOG_TAG: String = CommentTextViewOnGlobalLayoutListener::class.java.simpleName

override fun onGlobalLayout() {
holder.mCommentTextView!!.viewTreeObserver.removeGlobalOnLayoutListener(this)

//when textview layout is drawn, get the line end to spanify only the needed text
val charCount = holder.mCommentTextView!!.layout.getLineEnd(Math.min(
holder.mCommentTextView!!.layout.lineCount - 1,
CommentLeadingMarginSpan.computeLinesToBeSpanned(holder)))
if (charCount <= commentSpannable.length) {
commentSpannable.setSpan(CommentLeadingMarginSpan(holder),
0, charCount, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
}

//set the left margin back to zero
(holder.mCommentTextView!!.layoutParams as RelativeLayout.LayoutParams).leftMargin = 0
holder.mCommentTextView!!.text = commentSpannable
}
}

`

嗯,它有效。但它的效果多么糟糕!当我使用 View 持有者模式时,我必须为监听器保存一个变量,如果它没有被调用并成功删除,则将其删除,因为 onGlobalLayout 函数没有及时调用!而且调用的太晚了,所以需要等待300ms左右,然后再看TextView的所有“重构”,看起来很恶心!

所以,我的问题是:如何在 TextView 中为 first n 行设置边距,然后在 UI 上绘制?

最佳答案

这更像是一个建议,只有经过一些试验和错误才能奏效
此代码使用多行编辑文本

        btnPrint.setOnClickListener {
val str = """
One
Two
Three
Now click Action Button Custom SB
""".trimIndent()
etNews.setText(str)
}

使用一两个值 indent 和 trimIndent 有其他可用的属性

关于android - 围绕图像流动 TextView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45626957/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com