Android TextView仿微信可折叠效果

所属分类: 软件编程 / Android 阅读数: 36
收藏 0 赞 0 分享

在微信朋友圈中,发送大量的文本信息时,在展示的时候微信会将该文本信息进行折叠处理,出现“全文”,“收起”的操作提示。当点击全文时,才能看到全部的文本信息,正好最近的项目中也提出了类似的需求,这里就对该自定义View的实现的方法进行了整理。

代码如下:

1.自定义的View:

import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
 * 可折叠的textview
 */
public class ExpandTextView extends LinearLayout {
  public static final int DEFAULT_MAX_LINES = 3;
  private TextView contentText;
  private TextView textPlus;
  private int showLines;
  private ExpandStatusListener expandStatusListener;
  private boolean isExpand;

  public ExpandTextView(Context context) {
    super(context);
    initView();
  }

  public ExpandTextView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initAttrs(attrs);
    initView();
  }

  public ExpandTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    initAttrs(attrs);
    initView();
  }

  private void initAttrs(AttributeSet attrs) {
    TypedArray typedArray = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.ExpandTextView, 0, 0);
    try {
      showLines = typedArray.getInt(R.styleable.ExpandTextView_showLines, DEFAULT_MAX_LINES);
    }finally {
      typedArray.recycle();
    }
  }

  private void initView() {
    setOrientation(LinearLayout.VERTICAL);
    LayoutInflater.from(getContext()).inflate(R.layout.layout_magic_text, this);
    contentText = (TextView) findViewById(R.id.contentText);
    if(showLines > 0){
      contentText.setMaxLines(showLines);
    }

    textPlus = (TextView) findViewById(R.id.textPlus);
    textPlus.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View view) {
        String textStr = textPlus.getText().toString().trim();
        if("全文".equals(textStr)){
          contentText.setMaxLines(Integer.MAX_VALUE);
          textPlus.setText("收起");
          setExpand(true);
        }else{
          contentText.setMaxLines(showLines);
          textPlus.setText("全文");
          setExpand(false);
        }
        //通知外部状态已变更
        if(expandStatusListener != null){
          expandStatusListener.statusChange(isExpand());
        }
      }
    });
  }

  public void setText(final CharSequence content){

    //在开始绘制contentText内容时,进行监听
    contentText.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

      @Override
      public boolean onPreDraw() {
        // 避免重复监听
        contentText.getViewTreeObserver().removeOnPreDrawListener(this);
        //获取当前文本的行数
        int linCount = contentText.getLineCount();
        if(linCount > showLines){

          if(isExpand){
            contentText.setMaxLines(Integer.MAX_VALUE);
            textPlus.setText("收起");
          }else{
            contentText.setMaxLines(showLines);
            textPlus.setText("全文");
          }
          textPlus.setVisibility(View.VISIBLE);
        }else{
          textPlus.setVisibility(View.GONE);
        }
        return true;
      }


    });
    contentText.setText(content);
  }

  public void setExpand(boolean isExpand){
    this.isExpand = isExpand;
  }

  public boolean isExpand(){
    return this.isExpand;
  }

  public void setExpandStatusListener(ExpandStatusListener listener){
    this.expandStatusListener = listener;
  }

  public interface ExpandStatusListener{
    void statusChange(boolean isExpand);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event) {
    return textPlus.dispatchTouchEvent(event);
  }
}

2.相关布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical">

  <TextView
    android:id="@+id/contentText"
    android:textSize="18sp"
    android:textColor="#000000"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text=""/>

  <TextView
    android:id="@+id/textPlus"
    android:textSize="18sp"
    android:textColor="#666666"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="15dp"
    android:text=""/>

</LinearLayout>

3.自定义属性

<declare-styleable name="ExpandTextView">
    <attr name="showLines" format="integer"/>
</declare-styleable>

4.开始引用

<mo.yumf.com.myviews.ExpandTextView
    android:id="@+id/expandTextView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:showLines="4"/>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

更多精彩内容其他人还在看

Android中加入名片扫描功能实例代码

这篇文章主要介绍了Android中加入名片扫描功能实例代码的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android仿微信发表说说实现拍照、多图上传功能

这篇文章主要为大家详细介绍了Android仿微信发表说说实现拍照、多图上传功能,使用Retrofit2.0技术,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

设置Android系统永不锁屏永不休眠的方法

在进行Android系统开发的时候,有些特定的情况需要设置系统永不锁屏,永不休眠。本篇文章给大家介绍Android 永不锁屏,开机不锁屏,删除设置中休眠时间选项,需要的朋友一起学习吧
收藏 0 赞 0 分享

Android Retrofit 2.0框架上传图片解决方案

这篇文章主要介绍了Android Retrofit 2.0框架上传一张与多张图片解决方案,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android自定义等待对话框

这篇文章主要为大家详细介绍了Android自定义等待对话框的实现方法,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Android中Window添加View的底层原理

这篇文章主要介绍了Android中Window添加View的底层原理,需要的朋友可以参考下
收藏 0 赞 0 分享

Android调用系统默认浏览器访问的方法

这篇文章主要介绍了Android调用系统默认浏览器访问的方法的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享

Android开发退出程序的方法汇总

Android程序有很多Activity,比如说主窗口A,调用了子窗口B,子窗口B又调用子窗口C,back返回子窗口B后,在B中如何关闭整个Android应用程序呢? 下面脚本之家小编就给大家介绍android开发退出程序的几种方法,感兴趣的朋友参考下吧
收藏 0 赞 0 分享

Android程序开发中单选按钮(RadioGroup)的使用详解

在android程序开发中,无论是单选按钮还是多选按钮都非常的常见,接下来通过本文给大家介绍Android程序开发中单选按钮(RadioGroup)的使用,需要的朋友参考下吧
收藏 0 赞 0 分享

Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中

这篇文章主要介绍了Android实现仿网易今日头条等自定义频道listview 或者grideview等item上移到另一个view中 的相关资料,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多