TextView多行文本折叠效果

有时候需要展示一个用户的评论,但是评论的字数太多,如果全部展示出来可能会影响布局的效果,但是又不能只截取一部分展示,此时就需要用到多行显示折叠的效果了。主要思路就是根据文本的内容计算文本的总高度,知道一行的高度,就能算出文本的行数,进而对超过行数的文本,设置文本的行数最大值。先说这么多,下面先看效果图,再看代码。

超过两行,两行后面的内容隐藏

点击展开后的效果

下面是实现上面效果的代码:

MainActivity

 1 import android.app.Activity;
 2 import android.os.Bundle;
 3 import android.util.DisplayMetrics;
 4 import android.util.TypedValue;
 5 import android.view.View;
 6 import android.view.View.MeasureSpec;
 7 import android.view.View.OnClickListener;
 8 import android.widget.RelativeLayout;
 9 import android.widget.TextView;
10 
11 public class MainActivity extends Activity {
12     private TextView tv;
13     private TextView tv_close;
14     private TextView tv_open;
15     private RelativeLayout rl_click;
16 
17     @Override
18     protected void onCreate(Bundle savedInstanceState) {
19         super.onCreate(savedInstanceState);
20         setContentView(R.layout.activity_main);
21         tv = (TextView) findViewById(R.id.tv);
22         tv_close = (TextView) findViewById(R.id.tv_close);
23         tv_open = (TextView) findViewById(R.id.tv_open);
24         rl_click = (RelativeLayout) findViewById(R.id.rl_click);
25         int lineHeight = tv.getLineHeight();
26         int measuredHeight = tv.getMeasuredHeight();
27         int allHeight = measureTextViewHeight(tv.getText().toString(), 13,
28                 measuredHeight);
29         DisplayMetrics dm = new DisplayMetrics();
30         dm = getApplicationContext().getResources().getDisplayMetrics();
31         float screenW = dm.widthPixels;
32         float paddingLeft = tv.getPaddingLeft();
33         float paddingReft = tv.getPaddingRight();
34 
35         int count = (int) Math
36                 .ceil((tv.getPaint().measureText(tv.getText().toString()) / (screenW
37                         - paddingLeft - paddingReft - 159)));
38         // 计算行数
39         if (allHeight % lineHeight > 0) {
40             count = allHeight / lineHeight + 1;
41         } else {
42             count = allHeight / lineHeight;
43         }
44 
45         if (count > 2) {
46             tv.setMaxLines(2);
47             tv_close.setVisibility(View.GONE);
48             tv_open.setVisibility(View.VISIBLE);
49 
50         } else {
51             tv.setMaxLines(999);
52             tv_open.setVisibility(View.GONE);
53             tv_close.setVisibility(View.GONE);
54 
55         }
56         rl_click.setOnClickListener(new OnClickListener() {
57 
58             @Override
59             public void onClick(View v) {
60                 if (tv_open.getVisibility() == View.VISIBLE) {
61                     tv.setMaxLines(999);
62 
63                     tv_open.setVisibility(View.GONE);
64                     tv_close.setVisibility(View.VISIBLE);
65                 } else {
66                     tv.setMaxLines(2);
67                     tv_close.setVisibility(View.GONE);
68                     tv_open.setVisibility(View.VISIBLE);
69                 }
70 
71             }
72         });
73 
74     }
75 
76     // 计算TextView的高度
77     private int measureTextViewHeight(String text, int textSize, int deviceWidth) {
78         TextView textView = new TextView(MainActivity.this);
79         textView.setText(text);
80         textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize);
81         int widthMeasureSpec = MeasureSpec.makeMeasureSpec(deviceWidth,
82                 MeasureSpec.AT_MOST);
83         int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0,
84                 MeasureSpec.UNSPECIFIED);
85         textView.measure(widthMeasureSpec, heightMeasureSpec);
86         return textView.getMeasuredHeight();
87     }
88 }

