有時候須要展現一個用戶的評論,可是評論的字數太多,若是所有展現出來可能會影響佈局的效果,可是又不能只截取一部分展現,此時就須要用到多行顯示摺疊的效果了。主要思路就是根據文本的內容計算文本的總高度,知道一行的高度,就能算出文本的行數,進而對超過行數的文本,設置文本的行數最大值。先說這麼多,下面先看效果圖,再看代碼。android
超過兩行,兩行後面的內容隱藏app
點擊展開後的效果ide
下面是實現上面效果的代碼:佈局
MainActivitythis
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_mainspa
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>
DensityUtilscode
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 }
以上重要的基本都有註釋,看不懂的能夠私聊我。視頻