自定义TextView实现跑马灯效果(一)

2014-11-24 11:14:55 · 作者: · 浏览: 4
[java]
package c.x;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button mStartbButton;
private Button mPauseButton;
private Button mRestartbButton;
private MarqueeText mMarqueeText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init(){
mMarqueeText=(MarqueeText) findViewById(R.id.marqueeText);
mStartbButton=(Button) findViewById(R.id.start_Button);
mStartbButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mMarqueeText.startScroll();
}
});
mPauseButton=(Button) findViewById(R.id.pause_Button);
mPauseButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mMarqueeText.pauseScroll();
}
});
mRestartbButton=(Button) findViewById(R.id.restart_Button);
mRestartbButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mMarqueeText.restartScroll();
}
});
}
}
MarqueeText如下:
[java]
package c.x;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.TextView;
/**
* 需求描述:
* TextView跑马灯的实现
*
* 实现原理:
* 通过不断的scrollTo()显示View中不同坐标处的内容
*
*遇到的问题
*1 注意scrollTo(int x, int y)
* 移动View中内容,比如此处TextView中的文字.
* x the x position to scroll to
* y the y position to scroll to
*
*2 scrollTo(int x, int y)的坐标问题
* 参考资料:
* http://www.open-open.com/lib/view/open1328834050046. html
* 个人理解:
* 该坐标为View中的内容的坐标.该坐标的起始点虽然在内容的左上角
* 但是Y轴的正向是竖直向上的,X轴水平向右.
* 该理解待于进一步验证.
*
*/
public class MarqueeText extends TextView implements Runnable {
private int contentWidth=0;
private int scrollToX=0;
private boolean isStop=false;
private boolean isRun=true;
private boolean isMeasureContentWidth=false;
public MarqueeText(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (!isMeasureContentWidth) {
//获取文字长度
Paint paint=this.getPaint();
String content=this.getText().toString();
contentWidth=(int) paint.measureText(content);
isMeasureContentWidth=true;
}
}
public void run() {
if (isRun) {
if (scrollToX>=contentWidth) {
//重新开始
scrollToX=-150;
}
scrollTo(scrollToX, 0);
scrollToX=scrollToX+5;
postDelayed(this, 150);
}
}
// 点击开始,执行线程
public void startScroll() {
post(this);
}
// 点击暂停