总结安卓中常用的TextView的样式(SuperTextView)

本文介绍了如何在Android开发中利用SuperTextView实现服务条款跳转、HTML格式展示、图文混排和特殊UI样式,通过实例展示了如何使用ClickableSpan、ImageSpan和自定义View来创建丰富的文本体验。

引言:TextView在平时的开发中一般是显示文案,但是在实际开发中文字经常要显示一些特殊的样式,为了满足不同场景下的需求,特此总结常用的TextView,命名为:SuperTextView

场景一:使用TextView显示服务条款和隐私协议,并实现点击跳转H5。

核心代码:

public class PrivacyPolicyTextActivity extends AppCompatActivity {

    private TextView mPrivacyPolicyView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_privacy_policy);
        mPrivacyPolicyView = findViewById(R.id.privacyPolicy);
        initPrivacyPolicy();
    }

    private void initPrivacyPolicy() {
        String contentString = getString(R.string.login_des_privacy_desc, getString(R.string.terms_of_service_desc), getString(R.string.privacy_policy_desc));
        String termsOfService = getString(R.string.terms_of_service_desc);
        SpannableString spannableString = new SpannableString(contentString);
        int termsOfIndex = contentString.indexOf(termsOfService);
        ClickableSpan termsOfClick = new ClickableSpan() {
            @Override
            public void onClick(@NonNull View widget) {
                Intent intent = new Intent(PrivacyPolicyTextActivity.this, WebViewActivity.class);
                intent.putExtra("url", "https://www.baidu.com/");
                intent.putExtra("title", termsOfService);
                startActivity(intent);
            }

            @Override
            public void updateDrawState(@NonNull TextPaint ds) {
                super.updateDrawState(ds);
                ds.setColor(ResourceUtil.getColor(R.color.red_common_pure));
                ds.setUnderlineText(true);
            }
        };
        spannableString.setSpan(termsOfClick, termsOfIndex, termsOfIndex + termsOfService.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
        String privacyPolicy = ResourceUtil.getString(R.string.privacy_policy_desc);
        int privacyIndex = contentString.indexOf(privacyPolicy);
        ClickableSpan privacyClick = new ClickableSpan() {
            @Override
            public void onClick(@NonNull View widget) {
                Intent intent = new Intent(PrivacyPolicyTextActivity.this, WebViewActivity.class);
                intent.putExtra("url", "https://www.baidu.com/");
                intent.putExtra("title", privacyPolicy);
                startActivity(intent);
            }

            @Override
            public void updateDrawState(@NonNull TextPaint ds) {
                super.updateDrawState(ds);
                ds.setColor(ResourceUtil.getColor(R.color.red_common_pure));
                ds.setUnderlineText(true);
            }
        };
        spannableString.setSpan(privacyClick, privacyIndex, privacyIndex + privacyPolicy.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
        ForegroundColorSpan colorSpan = new ForegroundColorSpan(ContextCompat.getColor(this, R.color.red_common_pure));
        spannableString.setSpan(colorSpan, termsOfIndex, termsOfIndex + termsOfService.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
        ForegroundColorSpan colorSpan2 = new ForegroundColorSpan(ContextCompat.getColor(this, R.color.red_common_pure));
        spannableString.setSpan(colorSpan2, privacyIndex, privacyIndex + privacyPolicy.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
        mPrivacyPolicyView.setText(spannableString);
        mPrivacyPolicyView.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

 

 场景二:平时开发中设计经常要求在一段话中一些文字要加粗,显示不同的颜色等,这个时候有不同的做法,常用也是最简单的就是借助HTML:

核心代码:

public class HTMLTextActivity extends AppCompatActivity {

    private TextView mHtmlTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_htmltext);
        mHtmlTextView = findViewById(R.id.html_text);
        String str1 = "<font color='#FFF258'><b>" + "程序猿" + "</b> </font>";
        String str2 = "<font color='#03DAC5'><b>" + "北京" + "</b> </font>";
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            mHtmlTextView.setText(Html.fromHtml(ResourceUtil.getString(R.string.html_message, str1, str2), Html.FROM_HTML_MODE_LEGACY));
        } else {
            mHtmlTextView.setText(Html.fromHtml(ResourceUtil.getString(R.string.html_message, str1, str2)));
        }
    }
}

 场景三:文字中经常要穿插一些图片,就是文字加图片的样式:

代码:

public class ImageTextViewActivity extends AppCompatActivity {

    private TextView mTitleTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_text_view);
        mTitleTextView = findViewById(R.id.tv_title);
        String texValue01 = " 你好 ";
        String texValue02 = " 我在北京 ";
        String allTexValue = "A" + texValue01 + "B" + texValue02 + "C";
        int tex01ValueIndex = allTexValue.indexOf(texValue01);
        int tex01ValueEndIndex = tex01ValueIndex + texValue01.length();
        int tex02ValueIndex = allTexValue.indexOf(texValue02);
        int tex02ValueEndIndex = tex02ValueIndex + texValue02.length();
        SpannableString spannableString = new SpannableString(allTexValue);
        ForegroundColorSpan colorSpan = new ForegroundColorSpan(ResourceUtil.getColor(R.color.red_common_pure));
        spannableString.setSpan(colorSpan, tex01ValueIndex, tex01ValueEndIndex, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        ForegroundColorSpan colorSpan2 = new ForegroundColorSpan(ResourceUtil.getColor(R.color.teal_200));
        spannableString.setSpan(colorSpan2, tex02ValueIndex, tex02ValueEndIndex, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
        ImageSpan imgSpan = new ImageSpan(this, R.drawable.e_1);
        spannableString.setSpan(imgSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        ImageSpan imgSpan2 = new ImageSpan(this, R.drawable.e_2);
        spannableString.setSpan(imgSpan2, tex01ValueEndIndex, tex01ValueEndIndex + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        ImageSpan imgSpan3 = new ImageSpan(this, R.drawable.e_3);
        spannableString.setSpan(imgSpan3, tex02ValueEndIndex, tex02ValueEndIndex + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        mTitleTextView.setText(spannableString);
    }
}

 场景四:文字中要求加特殊的UI样式,这个时候可以在TextView中加一个View

public class TagTextViewActivity extends AppCompatActivity {

    private TextView mTitleTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tag_text_view);
        mTitleTextView = findViewById(R.id.tv_title);
        View markerView = LayoutInflater.from(this).inflate(R.layout.item_marker_fore_title, null);
        SpannableStringBuilder builder = new SpannableStringBuilder();
        final String REPLACE_TEXT = "A";
        builder.append(REPLACE_TEXT);
        builder.setSpan(new MarkerViewSpan(markerView), 0, REPLACE_TEXT.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        String oriText = "你好,我在北京";
        builder.append(oriText);
        mTitleTextView.setText(builder);
    }
}

  代码 GithHub: GitHub - JasonZhangHG/SuperTextView: SuperTextViewSuperTextView. Contribute to JasonZhangHG/SuperTextView development by creating an account on GitHub.https://github.com/JasonZhangHG/SuperTextView

简介欢迎使用SuperTextView,这篇文档将会向你展示如何使用这个控件来提高你构建项目的效率。CoverSuperTextView继承自TextView,它能够大量的减少布局的复杂程度,并且使得一些常见的效果变得十分容易实现且高效。同时,它内置了动画驱动,你只需要合理编写Adjuster,然后startAnim()就可以看到预期的动画效果。它仅仅是一个控件,所以你可以不费吹灰之力的在你的项目中集成使用。特点你从此不必再为背景图编写和管理大量文件了。重新优化的状态图功能使得你能够精确的控制状态图的大小,以及在SuperTextView中的位置。支持设置圆角,并且能够精确的控制圆角位置。能够轻松的实现控件边框效果。支持文字描边,这使得空心文字效果成为了可能。内置动画驱动,你只需配合Adjuster合理的使用即可。Adjuster的出现,使得你对控件的绘制过程具有了掌控权,良好的设计使得它能够完美的实现绝大部分你脑海中的效果。使用指南支持的属性SuperTextView十分方便的支持在xml中直接设置属性,并且你能够立即看到效果。就像你平时使用TextView一样方便。<SuperTextView     android:layout_width="50dp"     android:layout_height="50dp"     //设置圆角。会同时作用于填充和边框(如果边框存在的话)。     //如果要设置为圆形,只需要把该值设置为宽或长的1/2即可。      app:corner="25dp"       //设置左上角圆角     app:left_top_corner="true"     //设置右上角圆角     app:right_top_corner="true"     //设置左下角圆角     app:left_bottom_corner="true"     //设置右下角圆角     app:right_bottom_corner="true"     //设置填充颜色     app:solid="@color/red"       //设置边框颜色     app:stroke_color="@color/black"       //设置边框的宽度。     app:stroke_width="2dp"      //放置一个drawable在背景层上。默认居中显示。     //并且默认大小为SuperTextView的一半。     app:state_drawable="@drawable/emoji"       //设置drawable的显示模式。可选值如下:     // left、top、right、bottom、center(默认值)、     //leftTop、rightTop、leftBottom、rightBottom、     //fill(充满整个SuperTextView,此时会使设置drawable的大小失效)     app:state_drawable_mode="center"      //设置drawable的height     app:state_drawable_height="30dp"     //设置drawable的width     app:state_drawable_width="30dp"     //设置drawble相对于基础位置左边的距离     app:state_drawable_padding_left="10dp"     //设置drawble相对于基础位置上边的距离     app:state_drawable_padding_top="10dp"     // boolean类型。是否显示drawable。     //如果你想要设置的drawable显示出来,必须设置为true。     //当不想让它显示时,再设置为false即可。     app:isShowState="true"      //是否开启文字描边功能。     //注意,启用这个模式之后通过setTextColor()设置的颜色将会被覆盖。     //你需要通过text_fill_color来设置文字的颜色。     app:text_stroke="true"      // 文字的描边颜色。默认为Color.BLACK。     app:text_stroke_color="@color/black"     // 文字描边的宽度。     app:text_stroke_width="1dp"     // 文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张海龙(Jason Zhang)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值