TextView跑马灯的两种实现

原文地址:TextView跑马灯的两种实现作者:dylan_huang

普通的TextView可以实现跑马灯,但是只有当焦点在它上面时才有效。

如何做一个自动的跑马灯呢?
第一种:继承TextView,然后重写isFocused()方法就可以了,简单!
Java代码  
  1. import android.content.Context;  
  2. import android.util.AttributeSet;  
  3. import android.widget.TextView;  
  4.   
  5. public class ScrollForeverTextView extends TextView  
  6.   
  7.     public ScrollForeverTextView(Context context)  
  8.         super(context);  
  9.         // TODO Auto-generated constructor stub  
  10.      
  11.   
  12.     public ScrollForeverTextView(Context context, AttributeSet attrs)  
  13.         super(context, attrs);  
  14.      
  15.   
  16.     public ScrollForeverTextView(Context context, AttributeSet attrs,  
  17.             int defStyle)  
  18.         super(context, attrs, defStyle);  
  19.      
  20.   
  21.     @Override  
  22.     public boolean isFocused()  
  23.         return true 
  24.      
  25.   
  26.  

使用时同TextView一样:
Xml代码  
  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. public class AutoScrollTextView extends TextView implements OnClickListener  
  15.     public final static String TAG AutoScrollTextView.class.getSimpleName();  
  16.   
  17.     private float textLength 0f;// 文本长度  
  18.     private float viewWidth 0f;  
  19.     private float step 0f;// 文字的横坐标  
  20.     private float 0f;// 文字的纵坐标  
  21.     private float temp_view_plus_text_length 0.0f;// 用于计算的临时变量  
  22.     private float temp_view_plus_two_text_length 0.0f;// 用于计算的临时变量  
  23.     public boolean isStarting false;// 是否开始滚动  
  24.     private Paint paint null;// 绘图样式  
  25.     private CharSequence text "";// 文本内容  
  26.     private float speed 0.5f;  
  27.     private int textColor=0xFF000000 
  28.       
  29.     public int getTextColor()  
  30.         return textColor;  
  31.      
  32.   
  33.     public void setTextColor(int color)  
  34.         this.textColor color;  
  35.      
  36.   
  37.     public float getSpeed()  
  38.         return speed;  
  39.      
  40.   
  41.     public void setSpeed(float speed)  
  42.         this.speed speed;  
  43.      
  44.   
  45.     public AutoScrollTextView(Context context)  
  46.         super(context);  
  47.         initView();  
  48.      
  49.   
  50.     public AutoScrollTextView(Context context, AttributeSet attrs)  
  51.         super(context, attrs);  
  52.         initView();  
  53.      
  54.   
  55.     public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle)  
  56.         super(context, attrs, defStyle);  
  57.         initView();  
  58.      
  59.   
  60.       
  61.       
  62.     private void initView()  
  63.         setOnClickListener(this);  
  64.      
  65.   
  66.       
  67.       
  68.     public void init(float width 
  69.         text=super.getText();  
  70.         paint super.getPaint();  
  71. //      Paint paint=new Paint();  
  72.         text getText().toString();  
  73.         textLength paint.measureText(text.toString());  
  74. //      viewWidth getWidth();  
  75. //      if (viewWidth == 0) {  
  76. //          if (windowManager != null) {  
  77. //              Display display windowManager.getDefaultDisplay();  
  78. //              viewWidth display.getWidth();  
  79. //          }  
  80. //      }  
  81.         viewWidth=width;  
  82.         step textLength;  
  83.         temp_view_plus_text_length viewWidth textLength;  
  84.         temp_view_plus_two_text_length viewWidth textLength 2 
  85.         getTextSize() getPaddingTop();  
  86.         paint.setColor(textColor);  
  87.      
  88.   
  89.     @Override  
  90.     public Parcelable onSaveInstanceState()  
  91.         Parcelable superState super.onSaveInstanceState();  
  92.         SavedState ss new SavedState(superState);  
  93.   
  94.         ss.step step;  
  95.         ss.isStarting isStarting;  
  96.   
  97.         return ss;  
  98.   
  99.      
  100.   
  101.     @Override  
  102.     public void onRestoreInstanceState(Parcelable state)  
  103.         if (!(state instanceof SavedState))  
  104.             super.onRestoreInstanceState(state);  
  105.             return 
  106.          
  107.         SavedState ss (SavedState) state;  
  108.         super.onRestoreInstanceState(ss.getSuperState());  
  109.   
  110.         step ss.step;  
  111.         isStarting ss.isStarting;  
  112.   
  113.      
  114.   
  115.     public static class SavedState extends BaseSavedState  
  116.         public boolean isStarting false 
  117.         public float step 0.0f;  
  118.   
  119.         SavedState(Parcelable superState)  
  120.             super(superState);  
  121.          
  122.   
  123.         @Override  
  124.         public void writeToParcel(Parcel out, int flags)  
  125.             super.writeToParcel(out, flags);  
  126.             out.writeBooleanArray(new boolean[] isStarting });  
  127.             out.writeFloat(step);  
  128.          
  129.   
  130.         public static final Parcelable.Creator<SavedState> CREATOR new Parcelable.Creator<SavedState>()  
  131.   
  132.             public SavedState[] newArray(int size)  
  133.                 return new SavedState[size];  
  134.              
  135.   
  136.             @Override  
  137.             public SavedState createFromParcel(Parcel in)  
  138.                 return new SavedState(in);  
  139.              
  140.         };  
  141.   
  142.         private SavedState(Parcel in)  
  143.             super(in);  
  144.             boolean[] null 
  145.             in.readBooleanArray(b);  
  146.             if (b != null && b.length 0 
  147.                 isStarting b[0];  
  148.             step in.readFloat();  
  149.          
  150.      
  151.   
  152.       
  153.       
  154.     public void startScroll()  
  155.         isStarting true 
  156.         invalidate();  
  157.      
  158.   
  159.       
  160.       
  161.     public void stopScroll()  
  162.         isStarting false 
  163.         invalidate();  
  164.      
  165.   
  166.     @Override  
  167.     public void onDraw(Canvas canvas)  
  168. //      super.onDraw(canvas);  
  169.           
  170.         canvas.drawText(text,0,text.length(), temp_view_plus_text_length step, y, paint);  
  171.         if (!isStarting)  
  172.             return 
  173.          
  174.         step += speed;  
  175.         if (step temp_view_plus_two_text_length)  
  176.             step textLength;  
  177.         invalidate();  
  178.   
  179.      
  180.   
  181.     @Override  
  182.     public void onClick(View v)  
  183.         if (isStarting)  
  184.             stopScroll();  
  185.         else  
  186.             startScroll();  
  187.   
  188.      
  189.   
  190.  

使用:
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();  

这2种跑马灯稍微有点区别,需要掂量着使用。
第1种跑马灯不能设置速度,并且要超过一行才会滚动。
第2种跑马灯只能设置单一颜色,且需要在代码中设置,不能同时设置多种颜色。速度设的不要过大(<= 2.0f),否则停顿现象比较明显。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值