Primeiro, dê uma olhada nas renderizações a serem implementadas.
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