zoukankan      html  css  js  c++  java
  • Android 文本后面添加标签

    原理:

    定义一个view-》设置标签相关信息-大小,颜色,背景 -》 转换为bitmap -》 ImageSpan 对象-》 spannableStringBuilder 对象设置

    给文本赋值:TextView .text =  spannableStringBuilder 对象

    效果:

    配合databinding实现:说明下面的 pd方法 为kt拓展函数 - 转为px

    KT-先拓展标签方法 
    
    object TextViewAdapter {
    
        //给标题 后面添加标签
        @BindingAdapter("textTag")
        @JvmStatic
        fun adaptTextTag(view: TextView, value: String?) {
            val text = value ?: "";
            if (text.isEmpty()) return
    
            val textList = text.split("@")
            if (textList.size > 1) {
                view.text = createTag(view, textList.get(0), textList.get(1))
            } else {
                view.text = text
            }
        }
    
        @JvmStatic
        private fun createTag(view: TextView, title: String, tag: String): SpannableStringBuilder {
    
            val mContext = view.context
            val content = title + tag
            val colorStr = "#ffff3b56"
    
            /**
             * 创建TextView对象,设置drawable背景,设置字体样式,设置间距,设置文本等
             * 这里我们为了给TextView设置margin,给其添加了一个父容器LinearLayout。不过他俩都只是new出来的,不会添加进任何布局
             */
            val layout = LinearLayout(mContext)
            val textView = TextView(mContext)
            textView.text = tag
            textView.background = mContext.resources.getDrawable(R.drawable.bg_msg_label)
            textView.textSize = 10f
            textView.setTextColor(Color.parseColor(colorStr))
            textView.includeFontPadding = false
    
            //内容左右内间距
            val hPadding = mContext.dp(6).toInt()
            val vPadding = mContext.dp(2).toInt()
            textView.setPadding(
                hPadding, vPadding,
                hPadding, vPadding
            )
            //textView.height = dip2px(30)
            textView.gravity = Gravity.CENTER_VERTICAL
            val layoutParams = LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
            )
    
            val lMagrin = mContext.dp(5).toInt()
            val bMargin = mContext.dp(3).toInt()
    
            // 设置左间距
            layoutParams.leftMargin = lMagrin
            // 设置下间距,简单解决ImageSpan和文本竖直方向对齐的问题
            layoutParams.bottomMargin = bMargin
            layout.addView(textView, layoutParams)
            /**
             * 第二步,测量,绘制layout,生成对应的bitmap对象
             */
            layout.isDrawingCacheEnabled = true
            layout.measure(
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
            )
            // 给上方设置的margin留出空间
            layout.layout(
                0,
                0,
                textView.measuredWidth + (lMagrin + bMargin),
                textView.measuredHeight
            )
            // 获取bitmap对象
            val bitmap = Bitmap.createBitmap(layout.drawingCache)
            //千万别忘最后一步
            layout.destroyDrawingCache()
            /**
             * 第三步,通过bitmap生成我们需要的ImageSpan对象
             */
            val imageSpan = ImageSpan(mContext, bitmap)
    
            /**
             * 第四步将ImageSpan对象设置到SpannableStringBuilder的对应位置
             */
            val ssb = SpannableStringBuilder(content)
    
            ssb.setSpan(imageSpan, title.length, content.length, Spanned.SPAN_EXCLUSIVE_INCLUSIVE)
    
            return ssb
    
        }
    
    
    }
    
    
    
    然后标签使用
    <TextView
                                android:layout_width="wrap_content"
                                android:layout_height="wrap_content"
                                android:ellipsize="end"
                                android:maxLines="2"
                                android:textColor="#00000"
                                android:textSize="15sp"
                                app:textTag="@{`这里是测试标题@Official`}" />
    

      

    参考:

    DataBinding

    https://juejin.cn/post/6844904186644004872#heading-0

    文本后面添加标签:

    https://blog.csdn.net/qq_26287435/article/details/100305849

    https://github.com/tinyvampirepudge/Android_Base_Demo/blob/master/app/src/main/java/com/tiny/demo/firstlinecode/uicomponents/textview/SpannableStringBuilderActivity.java

    https://juejin.cn/post/6964261957650579493#heading-4

  • 相关阅读:
    react学习笔记4
    php学习笔记
    react学习笔记2
    react学习笔记
    获取一个数组中的随机值
    添加数据库补丁
    $.post $.getScript
    SQLServer2008将表数据导出的方法
    DataTable筛选符合条件的DataRow
    c# 下拉多选的实现
  • 原文地址:https://www.cnblogs.com/heheisme/p/15667113.html
Copyright © 2011-2022 走看看