代码如下:

AutoScrollTextView.java

package com.cn.lhq;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 单行文本跑马灯控件 */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();}@Overridepublic Parcelable onSaveInstanceState() {Parcelable superState = super.onSaveInstanceState();SavedState ss = new SavedState(superState);ss.step = step;ss.isStarting = isStarting;return ss;}@Overridepublic 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);}@Overridepublic 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];}@Overridepublic 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();}@Overridepublic 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();}@Overridepublic void onClick(View v) {if (isStarting)stopScroll();elsestartScroll();}}

实现了宽度的判断,文本自动滚动及开始和停止滚动等功能。

在UI xml中的配置如下:

<com.cn.lhq.AutoScrollTextView android:id="@+id/TextViewNotice"android:layout_height="30px" android:layout_width="fill_parent"android:text="abcdefghijklmn" android:textColor="#000" android:inputType="text"android:background="#EEE" android:textSize="20px"/>

在Activity中的使用方法如下:

//启动公告滚动条autoScrollTextView = (AutoScrollTextView)findViewById(R.id.TextViewNotice);autoScrollTextView.init(getWindowManager());autoScrollTextView.startScroll();

如果想改变跑马灯的文字内容或者文字效果,则在调用完setText方法之后,需要再调用一下init(WindowManager windowManager)方法,重新进行初始化和相关参数的计算。

更多相关文章

  1. android之ListView和adapter配合显示图片和文字列表
  2. android 自定义文字跑马灯 支持拖拽,按住停止滚动,自定义速度
  3. 自定义ActionBar标题与菜单中的文字样式
  4. MixtureTextView 支持Android图文混排、文字环绕图片等效果
  5. Android GPS学习笔记—LMS初始化
  6. Android--自定义带提示文本的EditText组件
  7. Android动态设置edittext的hint属性显示的提示文字大小

随机推荐

  1. Lambda 表达式的 10 个示例
  2. 什么是 Java 对象分配率
  3. 一个正则式引发的血案
  4. Java 正则表达式教程及示例
  5. Tomcat 单机多实例部署
  6. 谷歌android CTS认证
  7. 20 个设计模式和软件设计面试问题
  8. 什么时候使用 CountDownLatch
  9. 数据结构--时间复杂度与空间复杂度
  10. JUnit Theories 介绍