遇到个棘手问题,android 自定义控件从TextView派生,怎样实现走马灯效果?用java代码实现。我是新手请各位高手
帮忙,最好能把示例代码贴上。谢谢!

解决方案 »

  1.   

    Android文字跑马灯控件(文本自动滚动控件) 
    先说声 大家新年快乐哈,明天就要进入2010年了,对我来说是很意义的一年,同时也是很重要的一年。新的气象,新的工作,新的挑战。保佑自己,相信自己!不啰嗦了,切入正题。最近在开发一个应用,需要用到文本的跑马灯效果,图省事,在网上找,但老半天都找不到,后来自己写了一个,很简单,代码如下:
     import android.content.Context;
     import android.graphics.Canvas;
     import android.graphics.Paint;
     import android.os.Parcel;
     import android.os.Parcelable;
     import android.util.AttributeSet;
     import android.view.Display;
     import android.view.View;
     import android.view.WindowManager;
     import android.view.View.OnClickListener;
     import android.widget.TextView;
     
      /**
      * 
      * TODO 单行文本跑马灯控件
      *
      * @author tianlu
      * @version 1.0
      * Create At : 2010-2-16 下午09:35:03
      */
      public class AutoScrollTextView extends TextView implements OnClickListener {
         public final static String TAG = AutoScrollTextView.class.getSimpleName();
         
         private float textLength = 0f;//文本长度
         private float viewWidth = 0f;
         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);
             initView();
         }
     
          public AutoScrollTextView(Context context, AttributeSet attrs) {
             super(context, attrs);
             initView();
         }
     
          public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) {
             super(context, attrs, defStyle);
             initView();
         }
         
          /**
          * 初始化控件
          */
         private void initView()
          {
             setOnClickListener(this);
         }
         
          /**
          * 文本初始化,每次更改文本内容或者文本效果等之后都需要重新初始化一下
          */
         public void init(WindowManager windowManager)
          {
             paint = getPaint();
             text = getText().toString();
             textLength = paint.measureText(text);
             viewWidth = getWidth();
             if(viewWidth == 0)
              {
                 if(windowManager != null)
                  {
                     Display display = windowManager.getDefaultDisplay();
                     viewWidth = display.getWidth();
                 }
             }
             step = textLength;
             temp_view_plus_text_length = viewWidth + textLength;
             temp_view_plus_two_text_length = viewWidth + textLength * 2;
             y = getTextSize() + getPaddingTop();
         }
         
         @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];
                 }
     
                 @Override
                  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();
         }
         
     
         @Override
          public void onDraw(Canvas canvas) {
             canvas.drawText(text, temp_view_plus_text_length - step, y, paint);
             if(!isStarting)
              {
                 return;
             }
             step += 0.5;
             if(step > temp_view_plus_two_text_length)
                 step = textLength;
             invalidate();
     
         }
     
         @Override
          public void onClick(View v) {
             if(isStarting)
                 stopScroll();
             else
                 startScroll();
             
         }
     
     }实现了宽度的判断,文本自动滚动及开始和停止滚动等功能。在UI xml中的配置如下:
         <cn.tigertian.ui.AutoScrollTextView android:id="@+id/TextViewNotice"
             android:layout_height="30px" android:layout_width="fill_parent"
             android:text="@string/test_notice_1" android:textColor="#000" android:inputType="text"
             android:background="#EEE" android:textSize="20px"></cn.tigertian.ui.AutoScrollTextView>
     在Activity中的使用方法如下:
             //启动公告滚动条
             autoScrollTextView = (AutoScrollTextView)findViewById(R.id.TextViewNotice);
             autoScrollTextView.init(getWindowManager());
             autoScrollTextView.startScroll();
    如果想改变跑马灯的文字内容或者文字效果,则在调用完setText方法之后,需要再调用一下init(WindowManager windowManager)方法,重新进行初始化和相关参数的计算。
      

  2.   

    你可以用一个view实现贝!染在屏幕上控件文字的移动。这里就需要一个线程!实时的刷新屏幕。不断的改变文本的坐标位置。这样就可以实现跑马灯效果了。还有就是你可以在xml中实现啊,为什么非要用java实现呢,可以去看下这篇博客http://blog.csdn.net/ch_984326013/article/details/6627280