Android控件封装之跑马灯(二)
来源:互联网 发布:佛山发展前景 知乎 编辑:程序博客网 时间:2024/05/10 02:16
Android开发时,经常遇到标题或用户昵称比较长而显示不下的时候,我们希望通过跑马灯的效果来向用户展示全部的文字信息,但是利用android自带的TextView却有诸多不便,比如不能控制暂停、开始、不能控制速度,而且还受焦点的影响。这时开发一个自定义的跑马灯控件显得非常有必要。
话不多说,java代码如下:
package cn.emag.utils.view;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.widget.TextView;/** * 跑马灯的文本框. */public class CustomMarqueeTextView extends TextView implements Runnable {/** 当前滚动的位置 */private int currentScrollX = 0;/** 是否停止 */private boolean isStop = false;/** 文本的真实宽度 */private int textWidth;private boolean isMeasure = false;public CustomMarqueeTextView(Context context) {super(context);}public CustomMarqueeTextView(Context context, AttributeSet attrs) {super(context, attrs);}public CustomMarqueeTextView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 文字宽度只需获取一次就可以了if (!isMeasure) {getTextWidth();isMeasure = true;}}@Overridepublic void setText(CharSequence text, BufferType type) {super.setText(text, type);this.startScroll();}/** * 获取文字宽度 */private void getTextWidth() {Paint paint = this.getPaint();String str = this.getText().toString();textWidth = (int) paint.measureText(str);}private long stime = 0;@Overridepublic void run() {if (this.textWidth == 0 || this.getWidth() == 0) {postDelayed(this, 200);return;} else if (this.getWidth() >= this.textWidth) {return;} else if (isStop) {return;}if (stime == 0) {stime = System.currentTimeMillis();}double dx = (System.currentTimeMillis() - stime) * 2.0 / 20;currentScrollX = (int) dx;scrollTo(currentScrollX, 0);if (getScrollX() >= this.textWidth) {currentScrollX = 0 - this.getWidth();stime = System.currentTimeMillis() - currentScrollX * 10;scrollTo(currentScrollX, 0);}postDelayed(this, 20);}/** * 开始滚动 */public void startScroll() {isStop = false;this.removeCallbacks(this);post(this);}/** * 停止滚动 */public void stopScroll() {isStop = true;}/** * 从头开始滚动 */public void restartScroll() {currentScrollX = 0;startScroll();}}
在layout中使用的时候,配置如下:
<cn.emag.utils.view.CustomMarqueeTextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:ellipsize="marquee" android:singleLine="true" android:text="http://schemas.android.com/apk/res/android" />
- Android控件封装之跑马灯(二)
- Android控件之TextView跑马灯效果
- Android控件之跑马灯效果的TextView
- android开发自定义控件之TextView跑马灯效果
- LED跑马灯之二
- Android之垂直跑马灯
- android效果之跑马灯
- TextView控件之跑马灯效果
- TextView控件之 跑马灯效果
- Android TextView控件跑马灯效果
- Android控件TextView的跑马灯效果
- android 自定义横向文字跑马灯控件
- Android文字跑马灯控件(文本自动滚动控件)
- Android之UI学习篇二:TextVeiw显示表情和跑马灯效果
- Android开发之跑马灯效果
- Android开发之跑马灯效果
- Android开发之跑马灯效果
- android 之textview滚动,,跑马灯
- Activity使用Dialog样式导致点击空白处自动关闭的问题
- SQO2008配置管理工具服务显示远程过程调用失败
- 0 1背包问题
- UITableView学习笔记
- proxool配置
- Android控件封装之跑马灯(二)
- 设置Jsp页面编码的方法
- Error 42 error C2784:
- HashMap 中的keySet()和entrySet()方法的比较
- 光标问题
- 在iOS AudioQueue中用Speex进行编码和解码
- “1-n的最小公倍数问题”蓝桥杯
- extern"C"使用详解
- 关于PowerDesigner15不能从PDM图生成MS SQL2005/2008外键约束的问题