千家信息网

Android如何实现水波纹效果

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要为大家展示了"Android如何实现水波纹效果",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Android如何实现水波纹效果"这篇文章吧。效果
千家信息网最后更新 2026年11月02日Android如何实现水波纹效果

这篇文章主要为大家展示了"Android如何实现水波纹效果",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"Android如何实现水波纹效果"这篇文章吧。

效果图

attrs.xml

自定义属性

                                                                                             

RippleAnimationView.java

管理水波纹属性以及动画状态

public class RippleAnimationView extends RelativeLayout {    private Paint paint;    private int radius;    private int strokeWidth;    private int rippleColor;    private AnimatorSet animatorSet;    public RippleAnimationView(Context context) {        this(context, null);    }    public RippleAnimationView(Context context, @Nullable AttributeSet attrs) {        this(context, attrs, 0);    }    public RippleAnimationView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init(context, attrs);    }    private void init(Context context, AttributeSet attrs) {        paint = new Paint();        paint.setAntiAlias(true);        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.RippleAnimationView);        // 水波纹填充类型        int rippleType = array.getInt(R.styleable.RippleAnimationView_ripple_anim_type, 0);        radius = array.getInteger(R.styleable.RippleAnimationView_radius, 54);        strokeWidth = array.getInteger(R.styleable.RippleAnimationView_stroeWidth, 2);        rippleColor = array.getColor(R.styleable.RippleAnimationView_ripple_anim_color, ContextCompat.getColor(context,                R.color.colorAccent));        array.recycle();        // 设置画笔线宽        paint.setStrokeWidth(UIUtils.getInstance().getWidth(strokeWidth));        if (rippleType == 0) {            paint.setStyle(Paint.Style.FILL);        } else {            paint.setStyle(Paint.Style.STROKE);        }        paint.setColor(rippleColor);        LayoutParams params = new LayoutParams(                UIUtils.getInstance().getWidth(radius + strokeWidth),                UIUtils.getInstance().getWidth(radius + strokeWidth));        params.addRule(CENTER_IN_PARENT, TRUE);        // 缩放系数        float maxScale =   UIUtils.getInstance().displayMetricsWidth / (2 * UIUtils.getInstance().getWidth(                radius + strokeWidth        ));        // 延迟时间        int rippleDuration = 3500;        int singleDelay = rippleDuration / 4; // 时间间隔        // 动画集合        List animatorList = new ArrayList<>();        // 实例化水波纹view        for (int i = 0;i<4;i++){            RippleCircleView rippleCircleView = new RippleCircleView(this);            addView(rippleCircleView,params);            // 添加水波纹到集合            viewList.add(rippleCircleView);            // 初始化属性动画            // x            ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(rippleCircleView,"ScaleX",                    1.0f,maxScale);            scaleXAnimator.setRepeatCount(ObjectAnimator.INFINITE);// 无限循环            scaleXAnimator.setRepeatMode(ObjectAnimator.RESTART);            scaleXAnimator.setStartDelay(i*singleDelay);            scaleXAnimator.setDuration(rippleDuration);            animatorList.add(scaleXAnimator);            // y            ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(rippleCircleView,"ScaleY",                    1.0f,maxScale);            scaleYAnimator.setRepeatCount(ObjectAnimator.INFINITE);// 无限循环            scaleYAnimator.setRepeatMode(ObjectAnimator.RESTART);            scaleYAnimator.setStartDelay(i*singleDelay);            scaleYAnimator.setDuration(rippleDuration);            animatorList.add(scaleYAnimator);            // alpha            ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(rippleCircleView,"Alpha",                    1.0f,0f);            alphaAnimator.setRepeatCount(ObjectAnimator.INFINITE);// 无限循环            alphaAnimator.setRepeatMode(ObjectAnimator.RESTART);            alphaAnimator.setStartDelay(i*singleDelay);            alphaAnimator.setDuration(rippleDuration);            animatorList.add(alphaAnimator);        }        animatorSet = new AnimatorSet();        animatorSet.setInterpolator(new AccelerateDecelerateInterpolator()); // 差值器:先加速,后减速        animatorSet.playTogether(animatorList);    }    private boolean animationRunning;    private List viewList = new ArrayList<>();    /**     * 开启动画     */    public void startRippleAnimation(){        if (!animationRunning){            for (RippleCircleView  rippleCircleView: viewList) {                rippleCircleView.setVisibility(VISIBLE);            }            animatorSet.start();            animationRunning = true;        }    }    /**     *  结束动画     */    public void stopRippleAnimation(){        if (animationRunning){            // 逆序播放(从外向内播放动画)            Collections.reverse(viewList);            for (RippleCircleView  rippleCircleView: viewList) {                rippleCircleView.setVisibility(INVISIBLE);            }            animatorSet.end();            animationRunning = false;        }    }    public int getStrokeWidth() {        return strokeWidth;    }    public Paint getPaint() {        return paint;    }    public boolean isAnimationRunning() {        return animationRunning;    }}

RippleCircleView.java

绘制水波纹

public class RippleCircleView extends View {    private RippleAnimationView rippleAnimationView;    public RippleCircleView(RippleAnimationView rippleAnimationView) {        this(rippleAnimationView.getContext(),null);        this.rippleAnimationView = rippleAnimationView;        // 一开始隐藏        this.setVisibility(INVISIBLE);    }    public RippleCircleView(Context context, @Nullable AttributeSet attrs) {        super(context, attrs);    }    public RippleCircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onDraw(Canvas canvas) {        int radius = Math.min(getWidth(),getHeight()) / 2;        // 画圆        canvas.drawCircle(radius,radius,radius - rippleAnimationView.getStrokeWidth(),                rippleAnimationView.getPaint());    }}

使用水波纹动画

    
 RippleAnimationView rippleAnimationView = findViewById(R.id.ripple_view);        findViewById(R.id.iv_play)                .setOnClickListener(new View.OnClickListener() {                    @Override                    public void onClick(View v) {                        if (rippleAnimationView.isAnimationRunning()) {                            rippleAnimationView.stopRippleAnimation();                        } else {                            rippleAnimationView.startRippleAnimation();                        }                    }                });

以上是"Android如何实现水波纹效果"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

波纹 动画 效果 内容 属性 篇文章 循环 时间 学习 帮助 外向 实例 差值 效果图 易懂 更多 条理 状态 画笔 知识 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手磨咖啡 互联网科技未来 上海卓越科技 互联网 互联网科技英文翻译 恒生科技互联网指数分析 深圳互联网科技怎么样 山东吉时兔互联网科技有限公司 汉立互联网科技有限公司联系电话 须眉科技是互联网公司吗 互联网科技热点资讯 互联网为啥属于高科技 厦门千工互联网科技有限公司 花神(南京)互联网科技有限公司 和信科技工业互联网 燊美集互联网科技有限公司 群盈汇互联网科技有限公司 北京互联网科技类企业分布 广西泛欧互联网科技有限公司 深圳互联网科技园地址 优雇互联网科技有限公司 亿人帮互联网科技有限公司 科技与互联网 互联网巨头反垄断金融科技 四个字互联网科技公司取名 云创客互联网科技公司 互联网科技有哪些公司 宜昌元轩互联网科技有限公司 互联网金融科技名词解释 云鲸互联网络科技有限公司 科技美学互联网 艺术
0