Android實現(xiàn)文本的展開收起

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private int maxLine = 3;
    private SpannableString elipseString;//收起的文字
    private SpannableString notElipseString;//展開的文字
    private TextView tv;

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

        tv = findViewById(R.id.expanded_text);
        String content = "在全球,隨著Flutter被越來越多的知名公司應(yīng)用在自己的商業(yè)APP中," +
                "Flutter這門新技術(shù)也逐漸進入了移動開發(fā)者的視野,尤其是當(dāng)Google在2018年IO大會上發(fā)布了第一個" +
                "Preview版本后,國內(nèi)刮起來一股學(xué)習(xí)Flutter的熱潮。\n\n為了更好的方便幫助中國開發(fā)者了解這門新技術(shù)" +
                ",我們,F(xiàn)lutter中文網(wǎng),前后發(fā)起了Flutter翻譯計劃、Flutter開源計劃,前者主要的任務(wù)是翻譯" +
                "Flutter官方文檔,后者則主要是開發(fā)一些常用的包來豐富Flutter生態(tài),幫助開發(fā)者提高開發(fā)效率。而時" +
                "至今日,這兩件事取得的效果還都不錯!";
        tv.setText(content);


        //獲取TextView的畫筆對象
        TextPaint paint = tv.getPaint();
        //每行文本的布局寬度
        int width =getResources().getDisplayMetrics().widthPixels - dip2px(this,0);
        //實例化StaticLayout 傳入相應(yīng)參數(shù)
        StaticLayout staticLayout = new StaticLayout(content,paint,width, Layout.Alignment.ALIGN_NORMAL, 1, 0, false);
        //判斷content是行數(shù)是否超過最大限制行數(shù)3行
        if (staticLayout.getLineCount()>maxLine) {
            //定義展開后的文本內(nèi)容
            String string1 = content + "    收起";
            notElipseString = new SpannableString(string1);
            //給收起兩個字設(shè)成藍色
            notElipseString.setSpan(new ForegroundColorSpan(Color.parseColor("#0079e2")), string1.length() - 2, string1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

            //獲取到第三行最后一個文字的下標(biāo)
            int index = staticLayout.getLineStart(maxLine) - 1;
            //定義收起后的文本內(nèi)容
            String substring = content.substring(0, index - 2) + "..." + "更多";
            elipseString = new SpannableString(substring);
            //給查看全部設(shè)成藍色
            elipseString.setSpan(new ForegroundColorSpan(Color.parseColor("#0079e2")), substring.length() - 5, substring.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            //設(shè)置收起后的文本內(nèi)容
            tv.setText(elipseString);
            tv.setOnClickListener(this);
            //將textview設(shè)成選中狀態(tài) true用來表示文本未展示完全的狀態(tài),false表示完全展示狀態(tài),用于點擊時的判斷
            tv.setSelected(true);
        } else {
            //沒有超過 直接設(shè)置文本
            tv.setText(content);
            tv.setOnClickListener(null);
        }

    }

    /**
     * 根據(jù)手機的分辨率從 dp 的單位 轉(zhuǎn)成為 px(像素)
     */
    public static int dip2px(Context mContext, float dpValue) {
        final float scale = mContext.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() ==R.id.expanded_text) {
            if (v.isSelected()) {
                //如果是收起的狀態(tài)
                tv.setText(notElipseString);
                tv.setSelected(false);
            } else {
                //如果是展開的狀態(tài)
                tv.setText(elipseString);
                tv.setSelected(true);
            }
        }
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容