Android文字跑马灯控件(文本自动滚动控件)

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.TextView;

/**
 * 
 * TODO 单行文本跑马灯控件
 *
 * 
@author tianlu
 * 
@version 1.0
 * Create At : 2010-2-16 下午09:35:03
 
*/

public class AutoScrollTextView extends TextView implements OnClickListener {
    
public final static String TAG = AutoScrollTextView.class.getSimpleName();
    
    
private float textLength = 0f;//文本长度
    private float viewWidth = 0f;
    
private float step = 0f;//文字的横坐标
    private float y = 0f;//文字的纵坐标
    private float temp_view_plus_text_length = 0.0f;//用于计算的临时变量
    private float temp_view_plus_two_text_length = 0.0f;//用于计算的临时变量
    public boolean isStarting = false;//是否开始滚动
    private Paint paint = null;//绘图样式
    private String text = "";//文本内容

    
    
public AutoScrollTextView(Context context) {
        
super(context);
        initView();
    }


    
public AutoScrollTextView(Context context, AttributeSet attrs) {
        
super(context, attrs);
        initView();
    }


    
public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) {
        
super(context, attrs, defStyle);
        initView();
    }

    
    
/**
     * 初始化控件
     
*/

    
private void initView()
    
{
        setOnClickListener(
this);
    }

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

    
public void init(WindowManager windowManager)
    
{
        paint 
= getPaint();
        text 
= getText().toString();
        textLength 
= paint.measureText(text);
        viewWidth 
= getWidth();
        
if(viewWidth == 0)
        
{
            
if(windowManager != null)
            
{
                Display display 
= windowManager.getDefaultDisplay();
                viewWidth 
= display.getWidth();
            }

        }

        step 
= textLength;
        temp_view_plus_text_length 
= viewWidth + textLength;
        temp_view_plus_two_text_length 
= viewWidth + textLength * 2;
        y 
= getTextSize() + getPaddingTop();
    }

    
    @Override
    
public Parcelable onSaveInstanceState()
    
{
        Parcelable superState 
= super.onSaveInstanceState();
        SavedState ss 
= new SavedState(superState);
        
        ss.step 
= step;
        ss.isStarting 
= isStarting;
        
        
return ss;
        
    }

    
    @Override
    
public void onRestoreInstanceState(Parcelable state)
    
{
        
if (!(state instanceof SavedState)) {
            
super.onRestoreInstanceState(state);
            
return;
        }

        SavedState ss 
= (SavedState)state;
        
super.onRestoreInstanceState(ss.getSuperState());
        
        step 
= ss.step;
        isStarting 
= ss.isStarting;

    }

    
    
public static class SavedState extends BaseSavedState {
        
public boolean isStarting = false;
        
public float step = 0.0f;
        SavedState(Parcelable superState) 
{
            
super(superState);
        }


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



        
public static final Parcelable.Creator<SavedState> CREATOR
                
= new Parcelable.Creator<SavedState>() {
            
            
public SavedState[] newArray(int size) {
                
return new SavedState[size];
            }


            @Override
            
public SavedState createFromParcel(Parcel in) {
                
return new SavedState(in);
            }

        }
;

        
private SavedState(Parcel in) {
            
super(in);
            
boolean[] b = null;
            in.readBooleanArray(b);
            
if(b != null && b.length > 0)
                isStarting 
= b[0];
            step 
= in.readFloat();
        }

    }


    
/**
     * 开始滚动
     
*/

    
public void startScroll()
    
{
        isStarting 
= true;
        invalidate();
    }

    
    
/**
     * 停止滚动
     
*/

    
public void stopScroll()
    
{
        isStarting 
= false;
        invalidate();
    }

    

    @Override
    
public void onDraw(Canvas canvas) {
        canvas.drawText(text, temp_view_plus_text_length 
- step, y, paint);
        
if(!isStarting)
        
{
            
return;
        }

        step 
+= 0.5;
        
if(step > temp_view_plus_two_text_length)
            step 
= textLength;
        invalidate();

    }


    @Override
    
public void onClick(View v) {
        
if(isStarting)
            stopScroll();
        
else
            startScroll();
        
    }


}

实现了宽度的判断,文本自动滚动及开始和停止滚动等功能。

在UI xml中的配置如下:

     < cn .tigertian.ui.AutoScrollTextView android:id ="@+id/TextViewNotice"
        android:layout_height
="30px"  android:layout_width ="fill_parent"
        android:text
="@string/test_notice_1"  android:textColor ="#000"  android:inputType ="text"
        android:background
="#EEE"  android:textSize ="20px" ></ cn.tigertian.ui.AutoScrollTextView >


在Activity中的使用方法如下:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值