日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android 属性动画伸缩,Android的属性动画(二)加载框圆点旋转收缩放大缩小效果的实现...

發布時間:2024/2/28 Android 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的属性动画(二)加载框圆点旋转收缩放大缩小效果的实现...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。