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被越来越多的知名公司应用在自己的商业APP中," +                "Flutter这门新技术也逐渐进入了移动开发者的视野,尤其是当Google在2018年IO大会上发布了第一个" +                "Preview版本后,国内刮起来一股学习Flutter的热潮。\n\n为了更好的方便帮助中国开发者了解这门新技术" +                ",我们,Flutter中文网,前后发起了Flutter翻译计划、Flutter开源计划,前者主要的任务是翻译" +                "Flutter官方文档,后者则主要是开发一些常用的包来丰富Flutter生态,帮助开发者提高开发效率。而时" +                "至今日,这两件事取得的效果还都不错!";        tv.setText(content);        //获取TextView的画笔对象        TextPaint paint = tv.getPaint();        //每行文本的布局宽度        int width =getResources().getDisplayMetrics().widthPixels - dip2px(this,0);        //实例化StaticLayout 传入相应参数        StaticLayout staticLayout = new StaticLayout(content,paint,width, Layout.Alignment.ALIGN_NORMAL, 1, 0, false);        //判断content是行数是否超过最大限制行数3行        if (staticLayout.getLineCount()>maxLine) {            //定义展开后的文本内容            String string1 = content + "    收起";            notElipseString = new SpannableString(string1);            //给收起两个字设成蓝色            notElipseString.setSpan(new ForegroundColorSpan(Color.parseColor("#0079e2")), string1.length() - 2, string1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);            //获取到第三行最后一个文字的下标            int index = staticLayout.getLineStart(maxLine) - 1;            //定义收起后的文本内容            String substring = content.substring(0, index - 2) + "..." + "更多";            elipseString = new SpannableString(substring);            //给查看全部设成蓝色            elipseString.setSpan(new ForegroundColorSpan(Color.parseColor("#0079e2")), substring.length() - 5, substring.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);            //设置收起后的文本内容            tv.setText(elipseString);            tv.setOnClickListener(this);            //将textview设成选中状态 true用来表示文本未展示完全的状态,false表示完全展示状态,用于点击时的判断            tv.setSelected(true);        } else {            //没有超过 直接设置文本            tv.setText(content);            tv.setOnClickListener(null);        }    }    /**     * 根据手机的分辨率从 dp 的单位 转成为 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()) {                //如果是收起的状态                tv.setText(notElipseString);                tv.setSelected(false);            } else {                //如果是展开的状态                tv.setText(elipseString);                tv.setSelected(true);            }        }    }}

更多相关文章

  1. Android之判断当前网络状态
  2. android 单选对话框
  3. Android判断网络状态
  4. android 多项对话框
  5. Android(安卓)中SpannableStringBuilder控制局部文本颜色和点击
  6. Android(安卓)Q 版本新的网络状况判断方式
  7. Android(安卓)手机状态
  8. android 列表对话框
  9. android GPS定位和卫星个数

随机推荐

  1. 使用Logstash filter grok过滤日志文件
  2. win10系统与华为模拟器ensp完美结合解决
  3. web前端开发是干嘛的?
  4. java线程池模型
  5. 最新版 IDEA激活码_idea激活码2021 免费
  6. 【2020最新】Python爬虫工程师 - 3个月成
  7. 必知必会! MySql 高频企业面试题
  8. 如何使用Illustrator裁剪图像、调整大小?
  9. 大数据基础系列之JAVA引用详解
  10. Spark部署模式另类详解