实现功能:用TextSwitcher实现文本自动垂直滚动,类似淘宝首页广告条。

实现效果:

注意:由于网上横向滚动的例子比较多,所以这里通过垂直的例子演示。

实现步骤:1、extends TextSwitcher implements ViewFactory

2、重写makeView(),在里面返回一个TextView

3、对TextSwitcher做初始化设置:setFactory、setInAnimation、setOutAnimation

4、给TextSwitcher设置要滚动的文本内容

5、使用Timer进行定时发送消息给Handler,handler收到消息之后,取出下一个要显示的文本,然后执行内容的切换。

上代码:

  1. package com.example.testtextview;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. import android.content.Context;
  5. import android.os.Handler;
  6. import android.os.Message;
  7. import android.util.AttributeSet;
  8. import android.view.View;
  9. import android.view.animation.AnimationUtils;
  10. import android.widget.TextSwitcher;
  11. import android.widget.TextView;
  12. import android.widget.ViewSwitcher.ViewFactory;
  13. /**
  14. * @author (●—●)
  15. *
  16. * @data 2015-12-15下午3:36:00
  17. *
  18. * @describe
  19. */
  20. public class TextSwitchView extends TextSwitcher implements ViewFactory{
  21. private int index= -1;
  22. private Context context;
  23. private Handler mHandler = new Handler(){
  24. <span style="white-space:pre">    </span>public void handleMessage(Message msg) {
  25. switch (msg.what) {
  26. case 1:
  27. index = next(); //取得下标值
  28. updateText();  //更新TextSwitcherd显示内容;
  29. break;
  30. }
  31. };
  32. };
  33. private String [] resources={
  34. "静夜思",
  35. "床前明月光","疑是地上霜",
  36. "举头望明月",
  37. "低头思故乡"
  38. };
  39. private Timer timer; //
  40. public TextSwitchView(Context context) {
  41. super(context);
  42. this.context = context;
  43. init();
  44. }
  45. public TextSwitchView(Context context, AttributeSet attrs) {
  46. super(context, attrs);
  47. this.context = context;
  48. init();
  49. }
  50. private void init() {
  51. if(timer==null)
  52. timer = new Timer();
  53. this.setFactory(this);
  54. this.setInAnimation(AnimationUtils.loadAnimation(context, R.anim.in_animation));
  55. this.setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.out_animation));
  56. }
  57. public void setResources(String[] res){
  58. this.resources = res;
  59. }
  60. public void setTextStillTime(long time){
  61. if(timer==null){
  62. timer = new Timer();
  63. }else{
  64. timer.scheduleAtFixedRate(new MyTask(), 1, time);//每3秒更新
  65. }
  66. }
  67. private class MyTask extends TimerTask{
  68. @Override
  69. public void run() {
  70. mHandler.sendEmptyMessage(1);
  71. }
  72. }
  73. private int next(){
  74. int flag = index+1;
  75. if(flag>resources.length-1){
  76. flag=flag-resources.length;
  77. }
  78. return flag;
  79. }
  80. private void updateText(){
  81. this.setText(resources[index]);
  82. }
  83. @Override
  84. public View makeView() {
  85. TextView tv =new TextView(context);
  86. return tv;
  87. }
  88. }
  89. </span></span>

in_animation.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <translate
  4. android:duration="2000"
  5. android:fromYDelta="100%p"
  6. android:toYDelta="0%p" />
  7. </set>

out_animation.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >
  3. <translate
  4. android:duration="2000"
  5. android:fromYDelta="0%p"
  6. android:toYDelta="-100%p" />
  7. </set>

主程序调用:

  1. TextSwitchView tsv = (TextSwitchView) findViewById(R.id.tsv);
  2. String [] res={
  3. "静夜思",
  4. "床前明月光","疑是地上霜",
  5. "举头望明月",
  6. "低头思故乡"
  7. };
  8. tsv.setResources(res);
  9. tsv.setTextStillTime(5000);

注意事项:

1.在布局文件使用该自定义控件时候,需要修改下全路径<com.example.testtextview.TextSwitchView/>

2.使用时候直接先调用setTextStillTime设置文本停留时间,并自动启动。

setResources就好,不要重复调用代码解析:

ViewFactory:,是一个视图工厂。它需要实现makeView()去返回你要的一个视图,这里是实现文本滚动,所以直接返回一个TextView,这里顺带修改TextView的一些属性,比如文字大小等。

2、setFactory:看下源码的解释:Sets the factory used to create the two views
between which the ViewSwitcher will flip.

实际上它帮我们创建了两个view,然后通过ViewSwitcher帮我们实现了翻转。

3、重点来了,刚刚提到ViewSwitcher其实只是帮我们实现视图的切换,然而,视图的切换的形式动画,是可以由你自己来定的。

this.setInAnimation(AnimationUtils.loadAnimation(context, R.anim.in_animation));  //视图进来时候的动画

this.setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.out_animation));//视图出去时候的动画

如果你不想垂直滚动,想实现水平滚动,这里直接修改动画就可以了。

4、动画分析:

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android" >

<translate

android:duration="2000"//动画的持续时间,如果觉得文本滚动过程太慢,可以修改这里的时间

android:fromYDelta="100%p"//Y位置的起点,这里要先清楚一点,文本显示在正中间的时候是0%p,由于android的坐标系中,y轴往下为正。所以文本进来的时候,其实是从100%p->0%p

android:toYDelta="0%p" />

</set>

另一个动画就不解释了,原理一样,从0%p->-100%p,自然它就出去了

