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

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

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

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

    最近在開發(fā)一個(gè)應(yīng)用,需要用到文本的跑馬燈效果,圖省事,在網(wǎng)上找,但老半天都找不到,后來自己寫了一個(gè),很簡(jiǎn)單,代碼如下:
    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;//文本長(zhǎng)度
        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 閱讀(10690) 評(píng)論(17)  編輯  收藏 所屬分類: Java 、Android

    評(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)論
      
    主站蜘蛛池模板: 国产极品粉嫩泬免费观看 | 成年女人喷潮毛片免费播放| 久久久久成人精品免费播放动漫| 久久久国产精品福利免费| 98精品全国免费观看视频| 免费国产作爱视频网站| 在线a人片天堂免费观看高清| 国产免费av一区二区三区| 亚洲中文字幕久久精品无码喷水| 国产亚洲美女精品久久久久狼| 亚洲AV午夜福利精品一区二区| 亚洲资源在线视频| 亚洲性色AV日韩在线观看 | 一级特级女人18毛片免费视频| 好吊色永久免费视频大全| 久久免费福利视频| 免费一本色道久久一区| 亚洲五月综合缴情在线观看| 亚洲精品免费在线视频| 看亚洲a级一级毛片| 国产免费伦精品一区二区三区| 麻豆国产入口在线观看免费| 亚洲精品第一国产综合境外资源| 国产亚洲免费的视频看| 一级毛片免费不卡| 四虎影永久在线高清免费| 中文字幕无码亚洲欧洲日韩| 久青草视频97国内免费影视| 国产一级淫片免费播放电影| 亚洲最大无码中文字幕| 久久国产免费福利永久| 人人狠狠综合久久亚洲高清| 亚洲视频在线免费播放| 在线观看片免费人成视频无码| 24小时免费直播在线观看| 亚洲国色天香视频| aa毛片免费全部播放完整| 免费少妇a级毛片| 亚洲一级毛片在线播放| 精品国产福利尤物免费| 亚洲精品专区在线观看|