Personalice el diseño para realizar la visualización del número de línea de control de TextView y mostrar todos los botones

Primero, eche un vistazo a las representaciones que se implementarán.
Inserte la descripción de la imagen aquí
La implementación aquí es diferente de la implementación del TextView que se puede mostrar. El escenario comercial aquí es que después de hacer clic en "Ver todo", salta a otras interfaces para mostrar todos los contenido en lugar de la interfaz actual. Por lo tanto, "ver todo" aquí solo se usa para la función de ubicación del evento de clic.
Cuando la longitud del texto se pueda mostrar completamente en tres líneas, oculte "Ver todo".
En segundo lugar, realice el análisis.
El punto de función aquí es cómo hacer que el texto solo muestre más de dos líneas, en lugar de llenar directamente las tres líneas, y luego mostrar tres puntos. De hecho, existe un método integrado para calcular la longitud de visualización del texto en la clase Paint. Solo necesitamos llamar a este método para obtener la longitud total de la pantalla de texto y luego calcular el valor fijo con la longitud del control y el número de líneas de visualización. Solo mira el código.
Tres, el código clave

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("不足三行代码的情况下,会怎么展示呢?不足三行代码的情况下,会怎么展示呢?不足三行代码的情况下,会怎么展示呢?" +
                "不足三行代码的情况下,会怎么展示呢?不足三行代码的情况下,会怎么展示呢?不足三行代码的情况下,会怎么展示呢?" +
                "不足三行代码的情况下,会怎么展示呢?不足三行代码的情况下,会怎么展示呢?不足三行代码的情况下,会怎么展示呢?");

Cuarto, versión mejorada
La cadena recortada utilizada en el método getSubString anterior no es lo suficientemente precisa. Después de todo, el promedio general de la cadena se usa para calcular el número de palabras en las primeras tres líneas, lo que conduce a una precisión deficiente. Por lo tanto, el uso del método mejorado a continuación puede reducir en gran medida la brecha.

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
blog de nube de brujas : http: //blog.csdn.NET/amir_zt/
más original, indique la fuente, gracias.
https://blog.csdn.net/amir_zt/article/details/113343428

Supongo que te gusta

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