实现功能:用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. RTX——第10章 任务调度-抢占式、时间片和合作式

    以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章教程为大家将介绍 RTX 操作系统支持的任务调度方式,抢占式,时间片和合作式,这部分算是RTX 操作 ...

  2. Linux 下 tail 命令

    简述 tail命令从指定点开始将文件写到标准输出,使用tail命令的“-f”选项可以方便的查阅正在改变的日志文件,“tail -f filename”会把filename里最尾部的内容显示在屏幕上,并 ...

  3. PKU OJ Exponentiation

    ExponentiationTime Limit: 500MS                      Memory Limit: 10000KTotal Submissions: 155886   ...

  4. iOS边练边学--UIScrollView和xib文件实现简单分页+定时器初使用

    一.xib文件构成 二.自定义控件类(xib文件与自定义控件类的文件名字相同,并且将xib文件中父类控件的类名改成自定义控件类的名称) ***********自定义控件类需要的属性********** ...

  5. Log4j,Log4j2,logback,slf4j日志学习

    日志学习笔记 Log4j Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.数据库等:我们也可以控制每一条日志的输出格式:通过定义每一条 ...

  6. javac编译成功,用java运行class文件出现“找不到或无法加载主类” 的问题

    1.pack后为包名,包与系统文件夹一一对应.并且代码中的包名不包含文件包的名字,即文件名 2.javac 按照*.java 文件的所在路径进行编译,编译完成后,使用java +完整包名(包含文件包名 ...

  7. csv导入mysql提示错误[Error Code] 1290 - The MySQL server is running with the --secure-file-priv option

    解决方法: 1.进入mysql查看secure_file_prive的值 mysql>SHOW VARIABLES LIKE "secure_file_priv"; secu ...

  8. 高速入门:十分钟学会Python

    初试牛刀 如果你希望学习Python这门语言.却苦于找不到一个简短而全面的新手教程.那么本教程将花费十分钟的时间带你走入Python的大门.本文的内容介于教程(Toturial)和速查手冊(Cheat ...

  9. Erlang的Web库和框架

    ChicagoBoss,Nitrogen ,Zotontic,BeepBeep,ErlyWeb,Erlang Boss. 转自:http://bbs.chinaunix.net/thread-3764 ...

  10. erlang的小知识,未分类。

    erlang:module_loaded(module):检测模块是否已加载: