带分类的文字淡入淡出组件

本文是写个文字淡入淡出切换内容的自定义Textview组件。继承
Textview组件。
效果图:
这里写图片描述

组件代码:

public class AlphaText extends TextView {
    private int mDuration; //文字从出现到显示消失的时间
    private int mInterval; //文字停留在中间的时长切换的间隔
    private List<ScrollTextBean> mTexts; //显示文字的数据源
    private int mY = 0; //文字的Y坐标
    private int mAlpha =0; //文字透明度
    private int mIndex = 0; //当前的数据下标
    private Paint mPaintBack; //绘制内容的画笔
    private Paint mPaintFront; //绘制前缀的画笔
    private boolean isMove = true; //文字是否变化
    private String TAG = "ADTextView";
    private boolean increase =true;

    public interface onClickLitener {
        public void onClick(String index);
    }

    private onClickLitener onClickLitener;

    public void setOnClickLitener(onClickLitener onClickLitener) {
        this.onClickLitener = onClickLitener;
    }

    public AlphaText(Context context) {
        this(context, null);
    }

    public AlphaText(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) {
            TextBean 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 (mAlpha == 0 ) {
                increase = true;
            }else if(mAlpha == 255 ){
                increase =false;
            }


//            if(mAlpha >255){
//                mAlpha =0;
//            }

            mPaintBack.setAlpha(mAlpha);
            mPaintFront.setAlpha(mAlpha);
            mY = getMeasuredHeight() / 2 - (indexBound.top + indexBound.bottom) / 2;
            canvas.drawText(back, 0, back.length(), (indexBound.right - indexBound.left) + 20, mY, mPaintBack);
            canvas.drawText(font, 0, font.length(), 10, mY, mPaintFront);

            if (mAlpha ==255) {
                isMove = false;
                Timer timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        postInvalidate();
                        isMove = true;
                    }
                }, mInterval);
            }

            if(increase){
                mAlpha += 3;
            }else {
                mAlpha -= 3;
            }

            if (mAlpha == 0) {
                mIndex++;
            }

            //循环使用数据
            if (mIndex == mTexts.size()) {
                mIndex = 0;
            }

            if (isMove) {
                postInvalidate();
            }
        }

    }
}

bean 代码:

public class TextBean {
    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.ui.view.AlphaText
                    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 TextBean("[头条]", "新闻" + i, ""));
        }
        alphaText.setmTexts(mTextList);
        alphaText.setFrontColor(getResources().getColor(R.color.orange_step));
        alphaText.setBackColor(getResources().getColor(R.color.gray_text));
        alphaText.setmDuration(7000);
        alphaText.setmInterval(3000);
        alphaText.setOnClickLitener(new AlphaText.onClickLitener() {
            @Override
            public void onClick(String index) {
                ToastUtil.show(getActivity(), "点击新闻" + index);
            }
        });
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值