ObjectAnimator outerCircleAnimator = ObjectAnimator.ofFloat(mCvCircle, CircleView.OUTER_CIRCLE_RADIUS_PROGRESS, 0.1f, 1f); outerCircleAnimator.setDuration(250); outerCircleAnimator.setInterpolator(mDecelerate); // 延迟擦除 ObjectAnimator innerCircleAnimator = ObjectAnimator.ofFloat(mCvCircle, CircleView.INNER_CIRCLE_RADIUS_PROGRESS, 0.1f, 1f); innerCircleAnimator.setDuration(200); innerCircleAnimator.setStartDelay(200); innerCircleAnimator.setInterpolator(mDecelerate); // 竖直水平放大和缩小 ObjectAnimator starScaleYAnimator = ObjectAnimator.ofFloat(mIvStar, ImageView.SCALE_Y, 0.2f, 1f); starScaleYAnimator.setDuration(350); starScaleYAnimator.setStartDelay(250); starScaleYAnimator.setInterpolator(mOvershoot); ObjectAnimator starScaleXAnimator = ObjectAnimator.ofFloat(mIvStar, ImageView.SCALE_X, 0.2f, 1f); starScaleXAnimator.setDuration(350); starScaleXAnimator.setStartDelay(250); starScaleXAnimator.setInterpolator(mOvershoot); // 先快后慢. ObjectAnimator dotsAnimator = ObjectAnimator.ofFloat(mDvDots, DotsView.DOTS_PROGRESS, 0, 1f); dotsAnimator.setDuration(900); dotsAnimator.setStartDelay(50); dotsAnimator.setInterpolator(mAccelerateDecelerate); // 放入动画集合 mAnimatorSet.playTogether( outerCircleAnimator, innerCircleAnimator, starScaleYAnimator, starScaleXAnimator, dotsAnimator );
各种各样的属性集
// 动画集合监听 mAnimatorSet.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationCancel(Animator animation) { // 初始值 mIvStar.setScaleX(1); mIvStar.setScaleY(1); mCvCircle.setInnerCircleRadiusProgress(0); mCvCircle.setOuterCircleRadiusProgress(0); mDvDots.setCurrentProgress(0); } });
几个自定义图形
CircleView
// 初始化 private void init() { mCirclePaint = new Paint(); mCirclePaint.setStyle(Paint.Style.FILL); mMaskPaint = new Paint(); // 消失的效果 mMaskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); mArgbEvaluator = new ArgbEvaluator(); }
初始化的时候定义两种画笔,第一种是正常画笔,第二种是擦除效果画笔
onSizeChanged()实在布局发生变化时的回调函数,间接回去调用onMeasure, onLayout函数重新布局
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mMaxCircleSize = w / 2; // 当前画布的一半. mTempBitmap = Bitmap.createBitmap(getWidth(), getWidth(), Bitmap.Config.ARGB_8888); mTempCanvas = new Canvas(mTempBitmap); // 初始化画布 }
1 2 3 4 | public static final Bitmap.Config ALPHA_8public static final Bitmap.Config ARGB_4444 public static final Bitmap.Config ARGB_8888public static final Bitmap.Config RGB_565 |
这些是色彩的存储方法:我们知道 ARGB
指的是一种 色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue.
其实所有的可见色都是右红绿蓝组成的,所以红绿蓝又称为三原色,每个原色都存储着所表示颜色的信息值
ALPHA_8就是Alpha由8位组成
ARGB_4444就是由4个4位组成即16位
ARGB_8888就是由4个8位组成即32位
RGB_565就是R为5位,G为6位,B为5位共16位
越高就越逼真
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mTempCanvas.drawColor(0xffffff, PorterDuff.Mode.CLEAR); // 清除颜色, 设置为白色 // 在控件的中心画圆, 宽度是当前视图宽度的一半(会随着控件变化), 半径会越来越大. mTempCanvas.drawCircle(getWidth() / 2, getHeight() / 2, mOuterCircleRadiusProgress * mMaxCircleSize, mCirclePaint); mTempCanvas.drawCircle(getWidth() / 2, getHeight() / 2, mInnerCircleRadiusProgress * mMaxCircleSize, mMaskPaint); canvas.drawBitmap(mTempBitmap, 0, 0, null); // 画布绘制两个
由于进行了圆.缩放操作,会进行onSizeChange操作 }
// 更新圆圈的颜色变化 private void updateCircleColor() { // 0.5到1颜色渐变 float colorProgress = (float) Utils.clamp(mOuterCircleRadiusProgress, 0.5, 1); // 转换映射控件 colorProgress = (float) Utils.mapValueFromRangeToRange(colorProgress, 0.5f, 1f, 0f, 1f); mCirclePaint.setColor((Integer) mArgbEvaluator.evaluate(colorProgress, START_COLOR, END_COLOR)); }利用估值器,实现颜色的变化
// 变换外层点的位置 private void updateOuterDotsPosition() { // 半径先走的快, 后走的慢 if (mCurrentProgress < 0.3f) { mCurrentRadius1 = (float) Utils.mapValueFromRangeToRange(mCurrentProgress, 0.0f, 0.3f, 0, mMaxOuterDotsRadius * 0.8f); } else { mCurrentRadius1 = (float) Utils.mapValueFromRangeToRange(mCurrentProgress, 0.3f, 1f, 0.8f * mMaxOuterDotsRadius, mMaxOuterDotsRadius); } // 点的大小, 小于0.7是最大点, 大于0.7逐渐为0. if (mCurrentProgress < 0.7f) { mCurrentDotSize1 = mMaxDotSize; } else { mCurrentDotSize1 = (float) Utils.mapValueFromRangeToRange(mCurrentProgress, 0.7f, 1f, mMaxDotSize, 0); } }
如何设置先块后慢的过程
點擊查看更多內容
為 TA 點贊
評論
評論
共同學習,寫下你的評論
評論加載中...
作者其他優質文章
正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