一、文本实现走马灯的效果法一
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, 1000, 1000); // 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);
}
};