隨筆-348  評(píng)論-598  文章-0  trackbacks-0
          先說聲 大家新年快樂哈,明天就要進(jìn)入2010年了,對(duì)我來說是很意義的一年,同時(shí)也是很重要的一年。新的氣象,新的工作,新的挑戰(zhàn)。保佑自己,相信自己!不啰嗦了,切入正題。

          最近在開發(fā)一個(gè)應(yīng)用,需要用到文本的跑馬燈效果,圖省事,在網(wǎng)上找,但老半天都找不到,后來自己寫了一個(gè),很簡單,代碼如下:
          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;//文字的橫坐標(biāo)
              private float y = 0f;//文字的縱坐標(biāo)
              private float temp_view_plus_text_length = 0.0f;//用于計(jì)算的臨時(shí)變量
              private float temp_view_plus_two_text_length = 0.0f;//用于計(jì)算的臨時(shí)變量
              public boolean isStarting = false;//是否開始滾動(dòng)
              private Paint paint = null;//繪圖樣式
              private String text = "";//文本內(nèi)容

              
              
          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);
              }

              
              
          /**
               * 文本初始化,每次更改文本內(nèi)容或者文本效果等之后都需要重新初始化一下
               
          */

              
          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();
                  }

              }


              
          /**
               * 開始滾動(dòng)
               
          */

              
          public void startScroll()
              
          {
                  isStarting 
          = true;
                  invalidate();
              }

              
              
          /**
               * 停止?jié)L動(dòng)
               
          */

              
          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();
                  
              }


          }

          實(shí)現(xiàn)了寬度的判斷,文本自動(dòng)滾動(dòng)及開始和停止?jié)L動(dòng)等功能。

          在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中的使用方法如下:
                  //啟動(dòng)公告滾動(dòng)條
                  autoScrollTextView = (AutoScrollTextView)findViewById(R.id.TextViewNotice);
                  autoScrollTextView.init(getWindowManager());
                  autoScrollTextView.startScroll();
          如果想改變跑馬燈的文字內(nèi)容或者文字效果,則在調(diào)用完setText方法之后,需要再調(diào)用一下init(WindowManager windowManager)方法,重新進(jìn)行初始化和相關(guān)參數(shù)的計(jì)算。


          ---------------------------------------------------------
          專注移動(dòng)開發(fā)

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

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


          paint.setColor(0xff00bb00);

          搞定了:)

          Thanks!!  回復(fù)  更多評(píng)論
            
          # re: Android文字跑馬燈控件(文本自動(dòng)滾動(dòng)控件) 2010-09-16 21:40 | ixihaha
          強(qiáng)悍謝了  回復(fù)  更多評(píng)論
            
          # re: Android文字跑馬燈控件(文本自動(dòng)滾動(dòng)控件) 2011-09-18 22:57 | 羅曉雁
          在Activity中的代碼寫到哪里呢?  回復(fù)  更多評(píng)論
            
          # re: Android文字跑馬燈控件(文本自動(dòng)滾動(dòng)控件) 2011-10-11 21:10 | 濟(jì)南-mu
          博主你好 為什么 我在模擬器上運(yùn)行,文字的滾動(dòng)效果 并不均勻呢?不是 平滑的滾動(dòng)!  回復(fù)  更多評(píng)論
            
          # re: Android文字跑馬燈控件(文本自動(dòng)滾動(dòng)控件) 2013-01-22 16:19 | 麻倉葉
          在代碼里面改 代碼里面他沒處理字體顏色,init()里面加個(gè) paint.setColor(Color.RED); 就行了@herbertD
            回復(fù)  更多評(píng)論
            
          # re: Android文字跑馬燈控件(文本自動(dòng)滾動(dòng)控件)[未登錄] 2014-05-14 10:04 | et
          好像會(huì)報(bào)空指針異常啊,有沒有人遇到  回復(fù)  更多評(píng)論
            
          # re: Android文字跑馬燈控件(文本自動(dòng)滾動(dòng)控件) 2014-08-16 10:12 | ptt
          做不成功啊  回復(fù)  更多評(píng)論
            
          # re: Android文字跑馬燈控件(文本自動(dòng)滾動(dòng)控件) 2015-12-08 15:31 | 學(xué)鳥
          如何讓滾動(dòng)的速度快一點(diǎn)啊??  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 揭西县| 桃江县| 循化| 任丘市| 乌拉特后旗| 郑州市| 广河县| 彭泽县| 广州市| 松原市| 龙海市| 西平县| 仁怀市| 阿荣旗| 高邮市| 泗水县| 汝城县| 海口市| 胶州市| 阜平县| 闻喜县| 青河县| 榆社县| 漳州市| 明星| 萨迦县| 中牟县| 清原| 阳新县| 卓资县| 海丰县| 观塘区| 沐川县| 尼勒克县| 潢川县| 白玉县| 镇康县| 奇台县| 房山区| 北安市| 乌兰察布市|