本文实现了android系统自带的跑马灯效果(marquee)与自定义的跑马灯效果的对比。
1.在系统自带的跑马灯中,xml布局文件必须配置的属性有以下几个:
(1)android:clickable="true"
*(2)android:ellipsize="marquee"
*(3)android:focusable="true"
*(4)android:focusableInTouchMode="true"
*(5)android:singleLine="true"
这是我写的(系统自带)xml布局文件
<TextView
android:id="@+id/textview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:singleLine="true"
android:text="跑马灯效果 跑马灯效果 跑马灯效果 跑马灯效果 跑马灯效果 跑马灯效果 跑马灯效果 跑马灯效果" />
2.自定义的跑马灯
MarqueeText类中继承了TextView,在这个类中实现跑马灯效果
(1)MarqueeText类
public class MarqueeText extends TextView implements Runnable{
private int currentScrollX;// 当前滚动的位置
private boolean isStop = false;
private int textWidth;
private boolean isMeasure = false;
public MarqueeText(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public MarqueeText(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public MarqueeText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
if(!isMeasure){// 文字宽度只需要获取一次就够了
getTextWidth();
isMeasure = true;
}
}
/**
* 获取文字的宽度
*/
private void getTextWidth(){
Paint paint = this.getPaint();
String str = this.getText().toString();
textWidth = (int)paint.measureText(str);
}
@Override
public void run() {
// TODO Auto-generated method stub
currentScrollX += 2;// 滚动速度
scrollTo(currentScrollX, 0);
if(isStop)
return;
if(currentScrollX >= textWidth){
currentScrollX = -(this.getWidth());
}
postDelayed(this, 5);
}
/**
* 开始滚动
*/
public void startScroll() {
// TODO Auto-generated method stub
isStop = false;
this.removeCallbacks(this);
post(this);
}
/**
* 停止滚动
*/
public void stopScroll() {
// TODO Auto-generated method stub
isStop = true;
}
/**
* 从头开始滚动
*/
public void restartScroll() {
// TODO Auto-generated method stub
currentScrollX = 0;
startScroll();
}
}
(2)MarqueeDemo类
public class MarqueeDemo extends Activity implements OnClickListener {
private Button btn_start, btn_stop, btn_restart;
private MarqueeText text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn_start = (Button) findViewById(R.id.btn_start);
btn_stop = (Button) findViewById(R.id.btn_stop);
btn_restart = (Button) findViewById(R.id.btn_restart);
btn_start.setOnClickListener(this);
btn_stop.setOnClickListener(this);
btn_restart.setOnClickListener(this);
text = (MarqueeText) findViewById(R.id.text);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.btn_start:
text.startScroll();
break;
case R.id.btn_stop:
text.stopScroll();
break;
case R.id.btn_restart:
text.restartScroll();
break;
}
}
}