美文网首页
水平滚动的跑马灯CycleCarouselTextView

水平滚动的跑马灯CycleCarouselTextView

作者: 小相柳 | 来源:发表于2020-08-10 17:23 被阅读0次
    public class CycleCarouselTextView extends View {
    
        private final String TAG = getClass().getSimpleName();
        private Paint mPaint;
        private float mStepDistance = 0;
        private int mRate = 10;
        private int index = 0;
        private String[] mTextSrc;
        private String[] mSkipUrl;
        public static final String TEXT_K = "text_k", URL_K= "url_k";
        private int mTextColorRes = android.R.color.black;
        private float textSize = 50;
        private long mIntervalTime = 6000;  //轮播一次的时间,毫秒数, 默认6秒
        private OnSkipListener callback;
        private float yPoint;
        private int viewWidth;
        private String currentText;
        private float mStep;
        private float textL;
        private Rect mRect;
    
        private Handler reDrawHandler = new Handler(Looper.getMainLooper()){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                invalidate();
            }
        };
    
        public void setIntervalTime(long intervalTime){
            mIntervalTime = intervalTime;
        }
    
        public CycleCarouselTextView(Context context) {
            super(context);
            init();
        }
    
        private void init(){
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setColor(SkinManager.getTheme().getColor(mTextColorRes));
            mPaint.setTextSize(textSize);
            mPaint.setTypeface(Typeface.DEFAULT);
            mRect = new Rect();
        }
    
        public void setText(List<Map<String, String>> texts){
            if(texts != null){
                mTextSrc = new String[texts.size()];
                mSkipUrl = new String[texts.size()];
                for(int i=0; i<texts.size(); i++){
                    Map<String, String> map = texts.get(i);
                    if(map.containsKey(TEXT_K)){
                        mTextSrc[i] = map.get(TEXT_K);
                        if(map.containsKey(URL_K)){
                            mSkipUrl[i] = map.get(URL_K);
                        }else{
                            mSkipUrl[i] = "";
                        }
                    }
                }
            }
        }
    
        public void setTextColor(int textColor) {
            mTextColorRes = textColor;
            if(mPaint != null) mPaint.setColor(SkinManager.getTheme().getColor(mTextColorRes));
        }
        
        public void setTextSize(float textSize) {
            this.textSize = textSize;
            if(mPaint != null) mPaint.setTextSize(textSize);
        }
    
        public void setOnSkipListener(OnSkipListener callback) {
            this.callback = callback;
        }
    
        public void setmRate(int mRate) {
            this.mRate = mRate;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            if(mTextSrc == null || mTextSrc.length == 0) return;
            if(!TextUtils.equals(mTextSrc[index], currentText)){
                currentText = mTextSrc[index];
                mPaint.getTextBounds(currentText, 0, currentText.length(), mRect);
                textL = mRect.width();//文字宽
                mStep = (2 * textL + viewWidth) / (mIntervalTime / (float)mRate);
            }
            canvas.drawText(currentText, viewWidth - mStepDistance, yPoint, mPaint);
            mStepDistance += mStep;
            if(mStepDistance > textL+viewWidth){
                mStepDistance = 0;
                if(++index > mTextSrc.length-1){
                    index = 0;
                }
            }
                reDrawHandler.sendEmptyMessageDelayed(0, mRate);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if(event.getAction() == MotionEvent.ACTION_UP){
                if(this.callback != null){
                    if(mSkipUrl != null &&index < mSkipUrl.length){
                        this.callback.onSkip(mSkipUrl[index]);
                    }
                }
            }
            return true;
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            Paint.FontMetrics metrics = mPaint.getFontMetrics();
            float dy = -(metrics.descent + metrics.ascent) / 2;
            yPoint = getMeasuredHeight() / 2 + dy;
            viewWidth = getMeasuredWidth()-getPaddingLeft() - getPaddingRight();
        }
    
    
        public interface OnSkipListener {
            void onSkip(String url);
        }
    }

    相关文章

      网友评论

          本文标题:水平滚动的跑马灯CycleCarouselTextView

          本文链接:https://www.haomeiwen.com/subject/grijdktx.html