实现功能:用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. PowerShell中进行文件读取,信息排序,分类计数。

    这是国外某大学QA的一道作业题,读取mainlog文件中的每一行信息,并获取有效的信息,也就是每条信息中第四个@后面的内容,然后进行分类与计数,要求是用Perl写,但我是用PowerShell完成的, ...

  2. python 实现ARP攻击

    注:使用这个脚本需要安装scapy 包 最好在linux平台下使用,因为scapy包在windows上安装老是会有各种问题 #coding:utf-8 #example :sudo python ar ...

  3. iOS菊花加载圈

    自定制一个继承于UIView的类然后重写initWithFrame方法;如下 - (id)initWithFrame:(CGRect)frame { self = [super initWithFra ...

  4. SVN回滚至某个版本

    今天新上传的版本出错了,需要回滚至之前的版本. 记录一下过程. 在项目文件夹下. 1.打开日志历史.右键单击,TortoiseSVN-->show log 2.要回滚至版本x.在版本x上右键单击 ...

  5. Nhibernate 一对一,一对多,多对多 成功映射

    前语: 在Nhibernate xml 的文件配置上,一对一和多对多的配置比较简单,容易出错的反而是一对多(多对一)上. 1.一对一关联关系的映射: <one-to-one name=" ...

  6. eclipse安装中文补丁包

    第一步:打开http://www.eclipse.org/babel/ 第二步:找到downloads. 第三步:点击Oxygen. 第四步:找到简体中文的zip插件并兵下载. 第五步:解压. 第六步 ...

  7. ssh加密公私钥

    SSH公钥登录原理 在平时工作中我们经常要远程登录服务器,这就要用到SSH协议: $ ssh user@host 主要有两种登录方式:第一种为密码口令登录,第二种为公钥登录 密码口令登录 通过密码进行 ...

  8. Java-ThreadLocal,Java中特殊的线程绑定机制

    在DRP项目中,我们使用了ThreadLocal来创建Connection连接,避免了一直以参数的形式将Connection向下传递(传递connection的目的是由于jdbc事务要求确保使用同一个 ...

  9. jquery javascript 回到顶部功能

    今天搞了一个回到顶部的JS JQ功能 (function($){ $.fn.survey=function(options){ var defaults={width:"298", ...

  10. C# 如何使用NPOI操作Excel以及读取合并单元格等

    C#操作Excel方法有很多,以前用的需要电脑安装office才能用,但因为版权问题公司不允许安装office.所以改用NPOI进行Excel操作,基本上一些简单的Excel操作都没有问题,读写合并单 ...