activity_main

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     tools:context="${relativePackage}.${activityClass}" >
 7 
 8     <TextView
 9         android:id="@+id/tv"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:text="视频拍摄啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪啪ID覅额突破一批一批【人【让旁人【突然普通人牌铁皮普通人【啪啪啪啪啪啪啪啪啪啪啪啪啪上课时开始看看看陪我玩玩去玩ISO维尔瓦IE平OTO"
13         android:textSize="15sp" />
14 
15     <RelativeLayout
16         android:id="@+id/rl_click"
17         android:layout_width="wrap_content"
18         android:layout_height="wrap_content"
19         android:layout_below="@+id/rel"
20         android:layout_marginBottom="6dp"
21         android:layout_marginLeft="11dp"
22         android:layout_marginRight="11dp"
23         android:layout_marginTop="20dp" >
24 
25         <TextView
26             android:id="@+id/tv_close"
27             android:layout_width="wrap_content"
28             android:layout_height="wrap_content"
29             android:layout_alignParentRight="true"
30             android:drawablePadding="4dp"
31             android:text="收起"
32             android:textColor="#Ff6600"
33             android:textSize="16sp"
34             android:visibility="gone" />
35 
36         <TextView
37             android:id="@+id/tv_open"
38             android:layout_width="wrap_content"
39             android:layout_height="wrap_content"
40             android:layout_alignParentRight="true"
41             android:drawablePadding="4dp"
42             android:text="展开"
43             android:textColor="#Ff6600"
44             android:textSize="16sp" />
45     </RelativeLayout>
46 
47 </LinearLayout>

DensityUtils

 1 import android.content.Context;
 2 import android.content.res.Resources;
 3 import android.util.DisplayMetrics;
 4 import android.util.TypedValue;
 5 
 6 public final class DensityUtils {
 7 
 8     /**
 9      * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
10      */
11     public static int dip2px(Context context, float dpValue) {
12         Resources r = context.getResources();
13         float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
14                 dpValue, r.getDisplayMetrics());
15         return (int) px;
16     }
17 
18     /**
19      * 根据手机的分辨率从 px(像素) 的单位 转成为 dp
20      */
21     public static int px2dip(Context context, float pxValue) {
22         final float scale = context.getResources().getDisplayMetrics().density;
23         return (int) (pxValue / scale + 0.5f);
24     }
25 
26     /**
27      * 根据手机的分辨率从 px(像素) 的单位 转成为 sp
28      */
29     public static int px2sp(Context context, float pxValue) {
30         float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
31         return (int) (pxValue / fontScale + 0.5f);
32     }
33 
34     /**
35      * 根据手机的分辨率从 sp 的单位 转成为 px
36      */
37     public static int sp2px(Context context, float spValue) {
38         float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
39         return (int) (spValue * fontScale + 0.5f);
40     }
41 
42     /**
43      * 获取dialog宽度
44      */
45     public static int getDialogW(Context aty) {
46         DisplayMetrics dm = new DisplayMetrics();
47         dm = aty.getResources().getDisplayMetrics();
48         int w = dm.widthPixels - 100;
49         // int w = aty.getWindowManager().getDefaultDisplay().getWidth() - 100;
50         return w;
51     }
52 
53     /**
54      * 获取屏幕宽度
55      */
56     public static int getScreenW(Context aty) {
57         DisplayMetrics dm = new DisplayMetrics();
58         dm = aty.getResources().getDisplayMetrics();
59         int w = dm.widthPixels;
60         // int w = aty.getWindowManager().getDefaultDisplay().getWidth();
61         return w;
62     }
63 
64     /**
65      * 获取屏幕高度
66      */
67     public static int getScreenH(Context aty) {
68         DisplayMetrics dm = new DisplayMetrics();
69         dm = aty.getResources().getDisplayMetrics();
70         int h = dm.heightPixels;
71         // int h = aty.getWindowManager().getDefaultDisplay().getHeight();
72         return h;
73     }
74 }

以上重要的基本都有注释,看不懂的可以私聊我。

转载于:https://www.cnblogs.com/zhangchaot/p/5939143.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值