Android自定義控件——模擬拋體加速減速效果

這里主要介紹一個關于類豎直上拋運動規律效果的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'

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,269評論 25 708
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,566評論 6 30
  • 1 背景 不能只分析源碼呀,分析的同時也要整理歸納基礎知識,剛好有人微博私信讓全面說說Android的動畫,所以今...
    未聞椛洺閱讀 2,746評論 0 10
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,141評論 5 13
  • 圖片發自簡書App 1 這已是深秋,只有周末才有時間去公園鍛煉。七點鐘走出門,一股涼氣撲面而來,還有點模糊的頭腦一...
    解百城閱讀 740評論 0 2