Personalize o layout para realizar a exibição do número da linha de controle TextView e exibir todos os botões

Primeiro, dê uma olhada nas renderizações a serem implementadas.
Insira a descrição da imagem aqui
A implementação aqui é diferente da implementação do TextView que pode ser exibida. O cenário de negócios aqui é que depois de clicar em "Exibir tudo", ele salta para outras interfaces para exibir todos os conteúdo em vez da interface atual. Portanto, "visualizar tudo" aqui é usado apenas para a função de posicionamento do evento de clique.
Quando o comprimento do texto puder ser totalmente exibido em três linhas, oculte "Exibir tudo".
Em segundo lugar, realize a análise.
O ponto de função aqui é como fazer o texto exibir apenas mais de duas linhas, em vez de preencher diretamente as três linhas e, em seguida, exibir três pontos. Na verdade, existe um método interno para calcular o comprimento de exibição do texto na classe Paint. Precisamos apenas chamar esse método para obter o comprimento total da exibição de texto e, em seguida, calcular o valor fixo com o comprimento do controle e o número de linhas de exibição. Basta olhar para o código.
Três, o código-chave

package com.migu.recyclerviewtest;

import android.content.Context;
import android.content.res.Resources;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class CustomContentShowTextView extends RelativeLayout {
    
    
    private TextView mContentTextView;
    private LinearLayout mAllContentLLT;

    public CustomContentShowTextView(Context context) {
    
    
        super(context);
        init(context);
    }

    public CustomContentShowTextView(Context context, AttributeSet attrs) {
    
    
        super(context, attrs);
        init(context);
    }

    public CustomContentShowTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    
    
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context) {
    
    
        View view = LayoutInflater.from(context).inflate(R.layout.custom_textview_description, this);
        mContentTextView = view.findViewById(R.id.description);
        mAllContentLLT = view.findViewById(R.id.all_content_llt);
    }

    public void setText(String text) {
    
    
        String content = getSubString(mContentTextView, text);
        if (content != null) {
    
    
            mContentTextView.setText(content);
        }
    }

    private String getSubString(TextView tv, String content){
    
    
        float width = tv.getPaint().measureText(content);
        //这里只是为了方便,用屏幕宽度代替了textview控件宽度,如果需要精准控制,可以换成控件宽度
        //这里测试时是将textview全屏的,如果有左右margin则从这里减去就行
        float tvWidth = Resources.getSystem().getDisplayMetrics().widthPixels;
        //计算文字的长度,相对于控件长度而言,能显示多少行
        float lines = width / tvWidth;
        //这个>3是判断是否文字展示的行数超过3行了
        if(lines > 3){
    
    
            mAllContentLLT.setVisibility(VISIBLE);
            //这里直接用长度/行数=每行显示多少个字,*2.7代表需要截取2.7行的字数
            int index = (int)((content.length()/lines) * (2.7));
            return content.substring(0, index) + "...";
        } else {
    
    
            mAllContentLLT.setVisibility(GONE);
        }
        return content;
    }

    public void setOnMoreClickListener(OnClickListener clickListener) {
    
    
        mAllContentLLT.setOnClickListener(clickListener);
    }
}

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:maxLines="3"
        android:ellipsize="end"
        android:text="12121321321321312311212132132132131231121213213213213123112121321321321312311212132132132131231121213213213213123112121321321321312311212132132132131231"
        android:textSize="14dp" />

    <LinearLayout
        android:id="@+id/all_content_llt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/description"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:gravity="center_vertical"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="查看全部"
            android:textColor="@android:color/holo_red_light"
            android:textSize="14dp" />

        <ImageView
            android:layout_width="6dp"
            android:layout_height="10dp"
            android:src="@mipmap/right_arrow"
            android:layout_marginLeft="4dp" />
    </LinearLayout>

</RelativeLayout>


//使用就很简单了,直接设置内容即可,至于OnclickListener,根据业务需要设置即可。
CustomContentShowTextView testTextview = findViewById(R.id.testTextview);
        testTextview.setText("不足三行代码的情况下,会怎么展示呢?不足三行代码的情况下,会怎么展示呢?不足三行代码的情况下,会怎么展示呢?" +
                "不足三行代码的情况下,会怎么展示呢?不足三行代码的情况下,会怎么展示呢?不足三行代码的情况下,会怎么展示呢?" +
                "不足三行代码的情况下,会怎么展示呢?不足三行代码的情况下,会怎么展示呢?不足三行代码的情况下,会怎么展示呢?");

Quarto, versão aprimorada
A string cortada usada no método getSubString acima não é precisa o suficiente.Afinal, a média geral da string é usada para calcular o número de palavras nas três primeiras linhas, o que leva a uma precisão pobre. Portanto, usar o método aprimorado abaixo pode reduzir muito a lacuna.

private String getSubString(TextView tv, String content){
    
    
        float width = tv.getPaint().measureText(content);
        //这里只是为了方便,用屏幕宽度代替了textview控件宽度,如果需要精准控制,可以换成控件宽度
        //这里测试时是将textview全屏的,如果有左右margin则从这里减去就行
        float tvWidth = Resources.getSystem().getDisplayMetrics().widthPixels;
        //计算文字的长度,相对于控件长度而言,能显示多少行
        float lines = width / tvWidth;
        //这个>3是判断是否文字展示的行数超过3行了
        if(lines > 3){
    
    
            mAllContentLLT.setVisibility(VISIBLE);
            //这里计算展示三行需要的字数
            int index = (int)((content.length()/lines) * 3);
            //使用控件的宽度来限制位置
            float subTvWidth = (float) (tvWidth * 2.75);
            String subString = "";
            for (int i = index; i >= 0; i--) {
    
    
                subString = content.substring(0, i) + "...";
                float subWidth = tv.getPaint().measureText(subString);
                if (subWidth <= subTvWidth) {
    
    
                    break;
                }
            }
            //毕竟是展示内容,如果只有两三个字,肯定是不对的
            if (!TextUtils.isEmpty(subString) && subString.length() > 3) {
    
    
                return subString;
            } else {
    
    
                return content.substring(0, (int)((content.length()/lines) * (2.7))) + "...";
            }
        } else {
    
    
            mAllContentLLT.setVisibility(GONE);
        }
        return content;
    }

Autor: Cangshuipu witch cloud
blog: http: //blog.csdn.NET/amir_zt/
mais original, por favor indique a fonte, obrigado.
https://blog.csdn.net/amir_zt/article/details/113343428

Acho que você gosta

Origin blog.csdn.net/u011635351/article/details/113343428
Recomendado
Clasificación