<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 | 學鳥
    如何讓滾動的速度快一點啊??  回復  更多評論
      
    主站蜘蛛池模板: 亚洲狠狠成人综合网| 亚洲一级毛片免观看| 97性无码区免费| 中文字幕乱码免费看电影| 国产AV日韩A∨亚洲AV电影| 亚洲福利视频一区| 伊人久久大香线蕉亚洲| 四虎永久成人免费| 好爽…又高潮了毛片免费看| 在线日本高清免费不卡| 国产成人AV片无码免费| 天堂在线免费观看| 国产免费AV片在线观看| 日本卡1卡2卡三卡免费| 日本免费污片中国特一级| 三年片免费高清版| 国产亚洲精品免费视频播放 | 国产成人综合亚洲绿色| 国产精品久久久久久亚洲小说 | 亚洲一区免费视频| 综合在线免费视频| 久久久久免费看黄A片APP| 日本成年免费网站| 最好免费观看韩国+日本| 欧洲美熟女乱又伦免费视频| 又爽又黄无遮挡高清免费视频| 亚洲国产精品人人做人人爱| 亚洲综合图色40p| 亚洲天堂一区二区三区四区| 最新国产精品亚洲| www.xxxx.com日本免费| 亚洲高清中文字幕免费| 亚洲成AV人网址| 久久久亚洲欧洲日产国码aⅴ| 91在线亚洲综合在线| 中文无码成人免费视频在线观看| 8888四色奇米在线观看免费看| 在线观看免费毛片| 久久青青草原亚洲av无码app| 国产亚洲精品国产福利在线观看| 久久成人a毛片免费观看网站|