目錄
效果展示
實(shí)現(xiàn)原理
原理很簡(jiǎn)單鸵熟,需要用3個(gè)TextView,其中一個(gè)是展示文字的流强,一個(gè)是用來計(jì)算文字的行數(shù),一個(gè)是用來展開和收起的:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- 展示文字-->
<TextView
android:id="@+id/view_seemore_tvcontent"
android:textColor="#000"
android:maxLines="2"
android:ellipsize="end"
android:textSize="15sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<!-- 占位置的隱藏队腐,并且高度設(shè)置的很小奏篙,用來獲取行數(shù)-->
<TextView
android:id="@+id/view_seemore_tvlinecount"
android:textColor="#000"
android:visibility="invisible"
android:textSize="15sp"
android:layout_width="match_parent"
android:layout_height="1dp"/>
<!-- 顯示更多和收起-->
<TextView
android:id="@+id/view_seemore_tv_seemore"
android:layout_marginTop="5dp"
android:text="查看更多"
android:textColor="#00f"
android:visibility="gone"
android:maxLines="2"
android:ellipsize="end"
android:textSize="15sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
然后需要在自定義控件的類中做相應(yīng)的處理:
class SeeMoreView:FrameLayout {
//是否展開和收起的標(biāo)記
private var mIsShowAll:Boolean = false
constructor(context: Context) : this(context,null)
constructor(context: Context, attrs: AttributeSet?) : this(context, attrs,0)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
){
View.inflate(context, R.layout.view_seemore,this)
initListener()
}
private fun initListener() {
//查看更多的點(diǎn)擊事件
view_seemore_tv_seemore.setOnClickListener {
if(mIsShowAll){
//這是收起的關(guān)鍵代碼,將最大行數(shù)設(shè)置為你想展示的最小行數(shù)即可
view_seemore_tvcontent.maxLines = 2
view_seemore_tv_seemore.text = "查看更多"
}else{
//這是查看更多的關(guān)鍵代碼报破,將最大行數(shù)設(shè)置一個(gè)大數(shù)即可
view_seemore_tvcontent.maxLines = 20
view_seemore_tv_seemore.text = "收起"
}
mIsShowAll = !mIsShowAll
}
//attachedToWindow之后執(zhí)行操作
post {
//這里必須這樣寫,這是在attachedToWindow之后執(zhí)行操作充易,否則獲取行數(shù)會(huì)出問題
Log.e("測(cè)試","OnLayout${view_seemore_tvlinecount.lineCount}")
if(view_seemore_tvlinecount.lineCount>2){
view_seemore_tv_seemore.visibility = View.VISIBLE
}else{
view_seemore_tv_seemore.visibility = View.GONE
}
}
}
/**
* 設(shè)置文字
*/
fun setText(text:String){
//每次設(shè)置文字后都要進(jìn)行重置
view_seemore_tvcontent.text = text
view_seemore_tvlinecount.text = text
view_seemore_tv_seemore.text = "查看更多"
view_seemore_tvcontent.maxLines = 2
mIsShowAll = false
if(view_seemore_tvlinecount.lineCount>2){
view_seemore_tv_seemore.visibility = View.VISIBLE
}else{
view_seemore_tv_seemore.visibility = View.GONE
}
}
}