Android开发教程循环水波纹效果

Android开发教程循环水波纹效果

水波纹大家很熟悉,声波的传递,或者打电话等待,有时都用到水波纹效果

一、思路:

自定义控件SpreadView

二、效果图:

在这里插入图片描述
看视频更直观点:

Android开发教程实战案例源码分享-循环水波纹效果

三、关键代码:
public class SpreadView extends View {

    private Paint centerPaint; //中心圆paint
    private int radius = 100; //中心圆半径 px
    private Paint spreadPaint; //扩散圆paint
    private float centerX;//圆心x
    private float centerY;//圆心y
    private int distance = 5; //每次圆递增间距 px
    private int maxRadius; //扩散波纹圆最大半径 px
    private int radiusDifference = 120; // 二个扩散圈之间距离差
    private boolean isNeedCenter = false; // 是否需要绘画中心圆
    private int delayMilliseconds = 10;//扩散延迟间隔,毫秒,越大扩散越慢
    private List<Integer> spreadRadius = new ArrayList<>();//扩散圆层级数,元素为扩散的距离
    private List<Integer> alphas = new ArrayList<>();//对应每层圆的透明度
    private int alphaReduce ; //每次透明度减少量
    private int spreadStartTransparency = 255; // 扩散波纹最开始的透明度,最大255为完全不透明

    public SpreadView(Context context) {
        this(context, null, 0);
    }
    public SpreadView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public SpreadView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SpreadView, defStyleAttr, 0);
        radius = a.getInt(R.styleable.SpreadView_spread_radius, radius);
        maxRadius = a.getInt(R.styleable.SpreadView_spread_max_radius, getScreenWidth(getContext(),false)/2);
        isNeedCenter = a.getBoolean(R.styleable.SpreadView_is_need_center, isNeedCenter);
        int centerColor = a.getColor(R.styleable.SpreadView_spread_center_color, ContextCompat.getColor(context, R.color.teal_200));
        int spreadColor = a.getColor(R.styleable.SpreadView_spread_spread_color, ContextCompat.getColor(context, R.color.white));
        distance = a.getInt(R.styleable.SpreadView_spread_distance, distance);
        spreadStartTransparency = a.getInt(R.styleable.SpreadView_spread_start_transparency, spreadStartTransparency);
        a.recycle();
        if(isNeedCenter){
            centerPaint = new Paint();
            centerPaint.setColor(centerColor);
            centerPaint.setAntiAlias(true);
        }
        alphas.add(spreadStartTransparency);
        spreadRadius.add(0);
        spreadPaint = new Paint();
        spreadPaint.setAntiAlias(true);
        spreadPaint.setAlpha(spreadStartTransparency);
        spreadPaint.setColor(spreadColor);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        //圆心位置
        centerX = w / 2;
        centerY = h / 2;
    }

    private int times = 20;
    private int currentTime = 0;
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if(alphaReduce == 0){
            int num = (maxRadius - radius)/distance;
            alphaReduce = num > 1 ? Math.max((spreadStartTransparency / (num - 1)), 1) : spreadStartTransparency;
        }
        for (int i = 0; i < spreadRadius.size(); i++) {
            int alpha = alphas.get(i);
            spreadPaint.setAlpha(alpha);
            int width = spreadRadius.get(i);
            //绘制扩散的圆
            canvas.drawCircle(centerX, centerY, radius + width, spreadPaint);
四、项目demo源码结构图:

在这里插入图片描述
有问题或者需要完整源码的私信我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

893151960

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

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

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

打赏作者

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

抵扣说明:

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

余额充值