先上效果图

其实上边效果分为几个部分,一个部分是多个小星星四处扩散,第二个部分是一个小星星从小变大,还有一个是实心圆的动画。
代码如下

第一:所有的小星星动画


public class StarView extends View {private Paint mPaint;private Bitmap mStar;                          // 星星图片private ArrayList<StarModel> mStarModelList    = null;private float                   mCurrentProgress;               // 当前进度private int                      mCenterX, mCenterY;             // 中心点private ValueAnimator mValueAnimator;public StarView(Context context) {this(context, null);}public StarView(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public StarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mPaint = new Paint();mPaint.setAntiAlias(true);mStar = BitmapFactory.decodeResource(getResources(), R.mipmap.stars1);}@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mCenterX = getMeasuredWidth() / 2 - mStar.getWidth() / 2; // 90mCenterY = getMeasuredHeight() / 2 - mStar.getHeight() / 2; // 90}@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);if (mStarModelList == null) {return;}for (StarModel starModel : mStarModelList) {starModel.draw(canvas, mPaint, mCurrentProgress, mCenterX, mCenterY);}}public ValueAnimator startAnimation(int length, int duration, int delay) {if (mStarModelList != null) {mStarModelList.clear();mValueAnimator = null;}initStarModel(length);mValueAnimator = ValueAnimator.ofFloat(0f, 1f);mValueAnimator.setInterpolator(new DecelerateInterpolator());mValueAnimator.setDuration(duration);mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Override public void onAnimationUpdate(ValueAnimator animation) {mCurrentProgress = (float) animation.getAnimatedValue();invalidate();}});mValueAnimator.setStartDelay(delay);mValueAnimator.start();return mValueAnimator;}private void initStarModel(int length) {mStarModelList = new ArrayList<>(10);Random random = new Random();for (int i = 0; i < length; i++) {float angle = 0f;float startX = 0f;float startY = 0f;float speed = 1 + random.nextInt(5); // 总共是19float scale = 1f; // 开始大小if (i == 0) {angle = (float) ((10 + 270) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.05f;startY = (float) Math.sin(angle) * mCenterY * 0.5f;// speed = 0.5789f;} else if (i == 1) {angle = (float) ((30 + 270) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.1f;startY = (float) Math.sin(angle) * mCenterY * 0.2f;// speed = 0.7368f;} else if (i == 2) {angle = (float) ((40 + 270) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.25f;startY = (float) Math.sin(angle) * mCenterY * 0.4f;// speed = 0.5789f;} else if (i == 3) {angle = (float) ((60 + 270) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.3f;startY = (float) Math.sin(angle) * mCenterY * 0.33f;// speed = 0.5263f;} else if (i == 4) { // 星星变小angle = (float) ((50) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.6f;startY = (float) Math.sin(angle) * mCenterY * 0.7f;scale = 0.8f;// speed = 0.3157f; // 8} else if (i == 5) { // 星星变更小angle = (float) ((80) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.05f;startY = (float) Math.sin(angle) * mCenterY * 0.3f;scale = 0.6f;// speed = 0.4210f;} else if (i == 6) {angle = (float) ((145) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.5f;startY = (float) Math.sin(angle) * mCenterY * 0.28f;// speed = 0.5263f;} else if (i == 7) {angle = (float) ((205) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.5f;startY = (float) Math.sin(angle) * mCenterY * 0.15f;scale = 0.8f;// speed = 0.4210f;} else if (i == 8) {angle = (float) ((215) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.8f;startY = (float) Math.sin(angle) * mCenterY * 0.35f;// speed = 0.5789f;} else if (i == 9) {angle = (float) ((225) * Math.PI / 180);startX = (float) Math.cos(angle) * mCenterX * 0.4f;startY = (float) Math.sin(angle) * mCenterY * 0.5f;// speed = 0.5789f;}Matrix matrix = new Matrix();StarModel model = new StarModel(mStar, angle, startX, startY, matrix, scale, speed);mStarModelList.add(model);}}}

第二:圆环动画


public class RingView extends View {private final static String TAG         = "RingView";private int                 mDuration   = 5000;private float               mCx;private float               mCy;private float               mMaxRadius;                                                     // 最大半径private float                mOuterCurrentProgress;private float             mInnerCurrentProgress;private int[]             mColors;private PorterDuffXfermode mXfermode    = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);private Paint mPaint;                                                         // 绘制外圆private Paint                mInnerPaint;public RingView(Context context) {this(context, null);}public RingView(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public RingView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mColors = getContext().getResources().getIntArray(R.array.clor_ring);mPaint = new Paint();mPaint.setColor(mColors[0]);mInnerPaint = new Paint();mInnerPaint.setColor(Color.TRANSPARENT);mInnerPaint.setAlpha(0);mInnerPaint.setXfermode(mXfermode);}@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);mCx = getMeasuredWidth() / 2;mCy = getMeasuredHeight() / 2;mMaxRadius = mCx;}@Override protected void onDraw(Canvas canvas) {int saveLayer = canvas.saveLayer(0, 0, mCx * 2, mCy * 2, mPaint, Canvas.ALL_SAVE_FLAG);canvas.drawCircle(mCx, mCx, mOuterCurrentProgress * mMaxRadius, mPaint);canvas.drawCircle(mCx, mCy, mInnerCurrentProgress * mMaxRadius, mInnerPaint);canvas.restoreToCount(saveLayer);}public void startAnim(int duration) {ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 1f);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Override public void onAnimationUpdate(ValueAnimator animation) {mOuterCurrentProgress = (float) animation.getAnimatedValue();mPaint.setARGB(255, 255, (int) (229 - mOuterCurrentProgress * 68), 0);invalidate();}});valueAnimator.setInterpolator(new DecelerateInterpolator()); // 先变快,然后减速ValueAnimator innerAnimator = ValueAnimator.ofFloat(0.01f, 1f);innerAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Override public void onAnimationUpdate(ValueAnimator animation) {mInnerCurrentProgress = (float) animation.getAnimatedValue();invalidate();}});innerAnimator.setInterpolator(new AccelerateDecelerateInterpolator());AnimatorSet animatorSet = new AnimatorSet();animatorSet.setDuration(duration);animatorSet.playTogether(valueAnimator, innerAnimator);animatorSet.start();}private OnWillEndAnimatorListener onWillEndAnimatorListener;public void setOnWillEndAnimatorListener(OnWillEndAnimatorListener onWillEndAnimatorListener) {this.onWillEndAnimatorListener = onWillEndAnimatorListener;}public interface OnWillEndAnimatorListener {void onWillEndAnimatorListener(float value);}}

第三结合小星星和圆环


public class StarLayout extends FrameLayout {private ImageView idIvBigStar;         // 大星星private RingView  idRingView;             // 圆环private StarView   idSmallStarListView;    // 所有的小星星public StarLayout(@NonNull Context context) {this(context, null);}public StarLayout(@NonNull Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public StarLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);inflate(context, R.layout.layout_star, this);idIvBigStar = findViewById(R.id.id_iv_big_star);idRingView = findViewById(R.id.id_ringview);idSmallStarListView = findViewById(R.id.id_starview);}public void startRingAnim(final int[] originLocation) {final int[] location = new int[2];idIvBigStar.post(new Runnable() {@Override public void run() {idIvBigStar.getLocationInWindow(location);final int disX = originLocation[0] - location[0];final int disY = originLocation[1] - location[1];idIvBigStar.setAlpha(0f);idRingView.startAnim(400);startBigStarScaleAnim(1200, 0).start();idSmallStarListView.startAnimation(10, 1600, 300);startBitStarTransAndScaleAnim(disX, disY, 1000, 1100);}});}private Animator startBigStarScaleAnim(int duration, int startDelay) {ValueAnimator valueAnimator = ValueAnimator.ofFloat(1f, 5f, 8f);valueAnimator.setInterpolator(new BounceInterpolator());valueAnimator.addListener(new AnimatorListenerAdapter() {@Override public void onAnimationStart(Animator animation) {idIvBigStar.setAlpha(1f);}});valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Override public void onAnimationUpdate(ValueAnimator animation) {float value = (float) animation.getAnimatedValue();idIvBigStar.setScaleX(value);idIvBigStar.setScaleY(value);}});valueAnimator.setDuration(duration);valueAnimator.setStartDelay(startDelay);return valueAnimator;}/**** 平移并且缩放动画*/private void startBitStarTransAndScaleAnim(final int disX, final int disY, int duration, int delay) {ValueAnimator scaleAnim = ValueAnimator.ofFloat(8f, 1f);scaleAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Override public void onAnimationUpdate(ValueAnimator animation) {float value = (float) animation.getAnimatedValue();idIvBigStar.setScaleX(value);idIvBigStar.setScaleY(value);}});ValueAnimator transAnim = ValueAnimator.ofFloat(0, 1f);transAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Override public void onAnimationUpdate(ValueAnimator animation) {float value = (float) animation.getAnimatedValue();idIvBigStar.setTranslationX(value * disX);idIvBigStar.setTranslationY(value * disY);}});AnimatorSet animatorSet = new AnimatorSet();animatorSet.play(scaleAnim).with(transAnim);animatorSet.setDuration(duration);animatorSet.setStartDelay(delay);animatorSet.addListener(new AnimatorListenerAdapter() {@Override public void onAnimationEnd(Animator animation) { // 动画执行完毕if (onAnimationEnd != null) {onAnimationEnd.onAnimationEnd();}}});animatorSet.start();}private OnAnimationEnd onAnimationEnd;public void setOnAnimationEnd(OnAnimationEnd onAnimationEnd) {this.onAnimationEnd = onAnimationEnd;}public interface OnAnimationEnd {void onAnimationEnd();}}

源代码链接

android自定义view之星星动画相关推荐

