实现功能:用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. css3实现的鼠标经过按钮特效

    今天要为各网友再带来一款css实现的鼠标经过按钮的特效.按钮初始时,边框为断开的按钮,当鼠标经过按钮时动画变为封闭的边框.效果图如下: 在线预览   源码下载 我们一起看下实现的代码: html代码: ...

  2. echart 地图

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  3. Spring 事物传播特性

    Spring 事物传播特性 这是Spring官方的定义 一共有7种 摘自源码省略了一部分 public interface TransactionDefinition { int PROPAGATIO ...

  4. Android——电脑蓝屏重启后,studio无法认出Android环境 setup JDK(缓存!缓存!缓存)

    电脑蓝屏重启后,studio无法认出Android环境 setup JDK 问题重现:因为工作问题,需要用到模拟器,然后创建了模拟器后开启了漫长的等待之旅,两三分钟之后win8蓝屏,重启,再次打开,依 ...

  5. 课后作业——用lastIndexOf判断是否是字符串的最后一位

    package test; public class Testlianxi { public static void main(String[] args) { //判断fgh是否是字符串的最后一位 ...

  6. DataGridView使用技巧十二:DataGridView Error图标表示的设定

    为了提醒用户注意,DataGridView可以使用Error图标来突出显示. Error图标可以在单元格和行头内表示,但不能在列头上显示. 1.ErrorText属性 当设定单元格/行的ErrorTe ...

  7. js学习笔记17----元素的各种位置,尺寸

    1. offsetLeft[Top] 当前元素到定位父级(即offsetParent)的距离(偏移值 ). 父级没有定位: offsetParent -> body offsetLeft[Top ...

  8. 自己写的jQuery 左右选择框,大家多多指教!

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...

  9. ADT Android Development Tools

    ADT(Android Development Tools)在Eclipse编译IDE环境中,需安装ADT(Android Developer Tools)Plug-in,这是Android在Ecli ...

  10. perl 脚本将phred33 转换为phred64

    今天用fastx_tookit 时遇到问题, 我的fastq 文件的碱基质量值格式为phred33, 而fastq_tookit 默认碱基质量值的格式为phred64, 所以报错了,提示我的fastq ...