软件编程
位置:首页>> 软件编程>> Android编程>> 可伸缩的textview详解(推荐)

可伸缩的textview详解(推荐)

作者:jingxian  发布时间:2021-11-06 00:34:51 

标签:textview,伸缩

在Android原生的TextView的基础上,可收缩/扩展的TextView:PhilExpandableTextView。

实现原理:核心是控制TextView的max lines。在TextView的初始化阶段但尚未绘制出View的时候,使用ViewTreeObserver,监听onPreDraw事件,获取TextView正常显示需要显示的总行数,但只给TextView设置最大运行的行数(小于总行数),从而造成TextView的收缩摘要效果,当用户通过按钮或其他方式扩展时候,把TextView的最大行数设置为正常显示完全的行数+1(+1是保持余量,避免不足)。


public class MainActivity extends Activity {
 private String str = "";

@Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);

for (int i = 0; i < 200; i++) {
     str = str + i + " ";
   }
   final ExpandableTextView etv = (ExpandableTextView) findViewById(R.id.etv);
   etv.setText(str);

Button btn = (Button) findViewById(R.id.btn);

btn.setOnClickListener(new OnClickListener() {

@Override
     public void onClick(View v) {
       boolean b = etv.getExpandablestatus();

b = !b;
       etv.setExpandable(b);

}
   });

}

}

PhilExpandableTextView.java:


package com.ganchuanpu.ExpandableTextView;

import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.TextView;
import android.widget.Toast;

public class ExpandableTextView extends TextView {

// 最大行,默认显示3行
 private final int MAX = 3;
 // 完全展开需要的行数
 private int lines;

private ExpandableTextView mExpandableTextView;

private boolean expandablestatus = false;

// 构造方法用两个参数的
 public ExpandableTextView(Context context, AttributeSet attrs) {
   super(context, attrs);
   mExpandableTextView = this;
   init();

}

private void init() {
   // 在view绘制之前的时候执行,在onDraw之前
   ViewTreeObserver mViewTreeObserver = this.getViewTreeObserver();
   mViewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() {

@Override
     public boolean onPreDraw() {
       // 避免重复监听
       mExpandableTextView.getViewTreeObserver().removeOnPreDrawListener(this);
       // 获得内容行数
       lines = getLineCount();

return true;
     }
   });
   setExpandable(false);

}
 // 是否展开或者收缩,
 // true,展开;
 // false,不展开

public void setExpandable(boolean isExpand) {
   if (isExpand) {
     setMaxLines(lines + 1);
   } else
     setMaxLines(MAX);

expandablestatus = isExpand;
 }

public boolean getExpandablestatus() {
   return expandablestatus;
 }

}

可伸缩的textview详解(推荐)

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com