Android 竖滚加横滚的跑马灯(自定义 MarqueeView )

一.效果图

没错,就是要做一个能竖屏滚动+横屏滚动的花式跑马灯。

 

二.思路

竖屏滚动首先想到的肯定是ViewFlipper,那么竖屏滚动的ViewFlipper加上自定义的横屏滚动跑马灯岂不是就大功告成。来,开始操作:

1.自定义一个横向滚动的TexHorizontalView:

具体步骤:

a.计算需要展示文字的宽度textWidth和控件的宽度viewWitdh,判断文字的宽度textWidth是否大于控件控件宽度viewWitdh,如果大于则需要滚动。

b.设置值动画同时计算应到滚动的坐标,然后根据计算出的坐标用postInvalidate进行重绘。

c.postInvalidate会调用onDraw方法,然后在onDraw中根据坐标进行drawText绘制文本。

d.当值动画完毕设置横向滚动完毕事件的回调给外部使用。

2.自定义竖屏滚动的MarqueeView:

具体步骤:

a.自定义MarqueeView继承ViewFlipper,并在MarqueeView中addView添加对应个数的TexHorizontalView。

b.开启TexHorizontalView的横向滚动;当MarqueeView中的子TexHorizontalView横向滚动完毕,在TexHorizontalView滚动完毕的回调中开启MarqueeView的竖向滚动,从而展示下一个子TexHorizontalView。

c.当MarqueeView的竖向滚动动画完毕后,在动画完毕的监听开启当前TexHorizontalView开始横滚。

 

三.代码

1.TextHorizontalView

public class TextHorizontalView extends View {
    /**
     * 文字颜色,默认黑色
     */
    private int mTextColor = Color.BLACK;
    /**
     * 文字大小
     */
    private int mTextSize = 12;
    /**
     * 文本的x坐标
     */
    private float mXLocation = 0;
    /**
     * 滚动每个字的时间
     */
    private int mScrollSpeedTime = 300;
    /**
     * 画笔
     */
    private TextPaint mPaint;
    private Rect mRect;
    /**
     * 内容
     */
    private String mContent;
    /**
     * 文字高度
     */
    private float mTextHeight;
    /**
     * 值动画,配合postInvalidate刷新界面
     */
    private ValueAnimator verticalSwitchAnimator;
    /**
     * 开启动画
     */
    private boolean startRoll;

    /**
     * 滚动完毕的监听
     */
    public interface OnTextScrollFinishListener {
        void scrollFinish();
    }

    private OnTextScrollFinishListener onTextScrollFinishListener;

    public void setOnTextScrollFinishListener(OnTextScrollFinishListener onTextScrollFinishListener) {
        this.onTextScrollFinishListener = onTextScrollFinishListener;
    }

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

    public TextHorizontalView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public TextHorizontalView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initAttrs(attrs);
        initPaint();
    }

    @SuppressLint("RestrictedApi")
    private void initAttrs(AttributeSet attrs) {
        TintTypedArray tta = TintTypedArray.obtainStyledAttributes(getContext(), attrs, R.styleable.TextHorizontalView);
        mTextColor = tta.getColor(R.styleable.TextHorizontalView_text_color, mTextColor);
        mTextSize = tta.getInt(R.styleable.TextHorizontalView_text_size, mTextSize);
        mScrollSpeedTime = tta.getInt(R.styleable.TextHorizontalView_text_scroll_speed_time, mScrollSpeedTime);
        tta.recycle();
    }

    private void initPaint() {
        mRect = new Rect();
        //初始化文本画笔
        mPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setStyle(Paint.Style.FILL);
        //文字颜色值,可以不设定
        mPaint.setColor(mTextColor);
        //文字大小
        mPaint.setTextSize(mTextSize);
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值