ExplosionView 的绘制过程

ExplosionView是一个实现视图点击后粒子爆炸效果的组件,包括ExplosionLayout和Explosion两个核心部分。ExplosionLayout用于承载动画,监听并响应点击事件,通过Explosion及其子类(如Particle、Shredder)实现不同类型的动画效果。动画过程中,使用属性动画集合,并通过线程定时刷新来优化性能。
摘要由CSDN通过智能技术生成

ExplosionView 的绘制过程

explosionView是一个粒子爆炸的view效果, 可以把view添加到explosionview中, 在点击该view的时候, view会变成粒子爆碎开, 掉到屏幕底部,动画结束后在恢复原样。

效果图

效果图

知识点:

1.快速创建一个属性动画

view.animate()          //给view创建一个属性动画
    .alpha(1f)          //设置透明度
    .translationX(10)   //X轴移动
    .scaleX(1.5)        //X轴缩放
    .setDuration(150)  //设置动画时间
    .start();          //启动动画

2.bitmap获取到指定位置的像素颜色

bit.getPixel(x, y)
概述

主要分为两个部分:

  1. ExplosionLayout是用来播放动画的一个壳子,主要任务是
    • 初始化的时候创建一个覆盖全屏的view ,用来承载view的绘制
    • 监听View的点击事件,在view被点击之后,执行动画效果 获取到view的位置和bitmap图像,根据传进来的不同类型,播放不同的动画效果
  2. Explosion作为一个抽象类,主要是方便更换不同的效果,主要子类1.Particle,2.Shredder 在ExplosionLayout中改变type来切换不同的效果
第一部分 ExplosionLayout
  • 初始化的时候创建一个覆盖全屏的view ,用来承载view的绘制
 private void attach2Activity(Activity activity) {
 ViewGroup rootView = (ViewGroup) activity.findViewById(Window.ID_ANDROID_CONTENT);
 ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(
 ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
        rootView.addView(this, lp);
    }
  • 监听View的点击事件,在view被点击之后,执行动画效果

    /**
     * 给view 一个监听,当被点击的时候,执行动画效果
     *
     * @param view
     */
    public void addLinstener(final View view) {
        view.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                explosion(view);
            }
        });
    }
  /***
     * 给 view 添加动画效果
     *
     * @param view
     */
    private void explosion(final View view) {
        //获取到传进来view 的位置信息
        Rect mRect = new Rect();
        view.getGlobalVisibleRect(mRect);
        //因为状态栏的高度问题, 这里要进行一个高度的偏移
        mRect.offset(0, -DensityUtils.dp2px(view.getContext(), 21));
        Bitmap bit = createBitmapFromView(view);
        Explosion explosion;
    if (type == TYPE_SHREDDER) {
        explosion = new Shredder();
    } else {
        explosion = new Particle();
    }

    final ValueAnimator explosionAnimation = ValueAnimator.ofObject(new ExplosionEvaluator(explosion, bit, mRect),
            new Shredder(0), new Shredder(1));
    explosionAnimation.setDuration(animation_time);
    //不能重复添加
    if (explostionSet.containsKey(view)) {
        return;
    }
    explostionSet.put(view, explosionAnimation);
    explosionAnimation.addListener(new AnimatorListenerAda
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值