先說聲 大家新年快樂哈,明天就要進入2010年了,對我來說是很意義的一年,同時也是很重要的一年。新的氣象,新的工作,新的挑戰。保佑自己,相信自己!不啰嗦了,切入正題。
最近在開發一個應用,需要用到文本的跑馬燈效果,圖省事,在網上找,但老半天都找不到,后來自己寫了一個,很簡單,代碼如下:
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)方法,重新進行初始化和相關參數的計算。
---------------------------------------------------------
專注移動開發
Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
posted on 2010-02-13 14:35
TiGERTiAN 閱讀(10690)
評論(17) 編輯 收藏 所屬分類:
Java 、
Android