Android自定義動畫-ClockLoadingView

有一段時間沒寫文章了,原因肯定只有兩種咯,第一、懶;第二、工作忙。嘿嘿,我的原因肯定是 后者 唄(臉皮厚)。廢話不多說,今天我們分享一個自定義的加載動畫簡單實現(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容