美文网首页
强大的TextView

强大的TextView

作者: 30cf443c3643 | 来源:发表于2018-12-11 14:07 被阅读93次

    作为android中最基本的ui控件,TextView其实异常强大,但是我们开发者对它的使用或许只停留在最基本的方面。现在整理一些比较有用的功能。

    图文混排

    Span

    SpannableString 也是字符串类型,TextView可以直接设置作为文本。
    通过setSpan方法为制定下标区间的子字符串设置格式
    方法setSpan(Object what,int start,int end,int flags)
    第四个参数flags有四种属性值:

    • Spanned.SPAN_INCLUSIVE_EXCLUSIVE 从起始下标到终了下标,包括起始下标
    • Spanned.SPAN_INCLUSIVE_INCLUSIVE 从起始下标到终了下标,同时包括起始下标和终了下标
    • Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 从起始下标到终了下标,但都不包括起始下标和终了下标
    • Spanned.SPAN_EXCLUSIVE_INCLUSIVE 从起始下标到终了下标,包括终了下标

    第一个参数Object what
    通过设置第一个参数,可以为TextView设置前景色ForegroundColorSpan,背景色BackgroundColorSpan,相对大小RelativeSizeSpan,字体风格StyleSpan,图片ImageSpan,可点击ClickableSpan

    SpannableString spannableString = new SpannableString("万丈高楼平地起");
    RelativeSizeSpan sizeSpan01 = new RelativeSizeSpan(1.2f);
    spannableString.setSpan(sizeSpan01, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setText(spannableString);
    
    --------------------------------------------------------------------------------------------------------------
    SpannableString spannableString = new SpannableString("为文字设置粗体、斜体风格");
    StyleSpan styleSpan_B  = new StyleSpan(Typeface.BOLD);
    StyleSpan styleSpan_I  = new StyleSpan(Typeface.ITALIC);
    spannableString.setSpan(styleSpan_B, 5, 7, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    spannableString.setSpan(styleSpan_I, 8, 10, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setHighlightColor(Color.parseColor("#36969696"));
    textView.setText(spannableString);
    
    --------------------------------------------------------------------------------------------------------------
    
    SpannableString spannableString = new SpannableString("在文本中添加表情(表情)");
    Drawable drawable = getResources().getDrawable(R.mipmap.a9c);
    drawable.setBounds(0, 0, 42, 42);
    ImageSpan imageSpan = new ImageSpan(drawable);
    spannableString.setSpan(imageSpan, 6, 8, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setText(spannableString);
    
    --------------------------------------------------------------------------------------------------------------
    SpannableString spannableString = new SpannableString("为文字设置点击事件");
    MyClickableSpan clickableSpan = new MyClickableSpan("http://www.jianshu.com/users/dbae9ac95c78");
    spannableString.setSpan(clickableSpan, 5, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
    textView.setHighlightColor(Color.parseColor("#36969696")); 
    textView.setText(spannableString);
    //必须为TextView设置setMovementMethod方法,否则没有点击相应,至于setHighlightColor方法则是控制点击是的背景色。
    class MyClickableSpan extends ClickableSpan {
    
        private String content;
    
        public MyClickableSpan(String content) {
            this.content = content;
        }
    
        @Override
        public void updateDrawState(TextPaint ds) {
            ds.setUnderlineText(false);   //控制是否让可点击文本显示下划线
        }
    
        @Override
        public void onClick(View widget) {
            Intent intent = new Intent(MainActivity.this, OtherActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString("content", content);
            intent.putExtra("bundle", bundle);
            startActivity(intent);
        }
    }
    

    但是clickspan的点击事件的同时也会触发TextView的点击事件

    Html.fromHtml()

    可以用来解决一些字符转义的情况.比如字符串"集结号//Assembly-number——集合了多项内容的客户端",这里横杠是会转义。

    TextView的炫酷效果

    通过自定义span还可以实现一些特别的效果,包括颜色渐变,打印机效果等。参考精通Span 轻松玩转各种文本特效

    字体对齐

    某些情况下,TextView会发生字符不能填满整行,就换行的状况。参考不到100行代码实现左右对齐TextView的思路
    修复后

    2018-12-11_124140.png

    行间距

    新增的lineSpacingExtra属性。图为lineSpacingExtra=10dp


    2018-12-11_124352.png

    字体

            Typeface tf = Typeface.createFromAsset(getAssets(), "OpenSans-ExtraBold.ttf");
            mTextView.setTypeface(tf);
    
    2018-12-11_132740.png

    Autosizing

    Autosizing 的带来的效果很简单,就是根据文字的内容,动态修改 TextSize ,而想要使用它,可以通过动态编码和静态的 layout-xml 布局属性的方式使用

    1. 动态编码,使用 setAutoSizeTextTypeUniformWithConfiguration 中提供的方法
    2. layout-xml 布局属性
        <TextView
            android:id="@+id/tv"
            android:layout_width="wrap_content"
            android:layout_height="100dp"
            android:lineSpacingExtra="10dp"
            android:autoSizeTextType="uniform"  //开启自动调整功能
            android:autoSizeMinTextSize="12sp" //最小值
            android:autoSizeMaxTextSize="100sp" //最大值
            android:autoSizeStepGranularity="2sp" //变化的粒度
            />
    

    参考文字太多?控件太小?试试 TextView 的新特性 Autosizing 吧!

    相关文章

      网友评论

          本文标题:强大的TextView

          本文链接:https://www.haomeiwen.com/subject/ethshqtx.html