最近在开发一个应用,需要用到文本的跑马灯效果,图省事,在网上找,但老半天都找不到,后来自己写了一个,很简单,代码如下:

  1. import android.content.Context;
  2. import android.graphics.Canvas;
  3. import android.graphics.Paint;
  4. import android.os.Parcel;
  5. import android.os.Parcelable;
  6. import android.util.AttributeSet;
  7. import android.view.Display;
  8. import android.view.View;
  9. import android.view.WindowManager;
  10. import android.view.View.OnClickListener;
  11. import android.widget.TextView;
  12.  
  13. /**
  14. *
  15. * TODO 单行文本跑马灯控件
  16. *
  17. * @author tianlu
  18. * @version 1.0
  19. * Create At : 2010-2-16 下午09:35:03
  20. */
  21. public class AutoScrollTextView extends TextView implements OnClickListener {
  22. public final static String TAG = AutoScrollTextView.class.getSimpleName();
  23.  
  24. private float textLength = 0f;//文本长度
  25. private float viewWidth = 0f;
  26. private float step = 0f;//文字的横坐标
  27. private float y = 0f;//文字的纵坐标
  28. private float temp_view_plus_text_length = 0.0f;//用于计算的临时变量
  29. private float temp_view_plus_two_text_length = 0.0f;//用于计算的临时变量
  30. public boolean isStarting = false;//是否开始滚动
  31. private Paint paint = null;//绘图样式
  32. private String text = "";//文本内容
  33.  
  34. public AutoScrollTextView(Context context) {
  35. super(context);
  36. initView();
  37. }
  38.  
  39. public AutoScrollTextView(Context context, AttributeSet attrs) {
  40. super(context, attrs);
  41. initView();
  42. }
  43.  
  44. public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) {
  45. super(context, attrs, defStyle);
  46. initView();
  47. }
  48.  
  49. /**
  50. * 初始化控件
  51. */
  52. private void initView()
  53. {
  54. setOnClickListener(this);
  55. }
  56.  
  57. /**
  58. * 文本初始化,每次更改文本内容或者文本效果等之后都需要重新初始化一下
  59. */
  60. public void init(WindowManager windowManager)
  61. {
  62. paint = getPaint();
  63. text = getText().toString();
  64. textLength = paint.measureText(text);
  65. viewWidth = getWidth();
  66. if(viewWidth == 0)
  67. {
  68. if(windowManager != null)
  69. {
  70. Display display = windowManager.getDefaultDisplay();
  71. viewWidth = display.getWidth();
  72. }
  73. }
  74. step = textLength;
  75. temp_view_plus_text_length = viewWidth + textLength;
  76. temp_view_plus_two_text_length = viewWidth + textLength * 2;
  77. y = getTextSize() + getPaddingTop();
  78. }
  79.  
  80. @Override
  81. public Parcelable onSaveInstanceState()
  82. {
  83. Parcelable superState = super.onSaveInstanceState();
  84. SavedState ss = new SavedState(superState);
  85.  
  86. ss.step = step;
  87. ss.isStarting = isStarting;
  88.  
  89. return ss;
  90.  
  91. }
  92.  
  93. @Override
  94. public void onRestoreInstanceState(Parcelable state)
  95. {
  96. if (!(state instanceof SavedState)) {
  97. super.onRestoreInstanceState(state);
  98. return;
  99. }
  100. SavedState ss = (SavedState)state;
  101. super.onRestoreInstanceState(ss.getSuperState());
  102.  
  103. step = ss.step;
  104. isStarting = ss.isStarting;
  105.  
  106. }
  107.  
  108. public static class SavedState extends BaseSavedState {
  109. public boolean isStarting = false;
  110. public float step = 0.0f;
  111. SavedState(Parcelable superState) {
  112. super(superState);
  113. }
  114.  
  115. @Override
  116. public void writeToParcel(Parcel out, int flags) {
  117. super.writeToParcel(out, flags);
  118. out.writeBooleanArray(new boolean[]{isStarting});
  119. out.writeFloat(step);
  120. }
  121.  
  122. public static final Parcelable.Creator<SavedState> CREATOR
  123. = new Parcelable.Creator<SavedState>() {
  124.  
  125. public SavedState[] newArray(int size) {
  126. return new SavedState[size];
  127. }
  128.  
  129. @Override
  130. public SavedState createFromParcel(Parcel in) {
  131. return new SavedState(in);
  132. }
  133. };
  134.  
  135. private SavedState(Parcel in) {
  136. super(in);
  137. boolean[] b = null;
  138. in.readBooleanArray(b);
  139. if(b != null && b.length > 0)
  140. isStarting = b[0];
  141. step = in.readFloat();
  142. }
  143. }
  144.  
  145. /**
  146. * 开始滚动
  147. */
  148. public void startScroll()
  149. {
  150. isStarting = true;
  151. invalidate();
  152. }
  153.  
  154. /**
  155. * 停止滚动
  156. */
  157. public void stopScroll()
  158. {
  159. isStarting = false;
  160. invalidate();
  161. }
  162.  
  163. @Override
  164. public void onDraw(Canvas canvas) {
  165. canvas.drawText(text, temp_view_plus_text_length - step, y, paint);
  166. if(!isStarting)
  167. {
  168. return;
  169. }
  170. step += 0.5;
  171. if(step > temp_view_plus_two_text_length)
  172. step = textLength;
  173. invalidate();
  174.  
  175. }
  176.  
  177. @Override
  178. public void onClick(View v) {
  179. if(isStarting)
  180. stopScroll();
  181. else
  182. startScroll();
  183.  
  184. }
  185.  
  186. }

