android自定义view之星星动画
先上效果图
其实上边效果分为几个部分,一个部分是多个小星星四处扩散,第二个部分是一个小星星从小变大,还有一个是实心圆的动画。
代码如下
第一:所有的小星星动画
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之星星动画相关推荐
- android view 渐变动画,Android自定义view渐变圆形动画
本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...
- Android自定义view之围棋动画
Android自定义view之围棋动画 好久不见,最近公众号内粉丝要求上新一篇有点难度的自定义view文章,所以它来了!! 干货文,建议收藏 文章目录 Android自定义view之围棋动画 前言 完 ...
- android 自定义加载动画效果,Android自定义View实现loading动画加载效果
项目开发中对Loading的处理是比较常见的,安卓系统提供的不太美观,引入第三发又太麻烦,这时候自己定义View来实现这个效果,并且进行封装抽取给项目提供统一的loading样式是最好的解决方式了. ...
- Android 自定义View之咖啡杯动画
效果 大概思路 自定义view,直接继承view 复写onSizeChanged()方法,在此计算杯垫,杯子,烟雾效果的path 在onDraw()方法中,描绘杯垫,杯子 处理烟雾动画效果 画杯子 这 ...
- Android自定义view之围棋动画,真牛皮
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, ...
- android下雨动画效果,Android 自定义View之下雨动画
开始前先做个热身( ˘•灬•˘ ) 自己实现比较容易,但是到了要出博客整理思路,总结要点的时候就挠头,不知云所以,所以最简单的还是 如果对安卓UI有兴趣的朋友可以加我好友互相探讨, 思路 思路比较简单 ...
- android刷新时的圆形动画_Android自定义view渐变圆形动画
本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下 直接上效果图 自定义属性 attrs.xml文件 创建一个类 ProgressRing继承自 view ...
- android录音波浪动画_Android自定义View实现波浪动画
本文实例为大家分享了Android自定义View实现波浪动画的具体代码,供大家参考,具体内容如下 效果演示 代码调用与实现效果 xml中调用 android:layout_width="ma ...
- Android自定义View:ViewGroup(三)
自定义ViewGroup本质是什么? 自定义ViewGroup本质上就干一件事--layout. layout 我们知道ViewGroup是一个组合View,它与普通的基本View(只要不是ViewG ...
最新文章
- [ Luogu 3924 ] 康纳的线段树
- 【转】mysql,mysqli,PDO三种方式连接数据库
- 初中数学四十二个几何模型_陪伴成长的初中数学几何模型大全
- Orangepi Zero播放声音报错的解决方案
- React学习:生命周期、过滤器、event、axios-学习笔记
- PCF上的Spring Cloud合同和Spring Cloud Services
- 百度蜘蛛(BaiduSpider)IP段详细情况介绍
- CodeTank iOS App Technical Support
- 乔治城计算机系如何,乔治城大学cs专业申请
- php+rabbitMQ操作之延迟队列(延迟插件)
- 【简●解】[SDOI2008] Sue的小球
- aruba交换机配置命令_ArubaOS交换机日常配置指导
- 北京地铁月度消费总金额计算(Python版)
- 一文带你读懂何为 macOS App 公证,以及如何自动化实现
- 想学习人工智能?强烈推荐几本人工智能方向的书籍|你应该看的五本书|自学人工智能
- # TIG监控体系搭建
- 最新CTR预测服务的GPU优化实践
- 《windows游戏编程大师技巧》第五章:DirectX基础知识和令人生畏的COM
- php使用amqp,php,_php的amqp应该怎样使用?,php - phpStudy
- wfGo 围棋 单人打谱模式