0
点赞
收藏
分享

微信扫一扫

Android自绘跑马灯控件


Android上实现一个简单的跑马灯控件,通过点击start or stop

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;
 

 

 
public class MarqueeView extends TextView implements OnClickListener {
 
        public final static String TAG = MarqueeView.class.getSimpleName();
 
        private float textLength = 0f;        // 文本长度
 
        private float viewWidth = 0f;        //控件显示文字区域宽度
 
        private float step = 0f;                // 文字的横坐标
 
        private float y = 0f;                        // 文字的纵坐标
 
        public boolean isStarting = true;// 是否开始滚动
 
        private Paint paint = null;// 绘图样式
 
        private String text = "";// 文本内容
 
        
 
        public MarqueeView(Context context) {
 
        super(context);
 
        initView();
 
        }
 
        
 
        public MarqueeView(Context context, AttributeSet attrs) {
 
        super(context, attrs);
 
        initView();
 
        }
 
        
 
        public MarqueeView(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 = 0;
 
        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);
 
        }
 

 
        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, step, y, paint);
 
        if (!isStarting) {
 
                return;
 
        }
 
        step -= 0.8;
 
        if (step <= -textLength)
 
                step = viewWidth;
 
        invalidate();
 
        }
 
        
 
        @Override
 
        public void onClick(View v) {
 
        if (isStarting)
 
            stopScroll();
 
        else
 
            startScroll();
 
        }
 
}
 


举报

相关推荐

0 条评论