美文网首页
水平滚动的跑马灯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