Android之广告自动翻滚


前言

广告翻滚特效很多APP都已存在,百度一看一大堆,但是总是有些问题,今天我就记录一下,需要的自取。

一、效果图

在这里插入图片描述

二、使用步骤

1.自定义ENoticeView类

代码如下(示例):

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;

import com.hzwl.aidigital.javabean.Notice;

import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
/**
 * @Author : CaoLiulang
 * @Time : 2025/5/8 11:18
 * @Description :
 */
public class ENoticeView extends View {
    private String TAG = "Blin ENoticeView";
    private List<Notice> data; //显示文字的数据源
    private int mIndex = 0; //当前的数据下标
    private int mDuration = 400; //文字从出现到显示消失的时间
    private int mInterval = 3000; //文字停留在中间的时长切换的间隔
    private boolean isMove = false; //文字是否移动
    private boolean isStart = false; //是否开始
    private int mY = 0; //文字的初始Y坐标
    private int nY = 0; //文字的Y坐标
    private Paint textPaint;
    private final int TEXT_COLOR = 0xff333333;
    private final int TEXT_SIZE = 12;
    private Rect mRect;
    private TimerTask timerTask;

    public ENoticeView(Context context) {
        super(context);
        init();
    }

    public ENoticeView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public ENoticeView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    private void init(){
        textPaint = new Paint();
        textPaint.setAntiAlias(true);
        textPaint.setDither(true);
        textPaint.setColor(TEXT_COLOR);
        DisplayMetrics metrics =  new DisplayMetrics();
        metrics.setToDefaults();
        textPaint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,TEXT_SIZE,metrics));
    }

    @Override
    protected void onDraw(final Canvas canvas) {
        if(data != null){
            if(mY == 0&&!isMove){
                mRect = new Rect(20, 20, getMeasuredWidth()-20, getMeasuredHeight()-20);
                Paint.FontMetricsInt fontMetrics = textPaint.getFontMetricsInt();
                mY = (mRect.bottom + mRect.top - fontMetrics.bottom - fontMetrics.top) / 2;
                nY = mY;
            }
            Notice item = data.get(mIndex);
            String text = item.title;
            canvas.drawText(text,mRect.left, nY, textPaint);
            if(!isStart){
                isStart = true;
                Timer timer = new Timer();
                countingDown = mInterval+mDuration;
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        countingDown -=20;
                        if(countingDown<=0) {
                            countingDown = mInterval + mDuration;
                            isMove = true;
                        }
                        if(countingDown<=mInterval-40&&countingDown>0){
                            isMove = false;
                            drawTextStill();
                        }
                        if(isMove) {
                            drawTextMove();
                        }
                    }
                },mInterval,20);
            }
        }
    }
    private long countingDown = 0;

    private void drawTextStill(){
        nY = mY;
        postInvalidate();
    }
    private void drawTextMove(){
        nY -=  getMeasuredHeight()/(mDuration/20);
        if(nY<0){
            mIndex++;
            if(mIndex == data.size())
                mIndex = 0;
            nY = getMeasuredHeight();
        }
        postInvalidate();
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                if (onClickListener != null) {
                    onClickListener.onClick(data.get(mIndex));
                }
                break;
        }
        return true;
    }
    public interface OnNoticeClickListener {
        public void onClick(Notice item);
    }

    private OnNoticeClickListener onClickListener;

    public void setOnNoticeClickListener(OnNoticeClickListener onClickListener) {
        this.onClickListener = onClickListener;
    }
    /**
     * 设置数据源
     * */
    public void setData(List<Notice> data) {
        this.data = data;
        invalidate();
    }
    /**
     * 设置数据源,并且重置
     * */
    public void setData(List<Notice> data,boolean isReStart) {
        this.data = data;
        if (isReStart)
            mIndex = 0;
        invalidate();
    }

    /**
     * 设置广告文字的停顿时间
     * */
    public void setIntervalTime(int mInterval) {
        this.mInterval = mInterval;
    }

    /**
     * 设置文字从出现到消失的时长
     * */
    public void setDurationTime(int mDuration) {
        this.mDuration = mDuration;
    }

    /**
     * 设置文字颜色
     * */
    public void setNoticeColor(int mFrontColor) {
        textPaint.setColor(mFrontColor);
    }
}

2.xml引用

代码如下(示例):

 			<com.hzwl.aidigital.utils.ENoticeView
                android:id="@+id/notices"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="70dp"
                android:layout_marginRight="50dp"
                android:textColor="#fffa5151"
                android:textSize="14dp" />

3.activity代码

//实例化
    private lateinit var notices: ENoticeView
    private lateinit var list: MutableList<Notice>
     list = mutableListOf()
     notices = rootView!!.findViewById(R.id.notices)
      for (i in 1..5) {
            var item = Notice()
            item.title = "微信提现功能上线通知$i"
            list.add(item)
        }
        notices.setData(list)
        notices.setOnNoticeClickListener(object : OnNoticeClickListener {
            override fun onClick(item: Notice?) {
              //点击事件
            }
        })

该处使用的url网络请求的数据。


总结

到此结束,简单得如喝水,需要的自取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶已初秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值