标签:
自定义AutoScrollTextView继承至TextView,在onDraw()中设置文字的X轴偏移量加1并刷新,以实现文字从右向左移动的效果。
public class AutoScrollTextView extends TextView implements OnClickListener { private String Tag = "AutoScrollTextView"; /** 文本长度 */ 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() { paint = getPaint(); setOnClickListener(this); } public void init(WindowManager windowManager) { L.i(Tag, "init paint ===="+paint); text = getText().toString(); paint.setColor(Color.rgb(251, 163, 68)); textLength = paint.measureText(text); L.e("lg", "text ==="+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); } }; @SuppressWarnings("unused") 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 += 1;// 0.5为文字滚动速度。 if (step > temp_view_plus_two_text_length) step = textLength; invalidate(); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub if (isStarting) stopScroll(); else startScroll(); } }
<com.demo.view.AutoScrollTextView android:id="@+id/auto_textview" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:padding="5dp" />
在Java中使用:
private AutoScrollTextView auto_tv; auto_tv = (AutoScrollTextView) findViewById(R.id.auto_textview); auto_tv.setText(msg); auto_tv.init(getWindowManager()); auto_tv.startScroll();
标签:
原文地址:http://blog.csdn.net/zifeiyu12345/article/details/51352810