Android筆記----動畫、屬性動畫
阿新 • • 發佈:2018-12-21
好記性不如爛筆頭。
幀動畫
補間動畫:Alpha、Scale、Translation、Rotate
屬性動畫:
屬性動畫常用的幾個類:
ObjectAnimator:物件動畫執行類
ValueAnimator:值動畫執行類
PropertyValuesHolder:屬性存值器
Keyframe:關鍵幀
AnimatorSet:動畫執行集合類
AnimatorUpdateListener:動畫更新監聽
AnimatorListener:動畫執行監聽
AnimatorInflater 動畫載入器
TypeEvaluator 型別估值
實現屬性動畫的方法:
1.呼叫ObjectAnimator的靜態工廠方法建立動畫(ofInt、ofFloat、ofObject);
2.呼叫setXxx()設定動畫持續時間、插值方式、重複次數等;
3.設定監聽事件;
4.呼叫Animator物件的start()方法啟動動畫。
//建立動畫
ObjectAnimator yBouncer = ObjectAnimator.ofFloat(button, "ScaleX",0.0f, 1.0f); //設定動畫持續時間 yBouncer.setDuration(2000); // 設定插值器(用於調節動畫執行過程的速度) yBouncer.setInterpolator(new LinearInterpolator()); // 設定重複次數(預設為0,表示不重複執行),設定為2表示總共執行3次 yBouncer.setRepeatCount(2); // 設定重複模式(RESTART或REVERSE),重複次數大於0或INFINITE生效 yBouncer.setRepeatMode(ValueAnimator.RESTART); // 設定動畫開始的延時時間(200ms) yBouncer.setStartDelay(200); // 開始動畫 yBouncer.start();
預設縮放點在button的中間位置,如果要設定在button的(0,0)座標進行縮放,需要新增以下程式碼:
// 設定縮放的中心點
button.setPivotX(0);
button.setPivotY(0);
button.invalidate();
新增監聽:
ObjectAnimator anim = ObjectAnimator.ofFloat(view, "alpha", 0.5f); anim.setDuration(1000); anim.addListener(new AnimatorListener() { @Override public void onAnimationStart(Animator animation) { // 動畫開始時呼叫 } @Override public void onAnimationRepeat(Animator animation) { // 動畫重複時呼叫 } @Override public void onAnimationEnd(Animator animation) { // 動畫結束時呼叫 ViewGroup parent = (ViewGroup) view.getParent(); if (parent != null) parent.removeView(view); } @Override public void onAnimationCancel(Animator animation) { // 動畫取消時呼叫 } }); anim.start();
ValueAnimator:
ValueAnimator animator = ValueAnimator.ofFloat(0f, 200.0f);
// 設定作用物件
animator.setTarget(view);
// 設定執行時間
animator.setDuration(1000);
// 新增動畫更新監聽
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// 獲取當前值
Float mValue = (Float) animation.getAnimatedValue();
// 設定橫向偏移量
view.setTranslationX(mValue);
// 設定縱向偏移量
view.setTranslationY(mValue);
<span style="white-space:pre"> </span>}
});
animator.start();
PropertyValuesHolder:
// 獲取view左邊位置
int left = view.getLeft();
// 獲取view右邊位置
int right = view.getRight();
// 將view左邊增加10畫素
PropertyValuesHolder pvhLeft = PropertyValuesHolder.ofInt("left", left,
left + 10);
// 將view右邊減少10畫素
PropertyValuesHolder pvhRight = PropertyValuesHolder.ofInt("right",
right, right - 10);
// 在X軸縮放從原始比例1f,縮小到最小0f,再放大到原始比例1f
PropertyValuesHolder pvhScaleX = PropertyValuesHolder.ofFloat("scaleX",
1f, 0f, 1f);
// 在Y軸縮放從原始比例1f,縮小到最小0f,再放大到原始比例1f
PropertyValuesHolder pvhScaleY = PropertyValuesHolder.ofFloat("scaleY",
1f, 0f, 1f);
// 將PropertyValuesHolder交付給ObjectAnimator進行構建
ObjectAnimator customAnim = ObjectAnimator.ofPropertyValuesHolder(view,
pvhLeft, pvhRight, pvhScaleX, pvhScaleY);
// 設定執行時間(1000ms)
customAnim.setDuration(1000);
// 開始動畫
customAnim.start();
Keyframe:
// 設定在動畫開始時,旋轉角度為0度
Keyframe kf0 = Keyframe.ofFloat(0f, 0f);
// 設定在動畫執行50%時,旋轉角度為360度
Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);
// 設定在動畫結束時,旋轉角度為0度
Keyframe kf2 = Keyframe.ofFloat(1f, 0f);
// 使用PropertyValuesHolder進行屬性名稱和值集合的封裝
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);
// 通過ObjectAnimator進行執行
ObjectAnimator.ofPropertyValuesHolder(view, pvhRotation)
// 設定執行時間(1000ms)
.setDuration(3000)
// 開始動畫
.start();
ValueAnimator:
// 型別估值 - 拋物線示例
TypeEvaluator<PointF> typeEvaluator = new TypeEvaluator<PointF>() {
@Override
public PointF evaluate(float fraction, PointF startValue,
PointF endValue) {
float time = fraction * 3;
// x方向120px/s ,y方向0.5 * 200 * t * t
PointF point = new PointF();
point.x = 120 * time;
point.y = 0.5f * 200 * time * time;
return point;
}
};
ValueAnimator valueAnimator = ValueAnimator.ofObject(typeEvaluator,
new PointF(0, 0));
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.setDuration(3000);
valueAnimator.start();
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
PointF point = (PointF) animation.getAnimatedValue();
view.setX(point.x);
view.setY(point.y);
}
});