  1. android view 渐变动画,Android自定义view渐变圆形动画

    本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...

  2. Android自定义view之围棋动画

    Android自定义view之围棋动画 好久不见,最近公众号内粉丝要求上新一篇有点难度的自定义view文章,所以它来了!! 干货文,建议收藏 文章目录 Android自定义view之围棋动画 前言 完 ...

  3. android 自定义加载动画效果,Android自定义View实现loading动画加载效果

    项目开发中对Loading的处理是比较常见的,安卓系统提供的不太美观,引入第三发又太麻烦,这时候自己定义View来实现这个效果,并且进行封装抽取给项目提供统一的loading样式是最好的解决方式了. ...

  4. Android 自定义View之咖啡杯动画

    效果 大概思路 自定义view,直接继承view 复写onSizeChanged()方法,在此计算杯垫,杯子,烟雾效果的path 在onDraw()方法中,描绘杯垫,杯子 处理烟雾动画效果 画杯子 这 ...

  5. Android自定义view之围棋动画,真牛皮

    @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, ...

  6. android下雨动画效果,Android 自定义View之下雨动画

    开始前先做个热身( ˘•灬•˘ ) 自己实现比较容易,但是到了要出博客整理思路,总结要点的时候就挠头,不知云所以,所以最简单的还是 如果对安卓UI有兴趣的朋友可以加我好友互相探讨, 思路 思路比较简单 ...

