這里主要介紹一個關于類豎直上拋運動規律效果的View,可以用于“加載中”過程動畫.
效果
View中元素分析
1.單個圓點從左邊界以一定初速度一定加速度進入,作減速運動,在運動區域中點速度恰減為0;
2.然后以相同大小的加速度加速運動從右邊界跑出;
3.不同圓點之間存在間隔.
實現方式
這里涉及到基本自定義控件流程結合自定義屬性動畫來實現.
主要看一下動畫的實現,這里試圖模仿上拋運動效果.
- 上拋中物體以一定速度減速上拋到最高點后速度為0,然后開始加速下落,加速和減速階段運動過程對稱.
- 本案例與上拋運動過程相似,只是把改變了減速運動階段的位移方向,全過程保持同一個方向.
- 設置不同圓點從左側進入的相等時間間隔,可調節這個參數來調整圓點間距.
private void startMotion() {
animator = ValueAnimator.ofFloat(0f, 140f);
animator.setDuration(mPeriod).setRepeatCount(ValueAnimator.INFINITE);
animator.setInterpolator(new LinearInterpolator());//使用線性插值器
animator.start();
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float fraction = (float) animation.getAnimatedValue();
float t;
float cx;//當前位移(X軸坐標)
for (int i = 0; i < mDotNum; i++) {
t = (fraction - i * timeInterval) * mPeriod / 100;//依次延遲不同小圓點的出發時間
if (t < 0) {
cx = -1;
} else if (t <= mPeriod * 0.5) {//類豎直上拋運動(恒加速度減速運動階段)
cx = (float) (v0 * t - 0.5 * a * Math.pow(t, 2.0));
} else {//類豎直上拋運動(恒加速度加速運動階段)與上拋不同的是,這里改變了位移的方向
cx = mDisplacement - (float) (v0 * t - 0.5 * a * Math.pow(t, 2.0));
}
cxArr[i] = cx;
}
invalidate();
}
}
);
}
使用
源碼:這里
引入:compile 'com.jaren.naturalloadingview:NaturalLoadingViewLib:1.0.1'