Android文字自滚动textview

自定义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();

	}
	

}

在xml中使用:

<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();



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值