美文网首页
Android Textview文本后面添加小图和小图标点击事件

Android Textview文本后面添加小图和小图标点击事件

作者: 叫我壮士 | 来源:发表于2022-05-13 15:12 被阅读0次

    类似该需求的一个实现方案


    具体实现方法

    1.布局文件就一个TextView就可以,无需自定义TextView
    2.使用SpannableString

    • 先设置最后一位空格成图标
    val string=getString(R.string.address_content)//字符串最后加一个两个空格以便将其替换成图标。不然就会被图标占据内容
    val spannableString=SpannableString(string)
    val d = ContextCompat.getDrawable(this,R.mipmap.ic_copy)!!
            d.setBounds(0, 0, d.minimumWidth, d.minimumHeight)
    spannableString.setSpan(//先设置最后一位空格成图标
                ImageSpan(d),
                string.length-1,
                string.length,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
            )
    

    这样设置出来假设图标高度比文字高就和文字不居中。



    所以就需要自定义ImageSpan,重写draw方法,将其和文字垂直居中

    public class VerticalImageSpan extends ImageSpan {
        public VerticalImageSpan(Drawable drawable) {
            super(drawable);
    
        }
    
        public VerticalImageSpan(Bitmap b) {
            super(b);
        }
    
        @Override
        public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom,
                         @NonNull Paint paint) {
    
            Drawable b = getDrawable();
            Paint.FontMetricsInt fm = paint.getFontMetricsInt();
            int transY = (y + fm.descent + y + fm.ascent) / 2 - b.getBounds().bottom / 2;//计算y方向的位移
            canvas.save();
            canvas.translate(x, transY);//绘制图片位移一段距离
            b.draw(canvas);
            canvas.restore();
        }
    
    }
    

    得到了正确的效果


    • 再设空格和图标的点击事件 (也就是最后两位的点击事件)
      spannableString需要再次setSpan
    spannableString.setSpan(object : ClickableSpan(){//再设置后两位点击事件
                override fun onClick(widget: View) {
                    //这里是点击事件
                }
                override fun updateDrawState(ds: TextPaint) {
                    super.updateDrawState(ds)
                    ds.isUnderlineText = false//取消下划线
                }
            }, string.length-2, string.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
            mTextview.text= spannableString
            mTextview.movementMethod = LinkMovementMethod.getInstance()
    

    注意必须设置LinkMovementMethod.getInstance()才会生效

    相关文章

      网友评论

          本文标题:Android Textview文本后面添加小图和小图标点击事件

          本文链接:https://www.haomeiwen.com/subject/qftuurtx.html