0

我有一个TextView并且我想实现这个椭圆效果:

这个

这是我的 XML 布局:</p>

<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        android:textSize="16sp"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="20dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:textColor="@color/white"
        android:ellipsize="end"
        android:maxLines="2"
        />

我的代码:

        val drawable = ContextCompat.getDrawable(requireSceneContext() , R.drawable.playing_com_into)!!
        drawable.setBounds(0, 0 , dp2px(10) , dp2px(10))

        val text = "电影《We are all human》主题曲,电影《We are all human》主题曲,电影《We are all human》主题曲,电影《We are all human》主题曲,电影《We are all human》主题曲,电影《We are all human》主题曲"
        val span = QMUIAlignMiddleImageSpan(drawable , ALIGN_MIDDLE , -1f)

        val spannableString = SpannableString(text)
        spannableString.setSpan(span , text.length -2 , text.length , Spanned.SPAN_EXCLUSIVE_EXCLUSIVE )
        binding.tv1.text = spannableString

当前效果

这是我现在得到的:

这里

我要TextView优先显示ImageSpan,计算完Text宽度

4

2 回答 2

0

由于公司的业务,除了需要添加Image外,还需要保留一些特殊的文字,所以我定制了一个TextView来完成这个效果 这是代码链接github

这是当前效果

当前效果

于 2021-03-05T11:30:13.343 回答
0

我没有找到自定义 TextView 内部布局的方法。我在两行的情况下计算了文本的长度,然后减去一个字符的长度,然后设置文本和ImageSpan

这是我的代码

                    TextPaint paint = songDetailTv.getPaint();
                    int textViewWidth = (int) (container.getResources().getDisplayMetrics().widthPixels
                            - (2 * Resource.getDimension(R.dimen.player_recommend_margin_horizontal))
                            - (2 * Resource.getDimension(R.dimen.player_recommend_root_view_margin)));
                    int bufferWidth = (int) paint.getTextSize();
                    int textLength = textViewWidth * 2 - bufferWidth;
                    paint.setTextSize(songDetailTv.getTextSize());
                    CharSequence temp = TextUtils.ellipsize(detail.podcastIntro, paint, textLength * 1f, TextUtils.TruncateAt.END);
                    boolean isEllipsize = temp == detail.podcastIntro;
                    if (!isEllipsize) {
                        songDetailTv.setText(SpannableHelper.getPicAtEnd(R.drawable.playing_com_into, temp, -1));
                    } else {
                        songDetailTv.setText(detail.podcastIntro);
                    }

这是xml,maxline=2

<TextView
        android:id="@+id/tv_song_detail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tv_song_publish_time"
        android:ellipsize="end"
        android:gravity="center_vertical"
        android:maxLines="2"
        android:textColor="#98999a"
        android:textSize="12dp"
        android:visibility="gone"
        android:layout_marginTop="15dp"
        tool:text="歌曲详情"
        tool:visibility="visible" />

这是当前效果 当前效果

我不知道为什么计算有时不那么准确。这可能与 TextView 的布局有关。但能忍

于 2021-03-01T03:06:47.677 回答