android arcgis 绘制圆_Android画笔高级应用之炫酷的起屏动画

1.效果图

d1df3ad7517a872fb8409b403b3a0bfe.png
a24ab6552c8e13824f7b956d428bb97e.png
91bff312480f75352f8da82fa030bc42.png
a5701e10921ba5cdc4c3ac7449c205e1.png
440c1286d57744a70ebfef19735136b1.png
5395361019c125900d2556c26d8bf41a.png

2.从上面动图可以看到动画一共分类三个

a旋转动画

b聚合动画(及先变大后缩小动画)

c水波纹动画

3.实现步骤:

3.1.初始化画笔和颜色数组

private void init(Context context) { //对两只画笔初始化 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mHolePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mHolePaint.setStyle(Paint.Style.STROKE); mHolePaint.setColor(mBackgroundColor); //对颜色数组初始化 mCircleColors = context.getResources().getIntArray(R.array.splash_circle_colors); }

3.2.在onSizeChanged中获取旋转圆的中心坐标以及扩散圆的最大半径

//获取旋转圆的中心坐标 mCenterX = w * 1f / 2; mCenterY = h * 1f / 2; //获取扩散圆最大的半径 mDistance = (float) (Math.hypot(w, h) / 2);

3.3.开始绘制

@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //开始绘制 if (mState == null) { mState = new mSplashView.RotateState(); } mState.drawState(canvas); }

3.4.建一个抽象类让其子类调用

private mSplashState mState; private abstract class mSplashState {//抽象类 abstract void drawState(Canvas canvas); }

3.5.旋转动画的实现

private class RotateState extends mSplashState { //属性动画执行 private RotateState(){ //旋转一周 mValueAnimator = ValueAnimator.ofFloat(0,(float) (Math.PI*2)); //执行两遍 mValueAnimator.setRepeatCount(2); mValueAnimator.setDuration(mRotateDuration); //设置差值器 mValueAnimator.setInterpolator(new LinearInterpolator()); //监听动画的更新状态 mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { //当前的旋转角度 mCurrentRotateAngle = (float) animation.getAnimatedValue(); //使得onDraw方法重新执行 invalidate(); } }); //监听动画的执行状态 mValueAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); //结束的时候调用聚合动画 mState = new MerginState(); } }); mValueAnimator.start(); } @Override void drawState(Canvas canvas) { //绘制背景 drawBackground(canvas); //绘制6个小球 drawCircles(canvas); } }

3.6.聚合动画的实现(即先放大后缩小)

//2聚合动画 private class MerginState extends mSplashState{ //执行聚合动画 private MerginState(){ mValueAnimator = ValueAnimator.ofFloat(mCircleRadius, mRotateRadius); mValueAnimator.setDuration(mRotateDuration); mValueAnimator.setInterpolator(new OvershootInterpolator(10f)); mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mCurrentRotateRadius = (float) animation.getAnimatedValue(); invalidate(); } }); mValueAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mState = new ExpandState(); } }); mValueAnimator.reverse(); } @Override void drawState(Canvas canvas) { //绘制背景 drawBackground(canvas); //绘制6个小球 drawCircles(canvas); } }

3.7.水波纹动画的实现

//3.水波纹 private class ExpandState extends mSplashState { public ExpandState() { mValueAnimator = ValueAnimator.ofFloat(mCircleRadius, mDistance); // mValueAnimator.setRepeatCount(2); mValueAnimator.setDuration(mRotateDuration); mValueAnimator.setInterpolator(new LinearInterpolator()); mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mCurrentHoleRadius = (float) animation.getAnimatedValue(); invalidate(); } }); mValueAnimator.start(); } @Override void drawState(Canvas canvas) { drawBackground(canvas); } }

3.8.绘制圆和绘制 背景的方法实现

private void drawBackground(Canvas canvas) { if (mCurrentHoleRadius > 0){ //绘制空心圆 float strokeWidth = mDistance - mCurrentHoleRadius; float radius = strokeWidth / 2 + mCurrentHoleRadius; mHolePaint.setStrokeWidth(strokeWidth); canvas.drawCircle(mCenterX,mCenterY, radius, mHolePaint); }else{ canvas.drawColor(mBackgroundColor); } } private void drawCircles(Canvas canvas) { //计算两个小球之间的角度 float rotateAngle = (float) (Math.PI * 2 / mCircleColors.length); for (int i = 0; i < mCircleColors.length; i++) { float angle = i * rotateAngle + mCurrentRotateAngle; float cx = (float) (Math.cos(angle) * mCurrentRotateRadius + mCenterX); float cy = (float) (Math.sin(angle) * mCurrentRotateRadius + mCenterY); mPaint.setColor(mCircleColors[i]); canvas.drawCircle(cx, cy, mCircleRadius, mPaint); } }

喜欢的可以点个关注,后面会持续更新Android新技术,但愿人长久,搬砖不再有。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值