5、剩下就是通过Timer去调用Handler,然后执行this.setText(resources[index]);  去修改文本内容而已了。文本内容修改完,滚进跟滚出的动画刚才已经解释了。收工。

TextSwitcher实现文本自动垂直滚动的更多相关文章

  1. Android文字跑马灯控件(文本自动滚动控件)

    最近在开发一个应用,需要用到文本的跑马灯效果,图省事,在网上找,但老半天都找不到,后来自己写了一个,很简单,代码如下: import android.content.Context; import a ...

  2. Android自定义垂直滚动自动选择日期控件

    ------------------本博客如未明正声明转载,皆为原创,转载请注明出处!------------------ 项目中需要一个日期选择控件,该日期选择控件是垂直滚动,停止滚动时需要校正日期 ...

  3. 【CSS】隐藏多行文本框Textarea在IE中的垂直滚动栏

    在<[CSS]禁止Google浏览器同意定义调整多行文本框>(点击打开链接)中已经提及过怎样使多行文本框Textarea在一些DOM2的浏览器中固定下来. 这不,多行文本框Textarea ...

  4. Tkinter Scrollbar(垂直滚动部件)

    Python GUI - Tkinter Scrollbar:这个小工具提供了一个幻灯片控制器,用于实现垂直滚动部件,如列表框,文本和帆布.请注意,您还可以创建进入部件的水平滚动条   这个小工具提供 ...

  5. jquery datatable设置垂直滚动后,表头(th)错位问题

    jquery datatable设置垂直滚动后,表头(th)错位问题 问题描述: 我在datatable里设置:"scrollY": '300px',垂直滚动属性后,表头的宽度就会 ...

  6. Android TextView多行垂直滚动

    在Android应用中,有时候需要TextView可以垂直滚动,今天我就介绍一下怎么实现的.在布局里: <TextView android:id="@+id/tvCWJ" a ...

  7. js实现的新闻列表垂直滚动实现详解

    js实现的新闻列表垂直滚动实现详解:新闻列表垂直滚动效果在大量的网站都有应用,有点自然是不言而喻的,首先由于网页的空间有限,使用滚动代码可以使用最小的空间提供更多的信息量,还有让网页有了动态的效果,更 ...

  8. 自己写一个jQuery垂直滚动栏插件(panel)

    html中原生的滚动栏比較难看,所以有些站点,会自己实现滚动栏,导航站点hao123在一个側栏中,就自己定义了垂直滚动栏,效果比較好看,截图例如以下: watermark/2/text/aHR0cDo ...

  9. [转]jquery.vTicker(垂直滚动)

    转至:http://www.w3ci.com/plugin/660.html 简介 vTicker 是一款非常小巧的 jQuery 垂直滚动插件,压缩后只有 2KB.vTicker 支持自定义滚动时间 ...

随机推荐

  1. android 使用 sqlite

    SQLiteHelper .class  (升级的时候,做点小技巧) package com.keyue.qlm.util;  import android.content.Context;  imp ...

  2. C#中一道关于多线程的编程题

    题目的意思是这样的:让两个线程A和B将自己的ID轮番写入一个文件中,每个线程重复十次写入后执行一个回调函数,说“I'm OK”,就这样.我是一名QA,不是开发,出于兴趣报考了公司的C#课程考试,多线程 ...

  3. python pip 升级

      首先安装python,在百度中搜索python,进入python官网.点击download,选择电脑对应的系统进行下载,此处以windows系统的python 3.5.1进行介绍,点击即可下载. ...

  4. vim添加复制(crtl+c),粘贴(ctrl+v)ctrl+A 等快捷键

    1  在  /usr/share/vim/vimrc文件中添加   source $VIMRUNTIME/mswin.vim 2  mswin.vim位置在 /usr/share/vim/vim72/ ...

  5. C#多线程解决界面卡死问题的完美解决方案,BeginInvoke而不是委托delegate 转载

    问题描述:当我们的界面需要在程序运行中不断更新数据时,当一个textbox的数据需要变化时,为了让程序执行中不出现界面卡死的现像,最好的方法就是多线程来解决一个主线程来创建界面,使用一个子线程来执行程 ...

  6. 【WPF】给下拉列表ComboBox绑定数据

    思路:给ComboBox控件设置它的ItemSource绑定到ViewModel中的某个列表上,该列表是某个实体类的集合(如List< Person >),而ComboBox列表要显示的是 ...

  7. Kettle安装与配置

    设置好了之后可以测试下 后来百度发现是缺少mysql的JDBC连接驱动 kettle在初次配置的时候容易出这个问题,这个是由于java程序在连接mysql数据库的时候缺少驱动 我的kettle版本是4 ...

  8. GPU硬件加速原理 /转

    现代浏览器大都可以利用GPU来加速页面渲染.每个人都痴迷于60桢每秒的顺滑动画.在GPU的众多特性之中,它可以存储一定数量的纹理(一个矩形的像素点集合)并且高效地操作这些纹理(比如进行特定的移动.缩放 ...

  9. iOS边练边学--transform的简单介绍并且用transform实现键盘处理

    一.transform:形变属性,能完成功能:平移,缩放,旋转 <平移> // 根据给的移动距离平移 self.tempView.transform = CGAffineTransform ...

  10. 在Ubuntu中安装PHP,MySQL,Nginx和phpMyAdmin

    apt install php apt-get install php7.0 apt-get -y install php7.0-fpm 缺少 mysqli 扩展.请检查 PHP 配置. apt in ...