实现了宽度的判断,文本自动滚动及开始和停止滚动等功能。
在UI xml中的配置如下:

  1. <cn.tigertian.ui.AutoScrollTextView
  2. android:id="@+id/TextViewNotic "
  3. android:layout_height="30px"
  4. android:layout_width="fill_parent"
  5. android:text="@string/test_notice_1"
  6. android:textColor="#000"
  7. android:inputType="text"
  8. android:background="#EEE" android:
  9. textSize="20px">
  10. </cn.tigertian.ui.AutoScrollTextView>

在Activity中的使用方法如下:

  1. //启动公告滚动条
  2. autoScrollTextView = (AutoScrollTextView)findViewById(R.id.TextViewNotice);
  3. autoScrollTextView.init(getWindowManager());
  4. autoScrollTextView.startScroll();

如果想改变跑马灯的文字内容或者文字效果,则在调用完setText方法之后,需要再调用一下init(WindowManager windowManager)方法,重新进行初始化和相关参数的计算。

http://www.blogjava.net/TiGERTiAN/archive/2010/02/13/312840.html

Android文字跑马灯控件(文本自动滚动控件)的更多相关文章

  1. Android开发:文本控件详解——TextView(二)文字跑马灯效果实现

    一.需要使用的属性: 1.android:ellipsize 作用:若文字过长,控制该控件如何显示. 对于同样的文字“Android开发:文本控件详解——TextView(二)文字跑马灯效果实现”,不 ...

  2. 在android中用跑马灯的效果显示textview

    大家好,在我们通常的android project中,通常需要用到textview这一个布局文件,并且对于这一个显示布局所需要的文本文字内容. 下面我们就来介绍一种方法来实现在android中用跑马灯 ...

  3. jQuery+CSS3文字跑马灯特效

    jQuery+CSS3文字跑马灯特效是一款将跑马灯背景制作为3D立方体效果,文字在上面移动时,就像是文字投影到墙壁上,在转角出会改变运动方向. 效果展示 http://hovertree.com/te ...

  4. Android:TextView跑马灯-详解

    Android:TextView跑马灯_详解 引言: TextView之所以需要跑马灯,是由于文字太长,或者是吸引眼球. 关键代码如下: android:singleLine="true&q ...

  5. 用jQuery实现参数自定义的文字跑马灯效果

    一,明确需求 基本需求:最近在工作中接到一个新需求,简单来说就是实现一行文字从右到左跑马灯的效果,并且以固定的时间间隔进行循环. 原本这是一个很容易实现的需求,但是难点是要求很多参数得是用户可自行设置 ...

  6. Androidd Studio 之多行文字跑马灯特效

    •效果展示图 •参考资料 两种方法实现TextView跑马灯效果(字体横向滚动) •出现的问题 新建 Java 文件继承 TextView 时出现问题: •解决方法 不应该继承 $TextView$ ...

  7. JavaScript实现文字跑马灯

    其实实现文字的跑马灯和实现图片轮播的原理是一样的. 下面是我自己实现的,文字的位置可以随便更改,效果不会变,文字的内容可以通过ajax获取,同时,可以直接用Jquery改写一下,很方便. <!D ...

  8. 微信小程序实现文字跑马灯

    wxml: <view>1 显示完后再显示</view> <view class="example"> <view class=" ...

  9. js文字跑马灯

    实现文字跑马灯效果,主要控制scrollLeft. 效果图如下 代码如下 <html> <head> <script type="text/javascript ...

随机推荐

  1. Tomcat 使用Redis存储Session

    Tomcat Redis Session Github 地址. 下载 commons-pool2-2.2.jar,jedis-2.5.2.jar,tomcat-redis-session-manage ...

  2. Boost源码剖析之:泛型指针类any

    C++是强类型语言,所有强类型语言对型别的要求都是苛刻的,型别一有不合编译器就会抱怨说不能将某某型别转换为某某型别,当然如果在型别之间提供了转换操作符或是标准所允许的一定程度的隐式转换(如经过非exp ...

  3. property_自己编写一个读取Property文件的Util类

    读取property文件的Util类: 所需jar包: 编写PropertiesUtil类: package com.west.util.property; import java.io.InputS ...

  4. 【转】PowerShell入门(三):如何快速地掌握PowerShell?

    转至:http://www.cnblogs.com/ceachy/archive/2013/02/01/HowToLearnPowerShell.html 如何快速地掌握PowerShell呢?总的来 ...

  5. JavaScript原型理解

    这东西我还不是很理解,但是把自己实践的过程记录下来,希望积累到一定程度,能自然而而然的理解了.很多东西我是这样慢慢理解的,明白为啥是那样子,真的很神奇哦.少说废话,开始吧. 可以先阅读这篇文章 fun ...

  6. mysql 乱码问题

    A.mysql设置 1.service mysql stop 2.sudo vim /etc/mysql/my.cnf 在[mysqld]中添加下面两行 character_set_server = ...

  7. linux dynamic debug 官方教程

    下载内核后,文档在:Documentation/dynamic-debug-howto.txt 中文版本:http://www.oschina.net/translate/dynamic-debug- ...

  8. python 的 from import 机制

    [A.py] from B import D class C:pass [B.py] from A import C class D:pass 为什么执行A的时候不能加载D呢? 如果将A.py改为:i ...

  9. [问题2014A08] 复旦高等代数 I(14级)每周一题(第十教学周)

    [问题2014A08]  设 \(A=(a_{ij})\) 为数域 \(\mathbb{K}\) 上的 \(n\) 阶方阵, 定义函数 \[f(A)=\sum_{i,j=1}^na_{ij}^2.\] ...

  10. [问题2014S08] 解答

    [问题2014S08] 解答 (此解答由徐昊宸同学和鹿彭同学提供) 设 \(P_1(\lambda),P_2(\lambda),Q_1(\lambda),Q_2(\lambda)\) 为可逆 \(\l ...