先说声 大家新年快乐哈,明天就要进入2010年了,对我来说是很意义的一年,同时也是很重要的一年。新的气象,新的工作,新的挑战。保佑自己,相信自己!不啰嗦了,切入正题。
最近在开发一个应用,需要用到文本的跑马灯效果,图省事,在网上找,但老半天都找不到,后来自己写了一个,很简单,代码如下:
 import android.content.Context;
import android.content.Context;
 import android.graphics.Canvas;
import android.graphics.Canvas;
 import android.graphics.Paint;
import android.graphics.Paint;
 import android.os.Parcel;
import android.os.Parcel;
 import android.os.Parcelable;
import android.os.Parcelable;
 import android.util.AttributeSet;
import android.util.AttributeSet;
 import android.view.Display;
import android.view.Display;
 import android.view.View;
import android.view.View;
 import android.view.WindowManager;
import android.view.WindowManager;
 import android.view.View.OnClickListener;
import android.view.View.OnClickListener;
 import android.widget.TextView;
import android.widget.TextView;


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

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

 
    

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


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


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

 /** *//**
    /** *//**
 * 初始化控件
     * 初始化控件
 */
     */
 private void initView()
    private void initView()

 
     {
{
 setOnClickListener(this);
        setOnClickListener(this);
 }
    }
 
    

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

 
     {
{
 paint = getPaint();
        paint = getPaint();
 text = getText().toString();
        text = getText().toString();
 textLength = paint.measureText(text);
        textLength = paint.measureText(text);
 viewWidth = getWidth();
        viewWidth = getWidth();
 if(viewWidth == 0)
        if(viewWidth == 0)

 
         {
{
 if(windowManager != null)
            if(windowManager != null)

 
             {
{
 Display display = windowManager.getDefaultDisplay();
                Display display = windowManager.getDefaultDisplay();
 viewWidth = display.getWidth();
                viewWidth = display.getWidth();
 }
            }
 }
        }
 step = textLength;
        step = textLength;
 temp_view_plus_text_length = viewWidth + textLength;
        temp_view_plus_text_length = viewWidth + textLength;
 temp_view_plus_two_text_length = viewWidth + textLength * 2;
        temp_view_plus_two_text_length = viewWidth + textLength * 2;
 y = getTextSize() + getPaddingTop();
        y = getTextSize() + getPaddingTop();
 }
    }
 
    
 @Override
    @Override
 public Parcelable onSaveInstanceState()
    public Parcelable onSaveInstanceState()

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

 
     {
{

 if (!(state instanceof SavedState))
        if (!(state instanceof SavedState))  {
{
 super.onRestoreInstanceState(state);
            super.onRestoreInstanceState(state);
 return;
            return;
 }
        }
 SavedState ss = (SavedState)state;
        SavedState ss = (SavedState)state;
 super.onRestoreInstanceState(ss.getSuperState());
        super.onRestoreInstanceState(ss.getSuperState());
 
        
 step = ss.step;
        step = ss.step;
 isStarting = ss.isStarting;
        isStarting = ss.isStarting;

 }
    }
 
    

 public static class SavedState extends BaseSavedState
    public static class SavedState extends BaseSavedState  {
{
 public boolean isStarting = false;
        public boolean isStarting = false;
 public float step = 0.0f;
        public float step = 0.0f;

 SavedState(Parcelable superState)
        SavedState(Parcelable superState)  {
{
 super(superState);
            super(superState);
 }
        }

 @Override
        @Override

 public void writeToParcel(Parcel out, int flags)
        public void writeToParcel(Parcel out, int flags)  {
{
 super.writeToParcel(out, flags);
            super.writeToParcel(out, flags);

 out.writeBooleanArray(new boolean[]
            out.writeBooleanArray(new boolean[] {isStarting});
{isStarting});
 out.writeFloat(step);
            out.writeFloat(step);
 }
        }


 public static final Parcelable.Creator<SavedState> CREATOR
        public static final Parcelable.Creator<SavedState> CREATOR

 = new Parcelable.Creator<SavedState>()
                = new Parcelable.Creator<SavedState>()  {
{
 
            

 public SavedState[] newArray(int size)
            public SavedState[] newArray(int size)  {
{
 return new SavedState[size];
                return new SavedState[size];
 }
            }

 @Override
            @Override

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


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


 /** *//**
    /** *//**
 * 开始滚动
     * 开始滚动
 */
     */
 public void startScroll()
    public void startScroll()

 
     {
{
 isStarting = true;
        isStarting = true;
 invalidate();
        invalidate();
 }
    }
 
    

 /** *//**
    /** *//**
 * 停止滚动
     * 停止滚动
 */
     */
 public void stopScroll()
    public void stopScroll()

 
     {
{
 isStarting = false;
        isStarting = false;
 invalidate();
        invalidate();
 }
    }
 
    

 @Override
    @Override

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

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

 }
    }

 @Override
    @Override

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

 }
}
实现了宽度的判断,文本自动滚动及开始和停止滚动等功能。
在UI xml中的配置如下:
 <cn.tigertian.ui.AutoScrollTextView android:id="@+id/TextViewNotice"
    <cn.tigertian.ui.AutoScrollTextView android:id="@+id/TextViewNotice"
 android:layout_height="30px" android:layout_width="fill_parent"
        android:layout_height="30px" android:layout_width="fill_parent"
 android:text="@string/test_notice_1" android:textColor="#000" android:inputType="text"
        android:text="@string/test_notice_1" android:textColor="#000" android:inputType="text"
 android:background="#EEE" android:textSize="20px"></cn.tigertian.ui.AutoScrollTextView>
        android:background="#EEE" android:textSize="20px"></cn.tigertian.ui.AutoScrollTextView>

在Activity中的使用方法如下:
 //启动公告滚动条
        //启动公告滚动条
 autoScrollTextView = (AutoScrollTextView)findViewById(R.id.TextViewNotice);
        autoScrollTextView = (AutoScrollTextView)findViewById(R.id.TextViewNotice);
 autoScrollTextView.init(getWindowManager());
        autoScrollTextView.init(getWindowManager());
 autoScrollTextView.startScroll();
        autoScrollTextView.startScroll();
如果想改变跑马灯的文字内容或者文字效果,则在调用完setText方法之后,需要再调用一下init(WindowManager windowManager)方法,重新进行初始化和相关参数的计算。
---------------------------------------------------------
专注移动开发
Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
	
posted on 2010-02-13 14:35 
TiGERTiAN 阅读(10722) 
评论(17)  编辑  收藏  所属分类: 
Java 、
Android