原文地址:TextView跑马灯的两种实现作者:dylan_huang
普通的TextView可以实现跑马灯,但是只有当焦点在它上面时才有效。
如何做一个自动的跑马灯呢?第一种:继承TextView,然后重写isFocused()方法就可以了,简单!
Java代码
- import
android.content.Context; - import
android.util.AttributeSet; - import
android.widget.TextView; -
- public
class ScrollForeverTextView extends TextView { -
-
public ScrollForeverTextView(Context context) { -
super(context); -
// TODO Auto-generated constructor stub -
} -
-
public ScrollForeverTextView(Context context, AttributeSet attrs) { -
super(context, attrs); -
} -
-
public ScrollForeverTextView(Context context, AttributeSet attrs, -
int defStyle) { -
super(context, attrs, defStyle); -
} -
-
@Override -
public boolean isFocused() { -
return true; -
} -
- }
使用时同TextView一样:
Xml代码
- <com.ql.view.ScrollForeverTextView
-
android:layout_width="fill_parent" -
android:layout_height="wrap_content" -
android:textSize="30px" -
android:singleLine="true" -
android:ellipsize="marquee" -
android:marqueeRepeatLimit="marquee_forever" -
android:textColor="@color/red" -
android:text="1234567890wwwwwwwwwwwwww wwwwwwww1234567890" -
android:focusable="true" -
/>
第2种:还是继承TextView,重写onDraw(),在onDraw中不停的重绘。
Java代码
- 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; -
-
- 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 CharSequence text = "";// 文本内容 -
private float speed = 0.5f; -
private int textColor=0xFF000000; -
-
public int getTextColor() { -
return textColor; -
} -
-
public void setTextColor(int color) { -
this.textColor = color; -
} -
-
public float getSpeed() { -
return speed; -
} -
-
public void setSpeed(float speed) { -
this.speed = speed; -
} -
-
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(float width) { -
text=super.getText(); -
paint = super.getPaint(); - //
Paint paint=new Paint(); -
text = getText().toString(); -
textLength = paint.measureText(text.toString()); - //
viewWidth = getWidth(); - //
if (viewWidth == 0) { - //
if (windowManager != null) { - //
Display display = windowManager.getDefaultDisplay(); - //
viewWidth = display.getWidth(); - //
} - //
} -
viewWidth=width; -
step = textLength; -
temp_view_plus_text_length = viewWidth + textLength; -
temp_view_plus_two_text_length = viewWidth + textLength * 2; -
y = getTextSize() + getPaddingTop(); -
paint.setColor(textColor); -
} -
-
@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) { - //
super.onDraw(canvas); -
-
canvas.drawText(text,0,text.length(), temp_view_plus_text_length - step, y, paint); -
if (!isStarting) { -
return; -
} -
step += speed; -
if (step > temp_view_plus_two_text_length) -
step = textLength; -
invalidate(); -
-
} -
-
@Override -
public void onClick(View v) { -
if (isStarting) -
stopScroll(); -
else -
startScroll(); -
-
} -
- }
使用:
Java代码
- marquee
= (AutoScrollTextView) findViewById(R.id.marquee); - //
marquee.setText(String.format(getResources().getString(R.string.marquee0),Consts.termno,"2010-12-28")); -
marquee.setText("上证指数3000.15 6.81(0.37%)深圳成指3000.15 6.81(0.37%)"); - //
marquee.setTextColor(0xffff0000);//注意:颜色必须在这里设置,xml中设置无效!默认黑色。 -
//如果想改变跑马灯的文字内容或者文字效果,则在调用完setText方法之后,需要再调用一下init(width)方法,重新进行初始化和相关参数的计算。 -
marquee.setSpeed(1.5f); -
marquee.init(width);//width通常就是屏幕宽! -
marquee.startScroll();
这2种跑马灯稍微有点区别,需要掂量着使用。
第1种跑马灯不能设置速度,并且要超过一行才会滚动。
第2种跑马灯只能设置单一颜色,且需要在代码中设置,不能同时设置多种颜色。速度设的不要过大(<= 2.0f),否则停顿现象比较明显。