Android TextView仿微信可折疊效果
在微信朋友圈中,發(fā)送大量的文本信息時(shí),在展示的時(shí)候微信會(huì)將該文本信息進(jìn)行折疊處理,出現(xiàn)“全文”,“收起”的操作提示。當(dāng)點(diǎn)擊全文時(shí),才能看到全部的文本信息,正好最近的項(xiàng)目中也提出了類似的需求,這里就對(duì)該自定義View的實(shí)現(xiàn)的方法進(jìn)行了整理。
代碼如下:
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);
}
//通知外部狀態(tài)已變更
if(expandStatusListener != null){
expandStatusListener.statusChange(isExpand());
}
}
});
}
public void setText(final CharSequence content){
//在開(kāi)始繪制contentText內(nèi)容時(shí),進(jìn)行監(jiān)聽(tīng)
contentText.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
// 避免重復(fù)監(jiān)聽(tīng)
contentText.getViewTreeObserver().removeOnPreDrawListener(this);
//獲取當(dāng)前文本的行數(shù)
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.相關(guān)布局文件
<?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.開(kāi)始引用
<mo.yumf.com.myviews.ExpandTextView
android:id="@+id/expandTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:showLines="4"/>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
android 加載本地聯(lián)系人實(shí)現(xiàn)方法
在android開(kāi)發(fā)過(guò)程中,有些功能需要訪問(wèn)本地聯(lián)系人列表,本人搜集整理了一番,拿出來(lái)和大家分享一下,希望可以幫助你們2012-12-12
Android開(kāi)發(fā)強(qiáng)制橫屏和強(qiáng)制豎屏設(shè)置實(shí)例代碼
本篇文章主要介紹了Android開(kāi)發(fā)強(qiáng)制橫屏和強(qiáng)制豎屏設(shè)置實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04
Android多媒體之畫(huà)畫(huà)板開(kāi)發(fā)案例分享
這篇文章主要為大家分享了Android多媒體之畫(huà)畫(huà)板開(kāi)發(fā)案例,具有一定的實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
Android實(shí)現(xiàn)滑動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)滑動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-09-09
Android使用OpenGL和MediaCodec錄制功能
OpenGL是一個(gè)跨平臺(tái)的操作GPU的API,但OpenGL需要本地視窗系統(tǒng)進(jìn)行交互,這就需要一個(gè)中間控制層, EGL就是連接OpenGL ES和本地窗口系統(tǒng)的接口,引入EGL就是為了屏蔽不同平臺(tái)上的區(qū)別,這篇文章主要介紹了Android使用OpenGL和MediaCodec錄制功能,需要的朋友可以參考下2025-04-04
Android WebView無(wú)法彈出軟鍵盤(pán)的原因及解決辦法
這篇文章主要介紹了Android WebView無(wú)法彈出軟鍵盤(pán)的原因及解決辦法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
android 通過(guò)MediaRecorder實(shí)現(xiàn)簡(jiǎn)單的錄音示例
本篇文章中主要介紹了android 通過(guò)MediaRecorder實(shí)現(xiàn)簡(jiǎn)單的錄音示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02

