zoukankan      html  css  js  c++  java
  • Android文字跑马灯控件(文本自动滚动控件)

    最近在开发一个应用,需要用到文本的跑马灯效果,图省事,在网上找,但老半天都找不到,后来自己写了一个,很简单,代码如下:

    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/TextViewNotic    "
         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)方法,重新进行初始化和相关参数的计算。

    http://www.blogjava.net/TiGERTiAN/archive/2010/02/13/312840.html

  • 相关阅读:
    每日一个设计模式之策略模式
    Java发送get和post请求
    sql分组取最大值
    解析xml
    jsp:include
    schema的详解2
    文法和语言
    高级语言程序简介
    Dataframe根据某一列的值获取满足条件的行的其他列的值
    Dataframe数值转为二维列表
  • 原文地址:https://www.cnblogs.com/JuneZhang/p/4177401.html
Copyright © 2011-2022 走看看