垂直文字 带类别的滚动(垂直文字轮播)

来源:互联网 发布:滴滴java面试难吗 编辑:程序博客网 时间:2024/06/05 03:58

自定义个文字的垂直方向轮滚的组件。
这里写图片描述

组件代码:

public class VerticalScrollText  extends TextView {    private int mDuration; //文字从出现到显示消失的时间    private int mInterval; //文字停留在中间的时长切换的间隔    private List<ScrollTextBean> mTexts; //显示文字的数据源    private int mY = 0; //文字的Y坐标    private int mIndex = 0; //当前的数据下标    private Paint mPaintBack; //绘制内容的画笔    private Paint mPaintFront; //绘制前缀的画笔    private boolean isMove = true; //文字是否移动    private String TAG = "ADTextView";    private boolean hasInit = false;    public interface onClickLitener {        public void onClick(String index);    }    private onClickLitener onClickLitener;    public void setOnClickLitener(VerticalScrollText.onClickLitener onClickLitener) {        this.onClickLitener = onClickLitener;    }    public VerticalScrollText(Context context) {        this(context, null);    }    public VerticalScrollText(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    @Override    public boolean onTouchEvent(MotionEvent event) {        int action = event.getAction();        switch (action) {            case MotionEvent.ACTION_DOWN:                if (onClickLitener != null) {                    onClickLitener.onClick(mIndex+"");                }                break;        }        return true;    }    //设置数据源    public void setmTexts(List mTexts) {        this.mTexts = mTexts;    }    //设置广告文字的停顿时间    public void setmInterval(int mInterval) {        this.mInterval = mInterval;    }    //设置文字从出现到消失的时长    public void setmDuration(int mDuration) {        this.mDuration = mDuration;    }    //设置前缀的文字颜色    public void setFrontColor(int mFrontColor) {        mPaintFront.setColor(mFrontColor);    }    //设置正文内容的颜色    public void setBackColor(int mBackColor) {        mPaintBack.setColor(mBackColor);    }    //初始化默认值    private void init() {        mDuration = 500;        mInterval = 1000;        mIndex = 0;        mPaintFront = new Paint();        mPaintFront.setAntiAlias(true);        mPaintFront.setDither(true);        mPaintFront.setTextSize(30);        mPaintBack = new Paint();        mPaintBack.setAntiAlias(true);        mPaintBack.setDither(true);        mPaintBack.setTextSize(30);    }    @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(w, h, oldw, oldh);        Log.i(TAG, "onSizeChanged: " + h);    }    @Override    protected void onDraw(Canvas canvas) {        if (mTexts != null) {           // Log.i(TAG, "onDraw:Y " + mY);            ScrollTextBean model = mTexts.get(mIndex);            String font = model.getmFront();            String back = model.getmBack();            //绘制前缀            Rect indexBound = new Rect();            mPaintFront.getTextBounds(font, 0, font.length(), indexBound);            //绘制内容文字            Rect contentBound = new Rect();            mPaintBack.getTextBounds(back, 0, back.length(), contentBound);            if (mY == 0 && hasInit == false) {                mY = getMeasuredHeight() - indexBound.top;    //rect原点 向上是负数,向下是正数                hasInit = true;            }            //移动到最上面            if (mY == 0 - indexBound.bottom) {            //    Log.i(TAG, "onDraw:H " + getMeasuredHeight());                mY = getMeasuredHeight() - indexBound.top;                mIndex++;            }            canvas.drawText(back, 0, back.length(), (indexBound.right - indexBound.left) + 20, mY, mPaintBack);            canvas.drawText(font, 0, font.length(), 10, mY, mPaintFront);     //第四象限向下加,向右加            //移动到中间            if (mY == getMeasuredHeight() / 2 - (indexBound.top + indexBound.bottom) / 2) {                isMove = false;                Timer timer = new Timer();                timer.schedule(new TimerTask() {                    @Override                    public void run() {                        postInvalidate();                        isMove = true;                    }                }, mInterval);            }            mY -= 1;            //循环使用数据            if (mIndex == mTexts.size()) {                mIndex = 0;            }            //如果是处于移动状态时的,则延迟绘制            //计算公式为一个比例,一个时间间隔移动组件高度,则多少毫秒来移动1像素            if (isMove) {                postInvalidateDelayed(mDuration / getMeasuredHeight());            }        }    }}

bean 代码

public class ScrollTextBean {    private String mFront ; //前面的文字    private String mBack ; //后面的文字    private String mUrl ;//包含的链接    public ScrollTextBean(String mFront, String mBack,String mUrl) {        this.mFront = mFront;        this.mBack = mBack;        this.mUrl = mUrl;    }    public String getmUrl() {        return mUrl;    }    public void setmUrl(String mUrl) {        this.mUrl = mUrl;    }    public String getmFront() {        return mFront;    }    public void setmFront(String mFront) {        this.mFront = mFront;    }    public String getmBack() {        return mBack;    }    public void setmBack(String mBack) {        this.mBack = mBack;    }}

在XMl文件中调用

<com.xxx.xxxx.view.VerticalScrollText                    android:id="@+id/text_scroll"                    android:layout_width="match_parent"                    android:layout_height="match_parent"                    android:gravity="center"/>

在activity中设置:

 ////////初始化上下的文字轮播        for (int i = 0; i < 5; i++) {            mTextList.add(new ScrollTextBean("[头条]", "新闻" + i, ""));        }        scrollText.setmTexts(mTextList);        scrollText.setFrontColor(getResources().getColor(R.color.orange_step));        scrollText.setBackColor(getResources().getColor(R.color.gray_text));        scrollText.setmDuration(500);        scrollText.setmInterval(300);        scrollText.setOnClickLitener(new VerticalScrollText.onClickLitener() {            @Override            public void onClick(String index) {                ToastUtil.show(getActivity(), "点击新闻" + index);            }        });
0 0
原创粉丝点击