`

Android 多种跑马灯的方法

阅读更多

 

普通的TextView可以实现跑马灯,但是只有当焦点在它上面时才有效。 如何做一个自动的跑马灯呢?

  第一种:继承TextView,然后重写isFocused()方法就可以了,简单!

Java代码:

  1. import android.content.Context;
  2. import android.util.AttributeSet;
  3. import android.widget.TextView;

  4. /**
  5. * 单行文本跑马灯控件
  6. * @author admin
  7. *
  8. */

  9. public class ScrollForeverTextView extends TextView {

  10. public ScrollForeverTextView(Context context) {
  11. super(context);
  12. // TODO Auto-generated constructor stub
  13. }

  14. public ScrollForeverTextView(Context context, AttributeSet attrs) {
  15. super(context, attrs);
  16. }

  17. public ScrollForeverTextView(Context context, AttributeSet attrs,int defStyle) {
  18. super(context, attrs, defStyle);
  19. }

  20. @Override
  21. public boolean isFocused() {
  22. return true;
  23. }

  24. }
复制代码


使用时同TextView一样:

Java代码:

  1. <com.ql.view.ScrollForeverTextView
  2. android:layout_width="fill_parent"
  3. android:layout_height="wrap_content"
  4. android:textSize="30px"
  5. android:singleLine="true"
  6. android:ellipsize="marquee"
  7. android:marqueeRepeatLimit="marquee_forever"
  8. android:textColor="@color/red"
  9. android:text="1234567890wwwwwwwwwwwwwwwwwwwwww1234567890"
  10. android:focusable="true"

  11. />
复制代码


  第2种:还是继承TextView,重写onDraw(),在onDraw中不停的重绘。

Java代码:

  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. * @author admin
  15. */

  16. public class AutoScrollTextView extends TextView implements OnClickListener {
  17. public final static String TAG = AutoScrollTextView.class.getSimpleName();

  18. private float textLength = 0f;// 文本长度
  19. private float viewWidth = 0f;
  20. private float step = 0f;// 文字的横坐标
  21. private float y = 0f;// 文字的纵坐标
  22. private float temp_view_plus_text_length = 0.0f;// 用于计算的临时变量
  23. private float temp_view_plus_two_text_length = 0.0f;// 用于计算的临时变量
  24. public boolean isStarting = false;// 是否开始滚动
  25. private Paint paint = null;// 绘图样式
  26. private CharSequence text = "";// 文本内容
  27. private float speed = 0.5f;
  28. private int textColor=0xFF000000;

  29. public int getTextColor() {
  30. return textColor;
  31. }

  32. public void setTextColor(int color) {
  33. this.textColor = color;
  34. }

  35. public float getSpeed() {
  36. return speed;
  37. }

  38. public void setSpeed(float speed) {
  39. this.speed = speed;
  40. }

  41. public AutoScrollTextView(Context context) {
  42. super(context);
  43. initView();
  44. }

  45. public AutoScrollTextView(Context context, AttributeSet attrs) {
  46. super(context, attrs);
  47. initView();
  48. }

  49. public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) {
  50. super(context, attrs, defStyle);
  51. initView();
  52. }

  53. /**
  54. * 初始化控件
  55. */

  56. private void initView() {
  57. setOnClickListener(this);
  58. }

  59. /**
  60. * 文本初始化,每次更改文本内容或者文本效果等之后都需要重新初始化一下!
  61. */

  62. public void init(float width/*WindowManager windowManager*/) {
  63. text=super.getText();
  64. paint = super.getPaint();
  65. // Paint paint=new Paint();
  66. text = getText().toString();
  67. textLength = paint.measureText(text.toString());
  68. // viewWidth = getWidth();
  69. // if (viewWidth == 0) {
  70. // if (windowManager != null) {
  71. // Display display = windowManager.getDefaultDisplay();
  72. // viewWidth = display.getWidth();
  73. // }
  74. // }

  75. viewWidth=width;
  76. step = textLength;
  77. temp_view_plus_text_length = viewWidth + textLength;
  78. temp_view_plus_two_text_length = viewWidth + textLength * 2;
  79. y = getTextSize() + getPaddingTop();
  80. paint.setColor(textColor);
  81. }

  82. @Override
  83. public Parcelable onSaveInstanceState() {
  84. Parcelable superState = super.onSaveInstanceState();
  85. SavedState ss = new SavedState(superState);
  86. ss.step = step;
  87. ss.isStarting = isStarting;
  88. return ss;
  89. }


  90. @Override
  91. public void onRestoreInstanceState(Parcelable state) {
  92. if (!(state instanceof SavedState)) {
  93. super.onRestoreInstanceState(state);
  94. return;
  95. }
  96. SavedState ss = (SavedState) state;
  97. super.onRestoreInstanceState(ss.getSuperState());
  98. step = ss.step;
  99. isStarting = ss.isStarting;
  100. }

  101. public static class SavedState extends BaseSavedState {
  102. public boolean isStarting = false;
  103. public float step = 0.0f;
  104. SavedState(Parcelable superState) {
  105. super(superState);
  106. }

  107. @Override
  108. public void writeToParcel(Parcel out, int flags) {
  109. super.writeToParcel(out, flags);
  110. out.writeBooleanArray(new boolean[] { isStarting });
  111. out.writeFloat(step);
  112. }

  113. public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {

  114. public SavedState[] newArray(int size) {
  115. return new SavedState[size];
  116. }

  117. @Override
  118. public SavedState createFromParcel(Parcel in) {
  119. return new SavedState(in);
  120. }
  121. };

  122. private SavedState(Parcel in) {
  123. super(in);
  124. boolean[] b = null;
  125. in.readBooleanArray(b);
  126. if (b != null && b.length > 0)
  127. isStarting = b[0];
  128. step = in.readFloat();
  129. }
  130. }

  131. /**
  132. * 开始滚动
  133. */

  134. public void startScroll() {
  135. isStarting = true;
  136. invalidate();
  137. }

  138. /**
  139. * 停止滚动
  140. */
  141. public void stopScroll() {
  142. isStarting = false;
  143. invalidate();
  144. }

  145. @Override
  146. public void onDraw(Canvas canvas) {
  147. // super.onDraw(canvas);

  148. canvas.drawText(text,0,text.length(), temp_view_plus_text_length - step, y, paint);
  149. if (!isStarting) {
  150. return;
  151. }
  152. step += speed;
  153. if (step > temp_view_plus_two_text_length)
  154. step = textLength;
  155. invalidate();
  156. }

  157. @Override
  158. public void onClick(View v) {
  159. if (isStarting)
  160. stopScroll();
  161. else
  162. startScroll();

  163. }

  164. }
复制代码


使用:

Java代码:

  1. marquee = (AutoScrollTextView) findViewById(R.id.marquee);

  2. // marquee.setText(String.format(getResources().getString(R.string.marquee0),Consts.termno,"2010-12-28"));

  3. marquee.setText("上证指数3000.15 6.81(0.37%)深圳成指3000.15 6.81(0.37%)");

  4. // marquee.setTextColor(0xffff0000);//注意:颜色必须在这里设置,xml中设置无效!默认黑色。
  5. //如果想改变跑马灯的文字内容或者文字效果,则在调用完setText方法之后,需要再调用一下init(width)方法,重新进行初始化和相关参数的计算。

  6. marquee.setSpeed(1.5f);
  7. marquee.init(width);//width通常就是屏幕宽!
  8. marquee.startScroll();
复制代码

第三种方法:设置其对应的layout中的:addStatesFromChildren = “true”.使用其获得焦点时有跑马灯的效果。

src:http://www.eoeandroid.com/thread-78365-1-1.html

 

分享到:
评论
1 楼 struts_2010 2011-11-30  
好文要顶 ,只是还不知道是否可以,试试先

相关推荐

    android多种方式实现垂直滚动和水平滚动跑马灯效果

    Android提供了多种动画库,如Animation、ValueAnimator和ObjectAnimator,可以用来实现跑马灯的滚动效果。这里我们可以选择ValueAnimator,通过设置其动画时长和更新回调,不断改变文本的绘制起点,从而实现连续滚动...

    android 跑马灯图片展示+10种切换特效

    在Android应用开发中,"跑马灯图片展示"是一种常见的动态效果,通常用于广告轮播、通知滚动等场景。跑马灯效果通过不断移动图片或文字来实现视觉上的连续滚动,给用户带来新颖的交互体验。本文将详细介绍如何利用`...

    android 跑马灯效果

    `TextView`是Android中用于显示文本的基本控件,它支持多种样式和行为,其中之一就是跑马灯滚动。 1. **XML布局**: 在你的布局XML文件中,创建一个`TextView`并设置以下属性来开启跑马灯效果: ```xml ...

    Android ImageView图片循环跑马灯效果源码

    在Android开发中,实现"ImageView图片循环跑马灯效果"是一种常见的动态UI设计,它能够吸引用户的注意力并增强用户体验。跑马灯效果通常指的是图片在水平或垂直方向上连续滚动展示,给人一种动态循环的感觉,类似于...

    Android代码-安卓跑马灯大全

    MarqueeView-master可能是一个开源的Android库,专门为开发者提供多种跑马灯效果。这类库通常包含多个自定义View,每个View都实现了不同的滚动动画。它们可能提供了更丰富的API,如设置滚动速度、方向、停顿时间等...

    可以调滚动文字速度的跑马灯源码

    跑马灯的实现方式多种多样,常见的有CSS3动画、JavaScript、HTML5 Canvas等。在这个特定的源码中,我们可能会看到以下关键知识点: 1. **JavaScript基础**:跑马灯效果的实现主要依赖于JavaScript,因为它提供了...

    Android跑马灯几种实现

    在Android中,跑马灯效果可以通过多种方式实现,包括使用TextView的marquee属性、自定义View以及第三方库。下面,我们将详细讨论这些方法。 1. **TextView的marquee属性**: Android系统内置的TextView组件支持...

    RecyclerView上下自动无限滚动,跑马灯效果

    在给定的标题和描述中,我们关注的是如何将RecyclerView实现上下自动无限滚动的效果,类似于跑马灯的视觉效果。这个效果在很多应用中都可以看到,比如广告轮播、通知提示等。 首先,我们要明白这种效果的实现原理。...

    Android 跑马灯,用LinearLayout加动画实现。

    这种效果可以使用多种方法实现,但这里我们关注的是利用LinearLayout结合动画来创建跑马灯。以下是一个详细的步骤介绍: 1. **LinearLayout基础知识**: LinearLayout是Android布局管理器之一,它允许你将子视图...

    安卓Android源码——ImageView图片循环跑马灯的效果.zip

    而"安卓Android源码——ImageView图片循环跑马灯的效果"则是一个关于如何实现ImageView中动态、循环展示图片效果的示例项目。这个项目可能包含了自定义View、动画、线程控制等多方面的知识点。 1. 自定义View:为了...

    Android跑马灯

    在Android开发中,"跑马灯"是一种常见的UI效果,通常用于显示滚动的文字或图标,类似于LED显示屏的效果。本教程将深入探讨如何自定义TextView来实现这一功能,并且能够调节跑马灯的速度,即使文字长度小于一行也能...

    ImageView 图片跑马灯效果源码

    总之,要实现ImageView的跑马灯效果,开发者需要掌握Android的动画系统、视图滚动机制、数据管理和定时器应用等核心技能。通过解析提供的源码,我们可以学习到如何将这些技术巧妙地结合起来,打造出一款具有吸引力的...

    Android 跑马灯

    **Android 跑马灯**,也称为滚动文字或走马灯效果,是Android开发中常见的一种动画效果,常用于通知栏、广告展示或者界面标题的动态显示。它通过不断移动文字来模拟一种循环滚动的感觉,使用户可以阅读超出屏幕范围...

    适合初学者的UI界面,包含三种跑马灯的实现方式,多种页面跳转方式,以及事件监听

    这个资源包"适合初学者的UI界面"提供了一个绝佳的学习平台,它包含了三种不同的跑马灯实现方式、多种页面跳转方法以及事件监听的实践案例。 首先,我们来了解一下跑马灯效果。跑马灯,又称滚动字幕或走马灯,是一种...

    各种跑马灯效果(水平、垂直)

    跑马灯效果可以通过多种编程语言和技术来实现,例如在Android开发中,我们可以使用自定义View或者特定的库来创建。"AnimTextView"这个文件名可能表示这是一个专门用于动画文本显示的自定义TextView类。下面将详细...

    基于java的跑马灯程序

    在Java中,跑马灯效果可以通过多种方式实现,比如使用Thread线程来控制动画的循环滚动,或者利用Handler和Runnable对象来定时更新界面。以下将详细解释如何通过这两种方法来创建跑马灯效果。 1. **使用Thread和...

    Android 跑马灯 ,用 viewgroup + 动画实现

    在Android开发中,跑马灯效果通常用于展示滚动文本,比如通知消息或者广告标语。这种效果可以通过多种方式实现,其中一种就是使用`ViewGroup`配合动画。本篇将详细讲解如何利用`ViewGroup`和动画来创建一个自定义的...

    跑马灯自动

    同时,对于复杂的跑马灯需求,如带有图片或多种元素的组合,可能需要结合`RecyclerView`等更强大的视图组件来实现。 总的来说,跑马灯是一种动态显示文本的机制,通过HTML的`&lt;marquee&gt;`标签或Android中的自定义视图...

    Android实现跑马灯效果的方法

    为了使跑马灯效果立即启动,通常需要在`Activity`的`onCreate()`方法中调用`requestFocus()`,并确保`TextView`的父容器允许其获得焦点。 最后,需要注意的是,跑马灯效果在某些特定条件下可能不会自动启动,比如当...

    仿淘宝首页跑马灯

    9. **库的使用**: 在实际开发中,可能有现成的库如Android Carousel View或ARMarqueeView等可以帮助快速实现跑马灯效果。使用这些库可以节省开发时间,但同时也需关注库的维护状态和兼容性。 10. **测试与调试**: ...

Global site tag (gtag.js) - Google Analytics