`

2种不同形式的跑马灯的实现

阅读更多
普通的TextView可以实现跑马灯,但是只有当焦点在它上面时才有效。
如何做一个自动的跑马灯呢?
第一种:继承TextView,然后重写isFocused()方法就可以了,简单!
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
/**
 * 单行文本跑马灯控件
 * @author admin
 *
 */
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一样:
<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="1234567890wwwwwwwwwwwwwwwwwwwwww1234567890"
		android:focusable="true"
	/>


第2种:还是继承TextView,重写onDraw(),在onDraw中不停的重绘。
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;

/**
 * 单行文本跑马灯控件
 * @author admin
 *
 */
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/*WindowManager windowManager*/) {
		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();

	}

}

使用:
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),否则停顿现象比较明显。
想知道同时设置多种颜色?
http://gundumw100.iteye.com/admin/blogs/904107
分享到:
评论

相关推荐

    自定义View实现炫酷跑马灯效果

    为优化界面,通过自定义View实现炫酷跑马灯效果,图片的优化,有三种形式实现(自定义实现最炫酷)

    虚拟仪器跑马灯

    通过LabVIEW虚拟仪器编程软件,以布尔灯的形式实现跑马灯的连续闪烁,闪烁间隔可以自行调节。

    Android基于TextView不获取焦点实现跑马灯效果

    主要介绍了Android基于TextView不获取焦点实现跑马灯效果,结合实例形式分析了Android基于TextView实现跑马灯的功能与布局相关技巧,需要的朋友可以参考下

    jQuery实现适用于移动端的跑马灯抽奖特效示例

    主要介绍了jQuery实现适用于移动端的跑马灯抽奖特效,结合实例形式分析了jQuery结合时间函数动态操作页面元素实现的跑马灯抽奖功能相关操作技巧,需要的朋友可以参考下

    PROTEUS--跑马灯--单片机课程设计.doc

    PB口与8个LED灯逆序连接,通过按键控制可以选择不同的运行模式,实现 多种跑马灯的运行模式。 硬件原理框图 电路图 接口芯片简介 (1)AT89C52 AT89C52是51系列单片机的一个型号,它是ATMEL公司生产的。 AT89C52是一个...

    基于Marquee.js插件实现的跑马灯效果示例

    主要介绍了基于Marquee.js插件实现的跑马灯效果,结合实例形式给出了Marquee.js插件的定义及具体使用方法,需要的朋友可以参考下

    PROTEUS--跑马灯--单片机课程设计(1).doc

    PB口与8个LED灯逆序连接,通过按键控制可以选择不同的运行模式,实现 多种跑马灯的运行模式。 硬件原理框图 电路图 接口芯片简介 (1)AT89C52 AT89C52是51系列单片机的一个型号,它是ATMEL公司生产的。 AT89C52是一个...

    Android基于TextView实现的跑马灯效果实例

    主要介绍了Android基于TextView实现的跑马灯效果,以完整实例形式分析了Android使用TextView通过属性设置及功能代码实现跑马灯效果的相关技巧,需要的朋友可以参考下

    一款展示随机红包金额的安卓app使用说明书

    通过随机选择的跑马灯实现随机展示红包金额的软件app,用户点击开始游戏后并再次点击停止游戏后跑马灯将停留在某一实际展示面额上,有提示框展示具体详情,可以通过自主控制跑马灯序列的可选中形式、跑马灯序列的...

    jQuery实现图片走马灯效果的原理分析

    主要介绍了jQuery实现图片走马灯效果的原理,结合实例形式较为详细的分析了jQuery实现走马灯的相关html页面设计、css样式布局与jQuery相关函数的使用,需要的朋友可以参考下

    嵌入式C实战项目开发技巧:对一个有规律的数组表进行位移操作的方法

    在嵌入式项目开发中,LED灯的操作是一定要会的,也是基础中的基础,比如用51单片机写个跑马灯,这不简单嘛,定义一个数组把那8个跑马灯存起来,然后搞个for循环不就可以了嘛,但是,实际工作开发中写一个跑马灯可不...

    web开发常用js库(效果库、架构库)

    13.图表等比例-使图片始终保持设定比例缩放等供3种不同形式; 14.回到顶部-点击回到浏览器顶部; 15.漂浮窗-小漂浮窗广告; 16.图集展示-偶尔能用到; 17.滚屏效果-手指上下滑动或鼠标滚轮滚动切换页面,可自己配...

    JS基于面向对象实现的选项卡效果示例

    主要介绍了JS基于面向对象实现的选项卡效果,结合实例形式分析了javascript基于面向对象技术动态操作页面元素的流程与相关注意事项,需要的朋友可以参考下

    自定义电子站牌View

    2:对于文字较长的站点,以一跑马灯的形式显示; 3:有对应接口,可以实时显示车辆位置; 4:如果要滑动,可以结合Scroll(垂直滑动)或者HorizontalScrollView(水平滑动)或者Scroll+ HorizontalScrollView(上下左右...

    java源码包2

     Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式  //给客户发一个感谢消息,消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener  在...

    android开发demo集合

    44、ImageSwitcher animation gesture实现可以滑动的跑马灯 45、下载状态栏显示下载进度 46、Gallery3d效果 47、ListView 上拉加载更多效果 48、异步加载图片的二级缓存技术 49、QQ的好友列表展示效果 50、...

    android初学者入门项目

    44、ImageSwitcher animation gesture实现可以滑动的跑马灯 45、下载状态栏显示下载进度 46、Gallery3d效果 47、ListView 上拉加载更多效果 48、异步加载图片的二级缓存技术 49、QQ的好友列表展示效果 50、...

    java源码包---java 源码 大量 实例

     Message-Driven Bean EJB实例源代码,演示一个接收购物订单的消息驱动Bean,处理这个订单同时通过e-mail的形式  //给客户发一个感谢消息,消息驱动Bean必须实现两个接口MessageDrivenBean和MessageListener  在...

    PIC单片机常用模块与典型实例 代码及模拟文件

    S051: 跑马灯程序 S052: 四位数码管动态扫描程序,主频为4MHz S053: 四位数码管动态扫描主程序,采用模块化编程 S054: 记录按钮按下次数并显示在四位数码管上 S055: 三按键读取程序,控制四位数码管内容变化 S056: 4...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    javascript字符串操作以及跑马灯实例 javascript数组和字典以及for循环 javascript条件语句 javascript函数的定义 Dom直接选择器 Dom间接选择器 示例之模态对话框 示例之全选和反选以及取消 javascript必须加分号 ...

Global site tag (gtag.js) - Google Analytics