您的位置:首页 > 移动开发 > Android开发

android--TextView实现跑马灯

2013-07-23 15:46 288 查看
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();

 }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: