TextView文字特效设计----跑马灯、闪烁文字

本文介绍如何在Android应用中实现跑马灯效果及闪烁文字。提供了两种跑马灯实现方法,一种通过简单配置XML文件实现,另一种通过自定义View控制滚动速度。同时展示了利用Timer实现闪烁文字的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、文本实现走马灯的效果法一

package irdc.ScrollingText;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class ScrollingText extends Activity
{
  public TextView t1;
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    t1= (TextView) findViewById(R.id.t1);
    t1.setText("哈哈我的跑马灯程序接下来是歌词呵呵:沉鱼落雁,闭月羞花,美的无处藏,人在身旁,如沐春光");
    t1.setTextSize(30);
    t1.setHorizontallyScrolling(true);
    t1.setFocusable(true);

  }
}

       设置文本t1的焦点为真(意思为焦点在t1上),设置文本t1的文本显示能超过其显示区域(t1.setHorizontallyScrolling(true) 设置的这行的目的是为了不让程序自动给文本折行,使之为单行),当然这些属性你都可以在XML文件中定义。

接下来我们看看main.xml文件。

<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout
android:id="@+id/widget35"
android:layout_;fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/black"
xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/t1"
android:layout_width="100px"//此处为文本显示区域的宽度此值必须比你的文本宽度要小否则是没有效果的
android:layout_height="wrap_content"
android:text="@string/str_id"
android:textColor="@drawable/green"
android:layout_x="61px"
android:layout_y="69px"
android:scrollX="2px"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever">
</TextView>

<ViewStub 

android:layout_y="221dip" 

android:layout_;wrap_content" 

android:layout_x="103dip" 

android:id="@+id/ViewStub01" 

android:layout_height="wrap_content">

</ViewStub>
</AbsoluteLayout>

       TextView中添加了三行蓝色的字段,其中

singleLine表示TextView中文本为单行文本如果你在你的程序中设置了setHorizontallyScrolling(true)

    关键之处ellipsize="marquee" 此语句表示我们将TextView设置为了一个走马灯;

marqueeRepeatLimit="marquee_forever"  表示走马灯的滚动效果重复的次数,你可以填一个自然数。

 

二、跑马灯效果法二:

 

<TextView    

    android:layout_width="fill_parent"   

    android:layout_height="wrap_content"  

    android:focusable ="true"    

    android:singleLine="true"  

    android:ellipsize="marquee"  

    android:marqueeRepeatLimit="marquee_forever"   

    android:focusableInTouchMode="true"  

    android:scrollHorizontally="true"  

    android:textSize="24dp"  

    android:text="@string/hello"  

    android:background="@drawable/bg"  

    />  

 

 

<!--激活焦点-->  

 android:focusable="true"    

<!--单行显示-->  

android:singleLine="true"  

<!--这里设置为超出文本后滚动显示-->  

android:ellipsize="marquee"  

<!--这个是设置滚动几次,这里是无限循环-->  

    android:marqueeRepeatLimit="marquee_forever"         

<!--TouchMode模式的焦点激活-->  

android:focusableInTouchMode="true"  

 <!--横向超出后是否有横向滚动条-->  

android:scrollHorizontally="true" 

 

 

mText.setText(msgs);//设置显示内容
mText.setSpeed(msgSpeed);//设置速度
mText.setDelayed(msgDelay);//设置时间间隔
mText.startScroll();

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;
//可控制滚动速度
public class MarqueeText extends TextView implements Runnable {
private int currentScrollX=0;// 初始滚动的位置
private int firstScrollX=0;
private boolean isStop = false;
private int textWidth;
private int mWidth=0; //控件宽度
private int speed=2;
private int delayed=1000;
private int endX; //滚动到哪个位置
private boolean isFirstDraw=true; //当首次或文本改变时重置


public MarqueeText(Context context) {
super(context);

}
public MarqueeText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MarqueeText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(isFirstDraw){
getTextWidth();
firstScrollX=getScrollX(); //起始位置不一定为0,改变内容后会变,需重新赋值
currentScrollX=firstScrollX;
mWidth=this.getWidth();
endX=firstScrollX+textWidth-mWidth/2;
isFirstDraw=false;
}
}

//每次滚动几点

public void setSpeed(int sp){
speed=sp;
}

//滚动间隔时间,毫秒

public void setDelayed(int delay){
delayed=delay;
}
/**
获取文字宽度
*/
private void getTextWidth() {
Paint paint = this.getPaint();
String str = this.getText().toString();
textWidth = (int) paint.measureText(str);
}

@Override
public void run() {
//currentScrollX += 1;// 滚动速度
currentScrollX += speed;// 滚动速度,每次滚动几点
scrollTo(currentScrollX, 0);
if (isStop) {
return;
}
//从头开始
if (currentScrollX >= endX) {
//scrollTo(0, 0);
//currentScrollX = 0; //原文重置为0,发现控件所放的位置不同,初始位置不一定为0
scrollTo(firstScrollX,0);
currentScrollX=firstScrollX;
postDelayed(this,4000);
}else{
postDelayed(this, delayed);}
}

