TextSwitcher实现文本自动垂直滚动
实现功能:用TextSwitcher实现文本自动垂直滚动,类似淘宝首页广告条。
实现效果:
注意:由于网上横向滚动的例子比较多,所以这里通过垂直的例子演示。
实现步骤:1、extends TextSwitcher implements ViewFactory
2、重写makeView(),在里面返回一个TextView
3、对TextSwitcher做初始化设置:setFactory、setInAnimation、setOutAnimation
4、给TextSwitcher设置要滚动的文本内容
5、使用Timer进行定时发送消息给Handler,handler收到消息之后,取出下一个要显示的文本,然后执行内容的切换。
上代码:
- package com.example.testtextview;
- import java.util.Timer;
- import java.util.TimerTask;
- import android.content.Context;
- import android.os.Handler;
- import android.os.Message;
- import android.util.AttributeSet;
- import android.view.View;
- import android.view.animation.AnimationUtils;
- import android.widget.TextSwitcher;
- import android.widget.TextView;
- import android.widget.ViewSwitcher.ViewFactory;
- /**
- * @author (●—●)
- *
- * @data 2015-12-15下午3:36:00
- *
- * @describe
- */
- public class TextSwitchView extends TextSwitcher implements ViewFactory{
- private int index= -1;
- private Context context;
- private Handler mHandler = new Handler(){
- <span style="white-space:pre"> </span>public void handleMessage(Message msg) {
- switch (msg.what) {
- case 1:
- index = next(); //取得下标值
- updateText(); //更新TextSwitcherd显示内容;
- break;
- }
- };
- };
- private String [] resources={
- "静夜思",
- "床前明月光","疑是地上霜",
- "举头望明月",
- "低头思故乡"
- };
- private Timer timer; //
- public TextSwitchView(Context context) {
- super(context);
- this.context = context;
- init();
- }
- public TextSwitchView(Context context, AttributeSet attrs) {
- super(context, attrs);
- this.context = context;
- init();
- }
- private void init() {
- if(timer==null)
- timer = new Timer();
- this.setFactory(this);
- this.setInAnimation(AnimationUtils.loadAnimation(context, R.anim.in_animation));
- this.setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.out_animation));
- }
- public void setResources(String[] res){
- this.resources = res;
- }
- public void setTextStillTime(long time){
- if(timer==null){
- timer = new Timer();
- }else{
- timer.scheduleAtFixedRate(new MyTask(), 1, time);//每3秒更新
- }
- }
- private class MyTask extends TimerTask{
- @Override
- public void run() {
- mHandler.sendEmptyMessage(1);
- }
- }
- private int next(){
- int flag = index+1;
- if(flag>resources.length-1){
- flag=flag-resources.length;
- }
- return flag;
- }
- private void updateText(){
- this.setText(resources[index]);
- }
- @Override
- public View makeView() {
- TextView tv =new TextView(context);
- return tv;
- }
- }
- </span></span>
in_animation.xml
- <?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"
- android:toYDelta="0%p" />
- </set>
out_animation.xml
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android" >
- <translate
- android:duration="2000"
- android:fromYDelta="0%p"
- android:toYDelta="-100%p" />
- </set>
主程序调用:
- TextSwitchView tsv = (TextSwitchView) findViewById(R.id.tsv);
- String [] res={
- "静夜思",
- "床前明月光","疑是地上霜",
- "举头望明月",
- "低头思故乡"
- };
- tsv.setResources(res);
- 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实现文本自动垂直滚动的更多相关文章
- Android文字跑马灯控件(文本自动滚动控件)
最近在开发一个应用,需要用到文本的跑马灯效果,图省事,在网上找,但老半天都找不到,后来自己写了一个,很简单,代码如下: import android.content.Context; import a ...
- Android自定义垂直滚动自动选择日期控件
------------------本博客如未明正声明转载,皆为原创,转载请注明出处!------------------ 项目中需要一个日期选择控件,该日期选择控件是垂直滚动,停止滚动时需要校正日期 ...
- 【CSS】隐藏多行文本框Textarea在IE中的垂直滚动栏
在<[CSS]禁止Google浏览器同意定义调整多行文本框>(点击打开链接)中已经提及过怎样使多行文本框Textarea在一些DOM2的浏览器中固定下来. 这不,多行文本框Textarea ...
- Tkinter Scrollbar(垂直滚动部件)
Python GUI - Tkinter Scrollbar:这个小工具提供了一个幻灯片控制器,用于实现垂直滚动部件,如列表框,文本和帆布.请注意,您还可以创建进入部件的水平滚动条 这个小工具提供 ...
- jquery datatable设置垂直滚动后,表头(th)错位问题
jquery datatable设置垂直滚动后,表头(th)错位问题 问题描述: 我在datatable里设置:"scrollY": '300px',垂直滚动属性后,表头的宽度就会 ...
- Android TextView多行垂直滚动
在Android应用中,有时候需要TextView可以垂直滚动,今天我就介绍一下怎么实现的.在布局里: <TextView android:id="@+id/tvCWJ" a ...
- js实现的新闻列表垂直滚动实现详解
js实现的新闻列表垂直滚动实现详解:新闻列表垂直滚动效果在大量的网站都有应用,有点自然是不言而喻的,首先由于网页的空间有限,使用滚动代码可以使用最小的空间提供更多的信息量,还有让网页有了动态的效果,更 ...
- 自己写一个jQuery垂直滚动栏插件(panel)
html中原生的滚动栏比較难看,所以有些站点,会自己实现滚动栏,导航站点hao123在一个側栏中,就自己定义了垂直滚动栏,效果比較好看,截图例如以下: watermark/2/text/aHR0cDo ...
- [转]jquery.vTicker(垂直滚动)
转至:http://www.w3ci.com/plugin/660.html 简介 vTicker 是一款非常小巧的 jQuery 垂直滚动插件,压缩后只有 2KB.vTicker 支持自定义滚动时间 ...
随机推荐
- css3实现的鼠标经过按钮特效
今天要为各网友再带来一款css实现的鼠标经过按钮的特效.按钮初始时,边框为断开的按钮,当鼠标经过按钮时动画变为封闭的边框.效果图如下: 在线预览 源码下载 我们一起看下实现的代码: html代码: ...
- echart 地图
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...
- Spring 事物传播特性
Spring 事物传播特性 这是Spring官方的定义 一共有7种 摘自源码省略了一部分 public interface TransactionDefinition { int PROPAGATIO ...
- Android——电脑蓝屏重启后,studio无法认出Android环境 setup JDK(缓存!缓存!缓存)
电脑蓝屏重启后,studio无法认出Android环境 setup JDK 问题重现:因为工作问题,需要用到模拟器,然后创建了模拟器后开启了漫长的等待之旅,两三分钟之后win8蓝屏,重启,再次打开,依 ...
- 课后作业——用lastIndexOf判断是否是字符串的最后一位
package test; public class Testlianxi { public static void main(String[] args) { //判断fgh是否是字符串的最后一位 ...
- DataGridView使用技巧十二:DataGridView Error图标表示的设定
为了提醒用户注意,DataGridView可以使用Error图标来突出显示. Error图标可以在单元格和行头内表示,但不能在列头上显示. 1.ErrorText属性 当设定单元格/行的ErrorTe ...
- js学习笔记17----元素的各种位置,尺寸
1. offsetLeft[Top] 当前元素到定位父级(即offsetParent)的距离(偏移值 ). 父级没有定位: offsetParent -> body offsetLeft[Top ...
- 自己写的jQuery 左右选择框,大家多多指教!
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD ...
- ADT Android Development Tools
ADT(Android Development Tools)在Eclipse编译IDE环境中,需安装ADT(Android Developer Tools)Plug-in,这是Android在Ecli ...
- perl 脚本将phred33 转换为phred64
今天用fastx_tookit 时遇到问题, 我的fastq 文件的碱基质量值格式为phred33, 而fastq_tookit 默认碱基质量值的格式为phred64, 所以报错了,提示我的fastq ...