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 支持自定义滚动时间 ...
随机推荐
- mysql utf8mb4 所引起的问题
有一个项目需要存储ios的表情(emoji表情)这种表情虽然是utf8编码,但是一个字符需要占用4个字节,而MySQL utf8编码只能存放3字节的字符.在MySQL 5.6中,可以设置编码为utf8 ...
- Consumer
Description FJ is going to do some shopping, and before that, he needs some boxes to carry the diffe ...
- 深入浅出c++之---this指针
前言:C语言中的数组指针和指针数组 数组指针,是指向数组的指针的缩写:指针数组,是存放指针的数组的缩写.其实很多时候,往往因为简写和缩写带给我们很多困惑.我曾想过不用简称去学习,但在很多时候,我们查询 ...
- jfinal视频目录
目录-----------------------------------------------------------第一章 简介第二章 JFine2.0 maven demo第三章番外篇 JFi ...
- oracle 制定定时任务
本节摘要:本节介绍使用oracle自带的job来实现oracle定制定时执行任务. 1.引言 定制定时执行的任务有两种形式,系统级别和数据库级别, 从操作系统级别来讲, windows系统我们可以 ...
- rhel7的xfs与Oracle database
在rhel7下,安装oracle database时,能够选择xfs文件,例如以下: Requirements for Installing Oracle Database 12.1on RHEL7 ...
- 双行表头DatagridView的简单实现
DatagridView默认不支持多行表头的实现,一些第三方的控件,比如Spread就可以,因此要实现这个功能,只能自己想办法了.介绍两种思路:1,用重写DataGridView的Paint等方法,可 ...
- android学习日记01--综述
开个博客,写点关于Android的知识,希望温故而知新吧! 一.总体框架 先上一张google提供官方的Android框架图: Android系统架构由5部分组成,分别是:Linux Kernel.A ...
- html精灵技术(用来显示图片的某个区域)
.left .left_down li.a.left-down-pic{display:block;width:50px;height:50px;background:url(images/app_i ...
- 关于datatable导出execl
导出主要考虑响应流的问题 curContext.Response.ContentType = "application/vnd.ms-excel"; curContext.Resp ...