@Override
protected void onTextChanged(CharSequence text, int start, int lengthBefore,int lengthAfter) {

isStop=true; //停止滚动
this.removeCallbacks(this); //清空队列
currentScrollX=firstScrollX; //滚动到初始位置
this.scrollTo(currentScrollX, 0);
super.onTextChanged(text, start, lengthBefore, lengthAfter);
isFirstDraw=true; //需重新设置参数
isStop=false;
postDelayed(this,4000); //头部停4

}
// 开始滚动
public void startScroll() {
isStop = false;
this.removeCallbacks(this);
postDelayed(this,4000);
}
// 停止滚动
public void stopScroll() {
isStop = true;
}
// 从头开始滚动
public void startFor0() {
currentScrollX = 0;
startScroll();
}
}

 

 

 

   三、 PS:闪烁文字的制作

例一:    


private boolean change = false;

    TextView touchScreen = (TextView)findViewById(R.id.touchscreen);//获取页面textview对象

    Timer timer = new Timer();

    timer.schedule(task,1,300);  //参数分别是delay(多长时间后执行),duration(执行间隔)

    TimerTask task = new TimerTask(){   
        public void run() {   
            runOnUiThread(new Runnable(){   
            public void run() {   
       if(change){
        change = false;
        touchScreen.setTextColor(Color.TRANSPARENT); //这个是透明,=看不到文字
       }else{
        change = true;
        touchScreen.setTextColor(Color.RED);
       }   
            }});   
            }   
    };


例二、Android三种实现定时器的方法

 

 

方法一:Handler+Thread

package com.xunfang.handerDemo;  

  

import android.app.Activity;  

import android.os.Bundle;  

import android.os.Handler;  

import android.os.Message;  

import android.widget.TextView;  

  

/** 

 * handler定时器 

 *  

 * @author Smalt 

 *  

 */  

public class HanderDemoActivity extends Activity {  

    TextView tvShow;  

    private int i = 0;  

  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

        tvShow = (TextView) findViewById(R.id.tv_show);  

        new Thread(new ThreadShow()).start();  

    }  

  

    // handler类接收数据  

    Handler handler = new Handler() {  

        public void handleMessage(Message msg) {  

            if (msg.what == 1) {  

                tvShow.setText(Integer.toString(i++));  

                System.out.println("receive....");  

            }  

        };  

    };  

  

    // 线程类  

    class ThreadShow implements Runnable {  

  

        @Override  

        public void run() {  

            // TODO Auto-generated method stub  

            while (true) {  

                try {  

                    Thread.sleep(1000);  

                    Message msg = new Message();  

                    msg.what = 1;  

                    handler.sendMessage(msg);  

                    System.out.println("send...");  

                } catch (Exception e) {  

                    // TODO Auto-generated catch block  

                    e.printStackTrace();  

                    System.out.println("thread error...");  

                }  

            }  

        }  

    }  

 

 

 

方法二:Handler类自带的postDelyed

 

package com.xunfang.handerDemo;  

  

import android.app.Activity;  

import android.os.Bundle;  

import android.os.Handler;  

import android.widget.TextView;  

  

/** 

 * handler定时器使用postDelyed实现 

 *  

 * @author Smalt 

 *  

 */  

public class HanderDemoActivity extends Activity {  

    TextView tvShow;  

    private int i = 0;  

    private int TIME = 1000;  

  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

        tvShow = (TextView) findViewById(R.id.tv_show);  

        handler.postDelayed(runnable, TIME); //每隔1s执行  

    }  

  

    Handler handler = new Handler();  

    Runnable runnable = new Runnable() {  

  

        @Override  

        public void run() {  

            // handler自带方法实现定时器  

            try {  

                handler.postDelayed(this, TIME);  

                tvShow.setText(Integer.toString(i++));  

                System.out.println("do...");  

            } catch (Exception e) {  

                // TODO Auto-generated catch block  

                e.printStackTrace();  

                System.out.println("exception...");  

            }  

        }  

    };  

  

}

 

 

 

方法三:Handler+Timer+TimerTask

package com.xunfang.handerDemo;  

  

import java.util.Timer;  

import java.util.TimerTask;  

  

import android.app.Activity;  

import android.os.Bundle;  

import android.os.Handler;  

import android.os.Message;  

import android.widget.TextView;  

  

/** 

 * 定时器实现:Handler+Timer+TimerTask 

 *  

 * @author Smalt 

 *  

 */  

public class HanderDemoActivity extends Activity {  

    TextView tvShow;  

    private int i = 0;  

    private int TIME = 1000;  

  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

        tvShow = (TextView) findViewById(R.id.tv_show);  

        timer.schedule(task, 10001000); // 1s后执行task,经过1s再次执行  

    }  

  

    Handler handler = new Handler() {  

        public void handleMessage(Message msg) {  

            if (msg.what == 1) {  

                tvShow.setText(Integer.toString(i++));  

            }  

            super.handleMessage(msg);  

        };  

    };  

    Timer timer = new Timer();  

    TimerTask task = new TimerTask() {  

  

        @Override  

        public void run() {  

            // 需要做的事:发送消息  

            Message message = new Message();  

            message.what = 1;  

            handler.sendMessage(message);  

        }  

    };  

    

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值