有一段時間沒寫文章了,原因肯定只有兩種咯,第一、懶;第二、工作忙。嘿嘿,我的原因肯定是 后者 唄(臉皮厚)。廢話不多說,今天我們分享一個自定義的加載動畫簡單實現(xiàn)。
實現(xiàn)效果在最后,GIF有點大,手機流量慎重。
介紹
首先做這個動畫的初衷是為了學(xué)習(xí)和分享,所以從這里起,我準(zhǔn)備做一個系列的加載動畫(截止時間:我放棄的時候)。
正文
這次分享的是一個簡單的秒表樣式的加載動畫。初始化如下,參數(shù)隨意寫的:
private void init(Context context, AttributeSet attrs)
{
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(Color.BLACK);//顏色
mStartAnimator = ValueAnimator.ofFloat(0, 359);
mStartAnimator.setStartDelay(500);//起始延遲
initValues();
}
private void initValues()
{
mBigRadius = 50;//外框
mInnerRadius = mBigRadius - 10;//內(nèi)框
mInnerCircleRectF = new RectF();
mStartAngle = 0;//初角度
mEndAngle = 0;//終角度
}
當(dāng)View大小改變時,重新計算。
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
mViewWidth = w;
mViewHeight = h;
mViewCenterX = w / 2;
mViewCenterY = h / 2;
mInnerCircleRectF.set(mViewCenterX - mInnerRadius, mViewCenterY - mInnerRadius, mViewCenterX + mInnerRadius, mViewCenterY + mInnerRadius);
}
加載:
@Override
protected void onAttachedToWindow()
{
super.onAttachedToWindow();
if (mStartAnimator != null)
{
mStartAnimator.setRepeatCount(ValueAnimator.INFINITE);
mStartAnimator.setDuration(1000);
mStartAnimator.addListener(this);
mStartAnimator.addUpdateListener(this);
mStartAnimator.start();
}
}
@Override
protected void onDetachedFromWindow()
{
super.onDetachedFromWindow();
if (mStartAnimator != null)
{
mStartAnimator.setRepeatCount(0);
mStartAnimator.setDuration(0);
mStartAnimator.cancel();
mStartAnimator.removeAllUpdateListeners();
mStartAnimator.removeAllListeners();
}
}
繪制方法,繪制扇形。
額。。。這里就一句話,我都覺得不好意思了,尷尬...
@Override
protected void onDraw(Canvas canvas)
{
canvas.drawArc(mInnerCircleRectF, mStartAngle, mEndAngle - mStartAngle, true, mPaint);
}
動畫Animation監(jiān)聽回調(diào)
@Override
public void onAnimationStart(Animator animation)
{
mStartAngle = 0;
mEndAngle = 0;
}
@Override
public void onAnimationEnd(Animator animation)
{
mStartAngle = 0;
mEndAngle = 0;
}
@Override
public void onAnimationCancel(Animator animation)
{
mStartAngle = 0;
mEndAngle = 0;
}
@Override
public void onAnimationRepeat(Animator animation)
{
mIsFirstState = !mIsFirstState;
if (mIsFirstState)//動畫分為兩個階段,這里簡單判斷是否是第一階段。
{
mStartAngle = 0;
mEndAngle = 0;
}
else
{
mStartAngle = 0;
mEndAngle = 360;
}
}
@Override
public void onAnimationUpdate(ValueAnimator animation)
{
float value = (float) animation.getAnimatedValue();
if (mIsFirstState)
{
mEndAngle = value;
}
else
{
mStartAngle = value;
}
postInvalidate();
}
總結(jié)
文章里舉例的代碼,是最簡單的實現(xiàn)原理,Github上的代碼是進一步的優(yōu)化。這里先到這里,希望大家能給個Star,后面我還會持續(xù)分享的。謝謝。
演示

結(jié)果演示圖
Github:zyao89/ZCustomView
作者:Zyao89;轉(zhuǎn)載請保留此行,謝謝;
個人博客:https://zyao89.cn