第一种方法(很普遍,很简单的在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
欢迎提出意见,希望可以给大家带来帮助,谢谢
时间: 2024-11-07 03:39:58