  7. android刷新时的圆形动画_Android自定义view渐变圆形动画

    本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...

  8. android录音波浪动画_Android自定义View实现波浪动画

    本文实例为大家分享了Android自定义View实现波浪动画的具体代码,供大家参考,具体内容如下 效果演示 代码调用与实现效果 xml中调用 android:layout_width="ma ...

  9. Android自定义View:ViewGroup(三)

    自定义ViewGroup本质是什么? 自定义ViewGroup本质上就干一件事--layout. layout 我们知道ViewGroup是一个组合View,它与普通的基本View(只要不是ViewG ...

最新文章

  1. [ Luogu 3924 ] 康纳的线段树
  2. 【转】mysql,mysqli,PDO三种方式连接数据库
  3. 初中数学四十二个几何模型_陪伴成长的初中数学几何模型大全
  4. Orangepi Zero播放声音报错的解决方案
  5. React学习:生命周期、过滤器、event、axios-学习笔记
  6. PCF上的Spring Cloud合同和Spring Cloud Services
  7. 百度蜘蛛(BaiduSpider)IP段详细情况介绍
  8. CodeTank iOS App Technical Support
  9. 乔治城计算机系如何,乔治城大学cs专业申请
  10. php+rabbitMQ操作之延迟队列(延迟插件)
  11. 【简●解】[SDOI2008] Sue的小球
  12. aruba交换机配置命令_ArubaOS交换机日常配置指导
  13. 北京地铁月度消费总金额计算(Python版)
  14. 一文带你读懂何为 macOS App 公证,以及如何自动化实现
  15. 想学习人工智能?强烈推荐几本人工智能方向的书籍|你应该看的五本书|自学人工智能
  16. # TIG监控体系搭建
  17. 最新CTR预测服务的GPU优化实践
  18. 《windows游戏编程大师技巧》第五章:DirectX基础知识和令人生畏的COM
  19. php使用amqp,php,_php的amqp应该怎样使用?,php - phpStudy
  20. wfGo 围棋 单人打谱模式

热门文章

  1. MySQL对多个条件分别计数
  2. css初级之高级语法
  3. 为什么酒店公共办公楼采用指纹|RFID卡|密码门锁作为门禁使用及选型注意事项
  4. 我的编程奋斗历程[四部曲之三]-成为金子篇
  5. 【Linux】常用工具的使用
  6. Spring-boot通过redisTemplate使用redis(无须手动序列化)
  7. react中副作用函数(useEffect)详解
  8. App渠道打包的最佳攻略,一次解决打包难题
  9. 前端面试hr经常会问的问题
  10. 面试专家陈建军出二十一组面试题(转)