现在的位置: 首页 > 综合 > 正文

android–TextView实现跑马灯

2013年01月28日 ⁄ 综合 ⁄ 共 4625字 ⁄ 字号 评论关闭

package sweet.venst.act;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.view.View.MeasureSpec;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class AutoScrollTextView extends TextView {
 public final static String TAG = AutoScrollTextView.class.getSimpleName();
 private float textLength = 0f;// 文本长度
 private int viewWidth = 0;
 private int viewHight = 300;
 private float step = 0f;// 文字的横坐标
 private float y = 0f;// 文字的纵坐标
 private float temp_view_plus_text_length = 0.0f;// 用于计算的临时变量
 private float temp_view_plus_two_text_length = 0.0f;// 用于计算的临时变量
 public boolean isStarting = false;// 是否开始滚动
 private Paint paint = null;// 绘图样式
 private String text = "";// 文本内容

 public AutoScrollTextView(Context context)

{
  super(context);
 }
 public AutoScrollTextView(Context context, AttributeSet attrs)

 {
  super(context, attrs);
 }
 public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle)

{
  super(context, attrs, defStyle);
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

 {
  // TODO Auto-generated method stub
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  int measureWidth = measureWidth(widthMeasureSpec);
  int measureHight = measureHeight(heightMeasureSpec);
  // int measureWidth = 1024;
  // int measureHight = 300;
  viewWidth = measureWidth;
  viewHight = measureHight;
  setMeasuredDimension(viewWidth, viewHight);
 }

 

private int measureWidth(int widthMeasureSpec)

{
  int specMode = MeasureSpec.getMode(widthMeasureSpec);
  int specSize = MeasureSpec.getSize(widthMeasureSpec);
  if (specMode == MeasureSpec.UNSPECIFIED) {
   return viewWidth;
  }

 else   {
     return viewWidth;
   }
 }
 private int measureHeight(int widthMeasureSpec) {
  int specMode = MeasureSpec.getMode(widthMeasureSpec);
  int specSize = MeasureSpec.getSize(widthMeasureSpec);
  if (specMode == MeasureSpec.UNSPECIFIED) {
   return viewHight;
  } else {
   return viewHight;
  }
 }

public void setScrollText(String text)

{
  this.text = text;
  inittextLength(text);
  // invalidate();
 }
 public void init(Context cx) {
  paint = getPaint();
  paint.setTextSize(40);
  paint.setColor(Color.WHITE);
  text = getText().toString();
  textLength = paint.measureText(text);
  viewWidth = getWidth();
  if (viewWidth == 0) {
   DisplayMetrics dm = new DisplayMetrics();
   dm = cx.getApplicationContext().getResources().getDisplayMetrics();
   viewWidth = dm.widthPixels;
  }
  step = textLength;
  temp_view_plus_text_length = viewWidth + textLength;
  temp_view_plus_two_text_length = viewWidth + textLength * 2;
  y = getTextSize() + getPaddingTop();
 }
 private void inittextLength(String text) {
  textLength = paint.measureText(text);
  step = textLength;
  temp_view_plus_text_length = viewWidth + textLength;
  temp_view_plus_two_text_length = viewWidth + textLength * 2;
 }
 @Override
 public Parcelable onSaveInstanceState() {
  Parcelable superState = super.onSaveInstanceState();
  SavedState ss = new SavedState(superState);
  ss.step = step;
  ss.isStarting = isStarting;
  return ss;
 }
 @Override
 public void onRestoreInstanceState(Parcelable state) {
  if (!(state instanceof SavedState)) {
   super.onRestoreInstanceState(state);
   return;
  }
  SavedState ss = (SavedState) state;
  super.onRestoreInstanceState(ss.getSuperState());
  step = ss.step;
  isStarting = ss.isStarting;
 }
 public static class SavedState extends BaseSavedState {
  public boolean isStarting = false;
  public float step = 0.0f;
  SavedState(Parcelable superState) {
   super(superState);
  }
  @Override
  public void writeToParcel(Parcel out, int flags) {
   super.writeToParcel(out, flags);
   out.writeBooleanArray(new boolean[] { isStarting });
   out.writeFloat(step);
  }
  public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {
   public SavedState[] newArray(int size) {
    return new SavedState[size];
   }
   public SavedState createFromParcel(Parcel in) {
    return new SavedState(in);
   }
  };
  private SavedState(Parcel in) {
   super(in);
   boolean[] b = null;
   in.readBooleanArray(b);
   if (b != null && b.length > 0)
    isStarting = b[0];
   step = in.readFloat();
  }
 }
 public void startScroll() {
  isStarting = true;
  // invalidate();
 }
 public void stopScroll() {
  isStarting = false;
  // invalidate();
 }
 public void onDraw(Canvas canvas) {
  canvas.save();
  canvas.drawText(text, temp_view_plus_text_length - step, y, paint);
  if (!isStarting) {
   return;
  }
  step += 3.2;// 0.5为文字滚动速度。
  if (step > temp_view_plus_two_text_length)
   step = textLength;
  canvas.restore();
//  invalidate();
  postInvalidate();
 }

}

抱歉!评论已关闭.