自定义TextView跑马灯效果实例教程

移动开发 Android
Android自带的跑马灯效果不太好控制,不能控制速度,不能即时停止和启动,而且还受焦点的影响蛋疼不已。由于项目需求需要用的可控制性高的跑马灯效果,所以自己写了一个自定义的TextView,可控制启动,停止,和速度。

注意:在布局文件引用本view时,paddingLeft,paddingRigh都必须为0dp,需要增加这两个属性的,大家可以自行修改代码。

android:ellipsize="marquee" android:singleLine="true" 这两个属性也要加上。

效果图:

  1. public class MarqueeText extends TextView implements Runnable { 
  2.         private int currentScrollX;// 当前滚动的位置 
  3.         private boolean isStop = false
  4.         private int textWidth; 
  5.         private boolean isMeasure = false
  6.   
  7.         public MarqueeText(Context context) { 
  8.                 super(context); 
  9.                 // TODO Auto-generated constructor stub 
  10.         } 
  11.   
  12.         public MarqueeText(Context context, AttributeSet attrs) { 
  13.                 super(context, attrs); 
  14.         } 
  15.   
  16.         public MarqueeText(Context context, AttributeSet attrs, int defStyle) { 
  17.                 super(context, attrs, defStyle); 
  18.         } 
  19.   
  20.         @Override 
  21.         protected void onDraw(Canvas canvas) { 
  22.                 // TODO Auto-generated method stub 
  23.                 super.onDraw(canvas); 
  24.                 if (!isMeasure) {// 文字宽度只需获取一次就可以了 
  25.                         getTextWidth(); 
  26.                         isMeasure = true
  27.                 } 
  28.         } 
  29.   
  30.         /** 
  31.          * 获取文字宽度 
  32.          */ 
  33.         private void getTextWidth() { 
  34.                 Paint paint = this.getPaint(); 
  35.                 String str = this.getText().toString(); 
  36.                 textWidth = (int) paint.measureText(str); 
  37.         } 
  38.   
  39.         @Override 
  40.         public void run() { 
  41.                 currentScrollX -= 2;// 滚动速度 
  42.                 scrollTo(currentScrollX, 0); 
  43.                 if (isStop) { 
  44.                         return
  45.                 } 
  46.                 if (getScrollX() <= -(this.getWidth())) { 
  47.                         scrollTo(textWidth, 0); 
  48.                         currentScrollX = textWidth; 
  49. //                        return; 
  50.                 } 
  51.                 postDelayed(this5); 
  52.         } 
  53.   
  54.         // 开始滚动 
  55.         public void startScroll() { 
  56.                 isStop = false
  57.                 this.removeCallbacks(this); 
  58.                 post(this); 
  59.         } 
  60.   
  61.         // 停止滚动 
  62.         public void stopScroll() { 
  63.                 isStop = true
  64.         } 
  65.   
  66.         // 从头开始滚动 
  67.         public void startFor0() { 
  68.             currentScrollX = 0
  69.             startScroll(); 
  70.         } 

布局文件:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.     xmlns:tools="http://schemas.android.com/tools" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent" 
  5.     android:orientation="vertical" > 
  6.   
  7.     <Button 
  8.         android:id="@+id/start" 
  9.         android:layout_width="wrap_content" 
  10.         android:layout_height="wrap_content" 
  11.         android:onClick="start" 
  12.         android:text="走起" /> 
  13.   
  14.     <Button 
  15.         android:id="@+id/stop" 
  16.         android:layout_width="wrap_content" 
  17.         android:layout_height="wrap_content" 
  18.         android:onClick="stop" 
  19.         android:text="停止" /> 
  20.   
  21.     <Button 
  22.         android:id="@+id/startfor0" 
  23.         android:layout_width="wrap_content" 
  24.         android:layout_height="wrap_content" 
  25.         android:onClick="startFor0" 
  26.         android:text="从头开始" /> 
  27.   
  28.     <simtice.demo.marqueetext.MarqueeText 
  29.         android:id="@+id/test" 
  30.         android:layout_width="fill_parent" 
  31.         android:layout_height="wrap_content" 
  32.         android:background="#339320" 
  33.         android:ellipsize="marquee" 
  34.         android:singleLine="true" 
  35.         android:text="这才是真正的文字跑马灯效果这才是真正的字跑马灯效果这才是真正的" 
  36.         android:textColor="#000000" 
  37.         android:textSize="20dp" > 
  38.     </simtice.demo.marqueetext.MarqueeText> 
  39.   
  40. </LinearLayout> 
MainActivity:
  1. public class MainActivity extends Activity { 
  2.         private MarqueeText test; 
  3.   
  4.         @Override 
  5.         public void onCreate(Bundle savedInstanceState) { 
  6.                 super.onCreate(savedInstanceState); 
  7.                 setContentView(R.layout.activity_main); 
  8.                 test = (MarqueeText) this.findViewById(R.id.test); 
  9.         } 
  10.   
  11.         public void start(View v) { 
  12.                 test.startScroll(); 
  13.         } 
  14.   
  15.         public void stop(View v) { 
  16.                 test.stopScroll(); 
  17.         } 
  18.         public void startFor0(View v){ 
  19.                 test.startFor0(); 
  20.         } 

 

责任编辑:徐川 来源: cnblogs
相关推荐

2015-08-07 15:45:02

swift跑马灯源码

2011-07-29 10:01:21

IOS 跑马灯

2023-11-01 08:33:45

CSS动画效果

2022-07-12 08:32:17

transition跑马灯

2009-09-18 11:44:05

Scala实例教程Kestrel

2010-09-14 16:47:23

SQL自定义函数

2010-09-14 16:59:39

SQL自定义函数

2014-08-26 11:46:46

QtAndroid实例教程

2010-09-10 14:33:32

SQL循环语句

2019-06-17 15:25:17

expandunexpandLinux

2010-08-17 11:02:45

DIV CSS实例教程

2017-11-10 11:04:29

NVIDIA TITA处理器典藏版

2011-07-25 16:03:47

XCode 编译

2013-01-04 16:17:33

Android开发图像特效图像处理

2009-09-08 14:18:35

NFS服务器

2009-08-17 17:15:48

C# 进度条效果

2011-06-20 16:03:03

Qt 控件 鼠标

2021-01-28 14:34:35

鸿蒙HarmonyOS应用开发

2009-08-05 17:03:37

C#自定义控件

2024-02-20 08:01:08

SQL注入器MyBatis数据库
点赞
收藏

51CTO技术栈公众号