android 自定义loading,Android自定义动画-StarLoadingView
今天來分享第二個自定義loading的動畫,起了個名字叫 蹦跶的星星 ,還是老規(guī)矩先介紹,后上圖。
實現(xiàn)效果在最后,GIF有點大,手機流量慎重。
介紹
首先聲明做這個動畫的初衷是為了學(xué)習(xí)和分享,所以從這里起,我準備做一個系列的加載動畫(截止時間:我放棄的時候)。
上一個動畫連接:Android自定義動畫-ClockLoadingView
正文
陰影及下落的動畫:
private final ValueAnimator.AnimatorUpdateListener mAnimatorUpdateListener = new ValueAnimator.AnimatorUpdateListener()
{
@Override
public void onAnimationUpdate(ValueAnimator animation)
{
float value = (float) animation.getAnimatedValue();
mOffsetTranslateY = getViewCenterY() * 0.4f * value;
mShadowWidth = (mOffsetTranslateY + 10) * 0.9f;
}
};
初始化參數(shù):
@Override
protected void initParams(Context context)
{
mFullPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mFullPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mFullPaint.setStrokeWidth(2);
mFullPaint.setColor(Color.BLACK);
mFullPaint.setDither(true);
mFullPaint.setFilterBitmap(true);
initValue(context);
initAnimator();
}
private void initAnimator()
{
mShadowAnimator = ValueAnimator.ofFloat(0.0f, 1.0f, 0.0f);
mShadowAnimator.setRepeatCount(Animation.INFINITE);
mShadowAnimator.setDuration(ANIMATION_DURATION);
mShadowAnimator.setStartDelay(ANIMATION_START_DELAY);
mShadowAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
}
private void initValue(Context context)
{
float allSize = getAllSize();
mStarOutR = allSize - dip2px(context, 5);
mStarOutMidR = mStarOutR * 0.9f;
mStarInR = mStarOutMidR * 0.6f;
mStarInMidR = mStarInR * 0.9f;
mStartAngle = 0;
mOffsetTranslateY = 0;
//星路徑
mStarPath = createStarPath(5, -18);
//陰影寬度
mShadowWidth = mStarOutR;
mOvalRectF = new RectF();
}
繪制步驟,這里是通過偏移和旋轉(zhuǎn)畫布來實現(xiàn)部分動畫的。
@Override
protected void onDraw(Canvas canvas)
{
canvas.save();
canvas.translate(0, mOffsetTranslateY);
canvas.rotate(mStartAngle, getViewCenterX(), getViewCenterY());
canvas.drawPath(mStarPath, mFullPaint);
canvas.restore();
// 繪制底部陰影
mOvalRectF.set(getViewCenterX() - mShadowWidth, getIntrinsicHeight() - 20, getViewCenterX() + mShadowWidth, getIntrinsicHeight() - 10);
canvas.drawOval(mOvalRectF, mFullPaint);
}
下面是關(guān)鍵步驟,繪制計算五角星路徑,這是我自己寫的算法,可以傳入角數(shù)量和初始角度偏移量。這里最關(guān)鍵的是通過貝塞爾曲線對五角星的內(nèi)角和外角做了弧度處理。 很完美!!!😄
/**
* 繪制五角星
*
* @param num 角數(shù)量
* @param startAngle 初始角度
* @return
*/
private Path createStarPath(int num, int startAngle)
{
final Path path = new Path();
int angle = 360 / num;
int roundSize = 5;//圓角弧度
int offsetAngle = angle / 2;
path.moveTo(getViewCenterX() + mStarOutMidR * cos(startAngle - roundSize), getViewCenterY() + mStarOutMidR * sin(startAngle - roundSize));
for (int i = 0; i < num; i++)
{
int value = angle * i + startAngle;
path.lineTo(getViewCenterX() + mStarOutMidR * cos(value - roundSize), getViewCenterY() + mStarOutMidR * sin(value - roundSize));
//圓角
path.quadTo(getViewCenterX() + mStarOutR * cos(value), getViewCenterY() + mStarOutR * sin(value), getViewCenterX() + mStarOutMidR * cos(value + roundSize), getViewCenterY() + mStarOutMidR * sin(value + roundSize));
path.lineTo(getViewCenterX() + mStarInR * cos(value + offsetAngle - roundSize), getViewCenterY() + mStarInR * sin(value + offsetAngle - roundSize));
//內(nèi)圓角
path.quadTo(getViewCenterX() + mStarInMidR * cos(value + offsetAngle), getViewCenterY() + mStarInMidR * sin(value + offsetAngle), getViewCenterX() + mStarInR * cos(value + offsetAngle + roundSize), getViewCenterY() + mStarInR * sin(value + offsetAngle + roundSize));
}
path.close();
return path;
}
下面是部分動畫的基本設(shè)定和開啟,按照基類走的,看不懂的可以去Github上看源碼。
@Override
protected void prepareStart(ValueAnimator floatValueAnimator)
{
floatValueAnimator.setInterpolator(new DecelerateInterpolator());
mShadowAnimator.setRepeatCount(Animation.INFINITE);
mShadowAnimator.setDuration(ANIMATION_DURATION);
mShadowAnimator.setStartDelay(ANIMATION_START_DELAY);
mShadowAnimator.addUpdateListener(mAnimatorUpdateListener);
mShadowAnimator.start();
}
@Override
protected void prepareEnd()
{
mShadowAnimator.removeAllUpdateListeners();
mShadowAnimator.removeAllListeners();
mShadowAnimator.setRepeatCount(0);
mShadowAnimator.setDuration(0);
mShadowAnimator.end();
}
@Override
protected void computeUpdateValue(@FloatRange(from = 0.0, to = 1.0) float animatedValue)
{
mStartAngle = (int) (360 * animatedValue);
}
總結(jié)
小伙伴們,動畫應(yīng)該還是可以的吧,如果大家覺得ok的話,希望能給個喜歡,最渴望的是在Github上給個star。謝謝了。
演示
動畫演示圖
作者:Zyao89;轉(zhuǎn)載請保留此行,謝謝;
總結(jié)
以上是生活随笔為你收集整理的android 自定义loading,Android自定义动画-StarLoadingView的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下date -d,linux
- 下一篇: 一个人去医院动手术,需要注意些什么?