TextSwitcher文本选择器实现走马灯效果,及Spanny,SpannableStringBuilder和SpannalbeString的应用

来源:互联网 发布:vb for 循环语句 编辑:程序博客网 时间:2024/06/07 07:40

还是老规矩:看图说话

这里写图片描述

看到这个:一般的做法是写二个TextView去实现动画效果,让其不断的进行循环滚动即可
但是现在的做法就是:只通过TextSwitcher去实现即可
首先普及一下:TextSwicher的基本知识如下:

TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式、事件方面的设置。Android系统通过SpannableString类来对指定文本进行相关处理,具体有以下功能:1、BackgroundColorSpan 背景色 2、ClickableSpan 文本可点击,有点击事件3、ForegroundColorSpan 文本颜色(前景色)4、MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)5、MetricAffectingSpan 父类,一般不用6、RasterizerSpan 光栅效果7、StrikethroughSpan 删除线(中划线)8、SuggestionSpan 相当于占位符9、UnderlineSpan 下划线10、AbsoluteSizeSpan 绝对大小(文本字体)11、DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。12、ImageSpan 图片13、RelativeSizeSpan 相对大小(文本字体)14、ReplacementSpan 父类,一般不用15、ScaleXSpan 基于x轴缩放16、StyleSpan 字体样式:粗体、斜体等17、SubscriptSpan 下标(数学公式会用到)18、SuperscriptSpan 上标(数学公式会用到)19、TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)20、TypefaceSpan 文本字体21、URLSpan 文本超链接以及其方法的使用:setSpan(Object what, int start, int end, int flags)方法需要用户输入四个参数,what表示设置的格式是什么,可以是前景色、背景色也可以是可点击的文本,或者是一张图片等等,start表示需要设置格式的子字符串的起始下标,同理end表示终了下标,flags属性就有意思了,共有四种属性:Spanned.SPAN_INCLUSIVE_EXCLUSIVE 从起始下标到终了下标,包括起始下标Spanned.SPAN_INCLUSIVE_INCLUSIVE 从起始下标到终了下标,同时包括起始下标和终了下标Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 从起始下标到终了下标,但都不包括起始下标和终了下标Spanned.SPAN_EXCLUSIVE_INCLUSIVE 从起始下标到终了下标,包括终了下标

且看代码如下:
第一步:布局视图:

<!--文本切换器-->    <TextSwitcher        android:layout_centerInParent="true"        android:inAnimation="@anim/slide_in_bottom"        android:outAnimation="@anim/slide_out_top"        android:id="@+id/text_switcher"        android:layout_width="wrap_content"        android:layout_height="wrap_content"/>    <!--进出动画切换  android:inAnimation="@anim/slide_in_bottom"                            android:outAnimation="@anim/slide_out_top"-->

第二步:进和出的动画效果

<set xmlns:android="http://schemas.android.com/apk/res/android">    <translate        android:duration="300"        android:fromYDelta="100.0%p"        android:toYDelta="0.0"/></set><set xmlns:android="http://schemas.android.com/apk/res/android">    <translate        android:duration="300"        android:fromYDelta="0.0"        android:toYDelta="-100.0%p"/></set>

第三步:具体代码编写

 private TextSwitcher mTextSwitcher;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mTextSwitcher = (TextSwitcher) findViewById(R.id.text_switcher);        mTextSwitcher.setFactory(new ViewSwitcher.ViewFactory() {            @Override            public View makeView() {                TextView textView = new TextView(MainActivity.this);                return textView;            }        });        //显示下一个文本内容        nextInvestInfo();    }    //控制开关    private boolean flag = true;    private void nextInvestInfo() {        String totalInvestProject;        String totalInvestValue;        String investContent;        if(flag) {            totalInvestProject = "累计投资人数";            totalInvestValue = "9,408,567";            investContent = totalInvestProject +"\n"+totalInvestValue;        }else {            totalInvestProject = "累计投资金额(亿)";            totalInvestValue = "8886.4878";            investContent = totalInvestProject +"\n"+totalInvestValue;        }        flag = !flag;        //设置需要显示的文本        SpannableString spannableString = new SpannableString(investContent);        //总体设置需要显示的汉子文本样式        //文本的颜色        ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.GRAY);        //绝对大小(文字字体)        AbsoluteSizeSpan fontSpan = new AbsoluteSizeSpan(DensityUtils.sp2px(this,12));        //实现字符串各种形式风格(属性)的显示,从哪里开始到哪里结束显示其属性值的变化        spannableString.setSpan(colorSpan,0,totalInvestProject.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);        spannableString.setSpan(fontSpan,0,totalInvestProject.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);        //总体设置需要显示的数字文本样式        ForegroundColorSpan colorSpan1 = new ForegroundColorSpan(Color.RED);        AbsoluteSizeSpan fontSpan1 = new AbsoluteSizeSpan(DensityUtils.sp2px(this,26));        /*此时用下面直接找长度的方法时,会出现覆盖的情况,导致结果出差错*///        spannableString.setSpan(colorSpan1,0,totalInvestValue.length(),Spanned.SPAN_INCLUSIVE_EXCLUSIVE);//        spannableString.setSpan(fontSpan1,0,totalInvestValue.length(),Spanned.SPAN_INCLUSIVE_EXCLUSIVE);        spannableString.setSpan(colorSpan1,totalInvestProject.length()+"\n".length(),investContent.length(),Spanned.SPAN_INCLUSIVE_EXCLUSIVE);        spannableString.setSpan(fontSpan1,totalInvestProject.length()+"\n".length(),investContent.length(),Spanned.SPAN_INCLUSIVE_EXCLUSIVE);        //设置TextSwicher需要显示的文本        mTextSwitcher.setText(spannableString);        //设置其自动循环,其间隔播放时间为1.5秒        mTextSwitcher.postDelayed(new Runnable() {            @Override            public void run() {                if(!isFinishing()) {                    nextInvestInfo();                }            }        },1500);    }

以上,就可以实现其效果了
同时,其实现加载图片写法如下:

SpannableString spanString = new SpannableString("欢迎光临Harvic的博客");    Drawable d = getResources().getDrawable(R.drawable.ic_launcher);    d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());    ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);    spanString.setSpan(span, 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);    editText.setText(spanString); 

以上,ok

另外补充:
Spanny,SpannableStringBuilder, SpannableString三者之间的关系
1,Spanny extends SpannableStringBuilder
2,SpannableStringBuilder是可拼接的,及可以调用append()
3,SpannableString是不可拼接的

如下图效果:每个字大小不一
这里写图片描述
实现代码:

Spanny spanny = new Spanny(str[0]+".",new AbsoluteSizeSpan(38,true))  .append(str[1], new AbsoluteSizeSpan(22,true))  .append("折", new AbsoluteSizeSpan(16, true));} text.setText(spanny );

实现每个字的大小和颜色不一样:

Spanny title = new Spanny("财富\n", new ForegroundColorSpan(getResources().getColor(R.color.white)),                new AbsoluteSizeSpan(DensityUtils.sp2px(getActivity(), 16)))                .append(HiderFormatUtils.getPhone(phoneNumber), new ForegroundColorSpan(getResources().getColor(R.color.white)),                        new AbsoluteSizeSpan(DensityUtils.sp2px(getActivity(), 12)));

以上:就补充到这