<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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 閱讀(10689) 評論(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 | 學鳥
    如何讓滾動的速度快一點????  回復  更多評論
      
    主站蜘蛛池模板: 久久精品国产亚洲AV无码偷窥| 日韩a在线观看免费观看| 亚洲精品视频在线看| 久久亚洲精品高潮综合色a片| 中文字幕免费在线看线人| 亚洲美女自拍视频| 777成影片免费观看| 337p日本欧洲亚洲大胆精品555588 | 精品亚洲视频在线| 免费va在线观看| 成年免费a级毛片| 国产偷国产偷亚洲清高动态图| 特黄特色的大片观看免费视频| 亚洲国产成人乱码精品女人久久久不卡| 亚洲gay片在线gv网站| 亚洲成a人无码av波多野按摩| 激情小说亚洲色图| 国产AV无码专区亚洲精品| 精品熟女少妇av免费久久| 无码区日韩特区永久免费系列 | 7777久久亚洲中文字幕蜜桃| 亚洲av产在线精品亚洲第一站 | 国产AV无码专区亚洲AV手机麻豆 | 男女男精品网站免费观看| 亚洲无线一二三四区手机| 精品无码无人网站免费视频| 亚洲一区中文字幕在线观看| 免费永久国产在线视频| 久久国产精品免费| 亚洲人成网站色7799| 亚洲熟妇无码八AV在线播放| 亚洲免费一级视频| 岛国精品一区免费视频在线观看| 亚洲欧洲综合在线| 日韩一卡2卡3卡4卡新区亚洲| 最新欧洲大片免费在线| 97在线免费视频| 特黄aa级毛片免费视频播放| 亚洲视频在线免费看| 亚洲精品国精品久久99热一| 四虎成人免费观看在线网址|