可收缩的TextView
1.上来不啰嗦效果图如下:
如上图所示,我们项目中有时候需求这种效果。那么今天我们一起来实现这样一个东西把。
2.我们来分析如何实现:
- 如图我们可以看出是一个容器包裹着两个控件,文字TextView控件和另外一个随便的可点击控件,在点击之后我们可以看出有动画效果,而且有默认的初始行数和高度,以及展开的高度和行数等。所以接下来我们来自定义自己的容器。
3.确定容器布局所需变量
- 首先我们分析我们这个容器布局所需要的变量:
- 1:显示内容的控件。TextView visible_context_tv;
- 2:可点击控件。TextView button_expand_tv;
- 3 :展开后允许显示的最大行数:int maxExpandLines;
- 4 :动画的时间:int animal_duration;
- 5 :来个标记记录文字是否发生了变动:flag_isChang=false;
- 6 :没有展开时候的TextView的高度:shrinkageHeight=0;
- 7 :判断是否在执行动画:boolean isAnimate=false;
- 8:我们需要定义一个接口来监听我们的容器布局展开收缩的状态:
ExpandStateListener expandStateListener;
4.开始撸代码了
首先来定义一个类CanExpandTextView继承LinearLayout或者其他容器布局,我们由于TextView内容控件和点击控件都是上下排列,我们就继承LinearLayout代码如下:
import android.content.Context;
import android.content.res.TypedArray;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
* Created by Administrator on 2017/9/5/005.
*/
public class CanExpandTextView extends LinearLayout {
//- 1:显示内容的控件。TextView visible_context_tv;
private TextView visible_context_tv;
//- 2:可点击控件。TextView button_expand_tv;
private TextView button_expand_tv;
// - 3 :展开后允许显示的最大行数:
int maxExpandLines;
//- 4 :动画的时间:
int animal_duration;
//- 5 :来个标记记录文字是否发生了变动:
boolean flag_isChang = false;
//- 6 :没有展开时候的TextView的高度:
int shrinkageHeight = 0;
//- 7 :判断是否在执行动画:
boolean isAnimate = false;
//- 8:我们需要定义一个接口来监听我们的容器布局展开收缩的状态:
ExpandStateListener expandStateListener;
public CanExpandTextView(Context context) {
super(context);
}
public CanExpandTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
//初始化我们所需要的属性
init(context,attrs);
}
/***
* 这里我们来实现自定义的属性
* @param context
* @param attrs
*/
private void init(Context context, AttributeSet attrs) {
//首先设置容器布局的方向:竖直的
setOrientation(VERTICAL);
/**这里我们需要自定义属性:这里我我们都知道,刚接触android的
可以去自己去看看自定义属性:**/
TypedArray typedArray=context.obtainStyledAttributes
(attrs,R.styleable.ExpandParames);
/**初始TextView显示字体行数:这里注意了默认的最大展开能允许显示
的text行数可以这里设置也可以咋布局中设置的**/
//我就在布局中设置,相当高大上
maxExpandLines=typedArray.getInteger(R.styleable.
ExpandParames_max_expend_lines,0);
/**这里设置动画执行的时间长度,同样可在布局xml中折花枝也可以在这里设置。
我就在xml中设置了**/
animal_duration=typedArray.getInteger(R.styleable.\