AndroidStudio_标签和文章混排

目的

实现标签和文章混排
AndroidStudio_标签和文章混排_第1张图片

思路

  1. 标签是文字——首行缩进
    设置两个textView,分别对应标签和正文。
    然后在代码中对正文内容设置首行缩进。
  2. 标签是图片——图文混排
    设置一个textView,在代码中设置插入图片。

代码

首行缩进

/**
 * 有标签时,设置首行缩进
 * @param strLabel String   标签内容
 * @param strMain String    正文内容
 * @return SpannableStringBuilder	完成缩进后的正文内容
 */
private fun setProductName(
    strLabel: String,
    strMain: String
): SpannableStringBuilder {
    val tvNameBuilder = SpannableStringBuilder(strMain)
    val labelMarginPx= dp2px(15)	// 标签水平边距的长度
    val labelStrPx= bind.tvLabel1.paint.measureText(strLabel).toInt()	//标签内容的长度
    val leadingMarginSpan = LeadingMarginSpan.Standard(labelMarginPx + labelStrPx, 0)
	tvNameBuilder.setSpan(
        leadingMarginSpan, 0, 0, SpannableStringBuilder.SPAN_INCLUSIVE_INCLUSIVE
    )
    return tvNameBuilder
}

private fun dp2px(dp: Int): Int {
	val metrics = context!!.resources.displayMetrics
    return (dp * (metrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)).toInt()
}

图文混排

采用SpannableStringBuilder实现。

private fun setProductName(
        strMain: String
    ): SpannableStringBuilder  {
        val tvNameBuilder= SpannableStringBuilder("图$strMain");

        //mipmap:
        val imageSpan = ImageSpan(requireContext(), R.mipmap.ic_launcher);

        //drawable:
        //val drawable = resources.getDrawable(R.mipmap.ic_launcher);
        //drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        //val imageSpan1 = new ImageSpan(drawable);

        tvNameBuilder.setSpan(
            imageSpan,
            0, 1, SpannableStringBuilder.SPAN_INCLUSIVE_INCLUSIVE
        )
        return tvNameBuilder;
    }

你可能感兴趣的:(android,kotlin,android)