android 属性动画伸缩,Android的属性动画(二)加载框圆点旋转收缩放大缩小效果的实现...
案例效果圖如下,
案例實現步驟
1.首先用drawCircle()畫好6個圓點
private void drawCircles(Canvas canvas) {
//每個小圓之間的間隔角度 = 2π/小圓的個數
float rotationAngle = (float) (2*Math.PI/mCircleColors.length);
Log.i("barry","length------:"+mCircleColors.length);
for (int i=0; i < mCircleColors.length; i++){
/**
* x = r*cos(a) +centerX
* y= r*sin(a) + centerY
* 每個小圓i*間隔角度 + 旋轉的角度 = 當前小圓的真是角度
*/
double angle = i*rotationAngle + mCurrentRotationAngle;
float cx = (float) (mCurrentRotationRadius*Math.cos(angle) + mCenterX);
float cy = (float) (mCurrentRotationRadius*Math.sin(angle) + mCenterY);
Log.e("Test", "弧度="+angle+ " 對應的值="+mCurrentRotationRadius*Math.sin(angle));
mPaint.setColor(mCircleColors[i]);
canvas.drawCircle(cx,cy,mCircleRadius,mPaint);
}
}
2.通過屬性動畫讓6個圓點開始旋轉
//1.動畫的初始工作;2.開啟動畫
//花1200ms,計算某個時刻當前的角度是多少? 0~2π
mAnimator = ValueAnimator.ofFloat(0f,(float)Math.PI*2);//Math.PI*2 用于代表360度
//在重復執行的過程中,會有卡頓的現象,LinearInterpolator 可以用于解決卡頓
mAnimator.setInterpolator(new LinearInterpolator());
mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
//計算某個時刻當前的大圓旋轉了的角度是多少?
mCurrentRotationAngle = (float) valueAnimator.getAnimatedValue();
postInvalidate();
}
});
mAnimator.setDuration(mRotationDuration);
mAnimator.setRepeatCount(ValueAnimator.INFINITE);//重復
mAnimator.start();
3.當網絡數據加載成功后,讓旋轉動畫停止,同時讓6個圓點先開始收縮,然后再回彈
//花1200ms,計算某個時刻當前的大圓半徑是多少? r~0中的某個值
mAnimator = ValueAnimator.ofFloat(0, mRotationRadius);
mAnimator.setDuration(mRotationDuration);
mAnimator.setInterpolator(new OvershootInterpolator(10f));
mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
// 某個時刻當前的大圓半徑是多少?
mCurrentRotationRadius = (float)valueAnimator.getAnimatedValue();
invalidate();
}
});
mAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
mState = new ExpandState();
}
});
// mAnimator.start();
mAnimator.reverse();;
注意細節
mAnimator.setInterpolator(new OvershootInterpolator(10f));
使6個圓點反向擴散時,具備張力效果
mAnimator.reverse();
讓動畫反向執行,可以達到從擴散到收縮的效果
4.讓背景以圓的方式擴散
如下圖,當旋轉的6個點消失后,背景也應該以圓的方式進行擴展,以顯示背后的內容
if(mHoleRadius>0f){
//得到畫筆的寬度 = 對角線/2 - 空心圓的半徑
float strokeWidth = mDiagonalDist - mHoleRadius;
mPaintBackground.setStrokeWidth(strokeWidth);
//畫圓的半徑 = 空心圓的半徑 + 畫筆的寬度/2
float radius = mHoleRadius + strokeWidth/2;
canvas.drawCircle(mCenterX,mCenterY,radius,mPaintBackground);
Log.e("Test","畫圓: radius="+radius+" strokeWidth="+strokeWidth);
}else {
canvas.drawColor(mSplashBgColor);
}
總結
以上是生活随笔為你收集整理的android 属性动画伸缩,Android的属性动画(二)加载框圆点旋转收缩放大缩小效果的实现...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 内存3200时序调整:稳定性与性能的完美
- 下一篇: 海盗船内存6700k:速度惊人,稳定可靠