第一种方法(很普遍,很简单的在xml布局文件中设置TextView的属性):

<TextView
android:id="@+id/tv_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:textSize="28sp"
android:text="路漫漫其修远兮,吾将上下而求索"
android:textColor="#00ff00"
android:scrollHorizontally="true"/>

重要代码:

//设置为跑马灯显示

android:ellipsize="marquee"

//获取焦点
          android:focusable="true"

//可以通过toucth来获得focus
          android:focusableInTouchMode="true"

//设置重复的次数
          android:marqueeRepeatLimit="marquee_forever"

//单行显示文字
        android:singleLine="true"

2.第二种方法,由于大部分走马灯文字会在手机屏幕的右侧开始,这需要自定义控件来实现了

java代码:

package com.example.cameratestdemo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.TextView; /**
* 自定义控件循环走马灯的实现
*
* @author cyf 继承自TextView
*/
public class Util extends TextView implements Runnable {
private static final String TAG = "MarqueeTextView";
// 设置跑马灯重复的次数,次数
private int circleTimes = 3;
//记录已经重复了多少遍
private int hasCircled = 0;
private int currentScrollPos = 0;
// 跑马灯走一遍需要的时间(秒数)
private int circleSpeed = 10;
// 文字的宽度
private int textWidth = 0; private boolean isMeasured = false;
// Handler机制
private Handler handler;
private boolean flag = false; // 构造方法
public Util(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
this.removeCallbacks(this);
post(this);
}
/**
* 画笔工具
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas); if (!isMeasured) {
getTextWidth();
isMeasured = true;
}
} @Override
public void setVisibility(int visibility) {
// 二次进入时初始化成员变量
flag = false;
isMeasured = false;
this.hasCircled = 0;
super.setVisibility(visibility);
} @Override
public void run() {
// 起始滚动位置
currentScrollPos += 1;
scrollTo(currentScrollPos, 0);
// Log.i(TAG, "pos"+currentScrollPos);
// 判断滚动一次
if (currentScrollPos >= textWidth) {
// 从屏幕右侧开始出现
currentScrollPos = -this.getWidth();
//记录的滚动次数大设定的次数代表滚动完成,这个控件就可以隐藏了
if (hasCircled >= this.circleTimes) {
this.setVisibility(View.GONE);
flag = true;
}
hasCircled += 1;
} if (!flag) {
// 滚动时间间隔
postDelayed(this, circleSpeed);
}
} /**
* 获取文本显示长度
*/ private void getTextWidth() {
Paint paint = this.getPaint();
String str = this.getText().toString();
Log.i(TAG, str);
if (str == null) {
textWidth = 0;
}
textWidth = (int) paint.measureText(str);
} /**
* 设置滚动次数,达到次数后设置不可见
*
* @param circleTimes
*/
public void setCircleTimes(int circleTimes) {
this.circleTimes = circleTimes;
} public void setSpeed(int speed) {
this.circleSpeed = speed;
} public void startScrollShow() {
if (this.getVisibility() == View.GONE)
this.setVisibility(View.VISIBLE);
this.removeCallbacks(this);
post(this);
} private void stopScroll() {
handler.removeCallbacks(this);
}
}

布局文件中呀使用自定义控件了:

<com.example.cameratestdemo.Util
android:id="@+id/tv_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:singleLine="true"
android:text="路漫漫其修远兮,吾将上下而求索"
android:textColor="#00ff00"
android:textSize="28sp" >
</com.example.cameratestdemo.Util>

源码下载:

http://yunpan.cn/c3kL7ILLL7tCt  访问密码 bd75

欢迎提出意见,希望可以给大家带来帮助,谢谢

05-07 15:38