隨筆-348  評論-598  文章-0  trackbacks-0
          先說聲 大家新年快樂哈,明天就要進入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)方法,重新進行初始化和相關參數的計算。


          ---------------------------------------------------------
          專注移動開發

          Android, Windows Mobile, iPhone, J2ME, BlackBerry, Symbian
          posted on 2010-02-13 14:35 TiGERTiAN 閱讀(10694) 評論(17)  編輯  收藏 所屬分類: JavaAndroid

          評論:
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2010-02-13 16:40 | altchen
          請問下性能如何?不斷的invalidate->onDraw  回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2010-02-13 16:42 | TiGERTiAN
          @altchen
          性能么得什么降低,跑馬燈實現都是要不斷重繪的,不可避免。  回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2010-05-18 15:40 | herbertD
          請問一下,怎么才能改變textColor? 我設置的gravity="center"也不起作用,是為什么呢? 謝謝@TiGERTiAN
            回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2010-05-18 15:41 | herbertD
          我顯示的文字顯示一直是黑色的,不知道想顯示為紅色如何寫代碼?謝謝!@herbertD
            回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2010-05-18 15:43 | TiGERTiAN
          @herbertD
          gravity="center" 這個加的沒有意義,因為是整行滾動。
          改顏色你需要把XML中該控件的配置信息中的textColor改一下,看我文章的下面xml示例  回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2010-05-19 09:23 | herbertD
          Hi, 我改了android:textColor="B11",想改為紅色,但是顏色沒有改變,我改了android:background="#EEE",為"#11B",背景變為藍色了,很奇怪,呵呵 
            回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2010-05-19 09:31 | herbertD
          p.s 我在init() 中, this.setTextColor(0xffff0000)也不起作用,謝謝!  回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2010-05-19 09:33 | TiGERTiAN
          @herbertD
          B11前面少了個#  回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2010-05-19 09:33 | TiGERTiAN
          @herbertD
          這個只是設置一下,改顏色要靠Paint  回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2010-05-19 11:27 | herbertD


          paint.setColor(0xff00bb00);

          搞定了:)

          Thanks!!  回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2010-09-16 21:40 | ixihaha
          強悍謝了  回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2011-09-18 22:57 | 羅曉雁
          在Activity中的代碼寫到哪里呢?  回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2011-10-11 21:10 | 濟南-mu
          博主你好 為什么 我在模擬器上運行,文字的滾動效果 并不均勻呢?不是 平滑的滾動!  回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2013-01-22 16:19 | 麻倉葉
          在代碼里面改 代碼里面他沒處理字體顏色,init()里面加個 paint.setColor(Color.RED); 就行了@herbertD
            回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件)[未登錄] 2014-05-14 10:04 | et
          好像會報空指針異常啊,有沒有人遇到  回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2014-08-16 10:12 | ptt
          做不成功啊  回復  更多評論
            
          # re: Android文字跑馬燈控件(文本自動滾動控件) 2015-12-08 15:31 | 學鳥
          如何讓滾動的速度快一點啊??  回復  更多評論
            
          主站蜘蛛池模板: 浙江省| 兴义市| 洛宁县| 贞丰县| 临颍县| 敖汉旗| 东宁县| 和龙市| 延庆县| 岳西县| 察哈| 蒙自县| 阳春市| 土默特左旗| 图木舒克市| 安阳市| 南澳县| 台山市| 阳春市| 西峡县| 双峰县| 广汉市| 八宿县| 丹凤县| 大荔县| 萨嘎县| 宜州市| 汶上县| 延吉市| 明星| 都江堰市| 施秉县| 瑞安市| 平安县| 上林县| 图片| 宁波市| 玉林市| 民和| 石狮市| 广汉市|