注意:在布局文件引用本view时,paddingLeft,paddingRigh都必须为0dp,需要增加这两个属性的,大家可以自行修改代码。
android:ellipsize="marquee" android:singleLine="true" 这两个属性也要加上。
效果图:
- 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);
- }
- public MarqueeText(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
- @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() {
- currentScrollX -= 2;// 滚动速度
- scrollTo(currentScrollX, 0);
- if (isStop) {
- return;
- }
- if (getScrollX() <= -(this.getWidth())) {
- scrollTo(textWidth, 0);
- currentScrollX = textWidth;
- // return;
- }
- postDelayed(this, 5);
- }
- // 开始滚动
- public void startScroll() {
- isStop = false;
- this.removeCallbacks(this);
- post(this);
- }
- // 停止滚动
- public void stopScroll() {
- isStop = true;
- }
- // 从头开始滚动
- public void startFor0() {
- currentScrollX = 0;
- startScroll();
- }
- }
布局文件:
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <Button
- android:id="@+id/start"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="start"
- android:text="走起" />
- <Button
- android:id="@+id/stop"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="stop"
- android:text="停止" />
- <Button
- android:id="@+id/startfor0"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="startFor0"
- android:text="从头开始" />
- <simtice.demo.marqueetext.MarqueeText
- android:id="@+id/test"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:background="#339320"
- android:ellipsize="marquee"
- android:singleLine="true"
- android:text="这才是真正的文字跑马灯效果这才是真正的字跑马灯效果这才是真正的"
- android:textColor="#000000"
- android:textSize="20dp" >
- </simtice.demo.marqueetext.MarqueeText>
- </LinearLayout>
MainActivity:
- public class MainActivity extends Activity {
- private MarqueeText test;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- test = (MarqueeText) this.findViewById(R.id.test);
- }
- public void start(View v) {
- test.startScroll();
- }
- public void stop(View v) {
- test.stopScroll();
- }
- public void startFor0(View v){
- test.startFor0();
- }
- }