下面列出了android.animation.ValueAnimator#setFrameDelay ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
/**
* Start the animation using the specified duration, start color and end color.
* @param duration the animation duration.
* @param startColor the start color.
* @param endColor the end color.
* @return this view.
*/
public GlowingTextView startAnimation(long duration, int startColor, int endColor) {
if (animator != null) {
if (animator.isStarted() || animator.isRunning()) animator.end();
}
this.initialColor = getCurrentTextColor();
animator = ValueAnimator.ofInt(startColor, endColor);
animator.setDuration(duration);
ValueAnimator.setFrameDelay(40L);
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.setEvaluator(new ArgbEvaluator());
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(final ValueAnimator animation) {
if (getContext() instanceof Activity) {
((Activity) getContext()).runOnUiThread(new Runnable() {
@Override
public void run() {
setTextColor((Integer) animation.getAnimatedValue() | 0xFF000000);
}
});
}
}
});
animator.start();
return this;
}
private void initialise(AttributeSet attrs) {
ValueAnimator.setFrameDelay(15); // attempt 60fps
tilePaint = new Paint();
progressPaint = new Paint();
progressPaint.setStyle(Paint.Style.FILL);
progressPaint.setAntiAlias(true);
stripePaint = new Paint();
stripePaint.setStyle(Paint.Style.FILL);
stripePaint.setAntiAlias(true);
textPaint = new Paint();
textPaint.setStyle(Paint.Style.FILL);
textPaint.setAntiAlias(true);
textPaint.setColor(ColorUtils.resolveColor(android.R.color.black, getContext()));
textPaint.setTextSize(DimenUtils.pixelsFromSpResource(getContext(), R.dimen.bootstrap_progress_bar_default_font_size));
bgPaint = new Paint();
bgPaint.setStyle(Paint.Style.FILL);
bgPaint.setColor(ColorUtils.resolveColor(R.color.bootstrap_gray_light, getContext()));
// get attributes
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.BootstrapProgressBar);
try {
this.animated = a.getBoolean(R.styleable.BootstrapProgressBar_animated, false);
this.rounded = a.getBoolean(R.styleable.BootstrapProgressBar_roundedCorners, false);
this.striped = a.getBoolean(R.styleable.BootstrapProgressBar_striped, false);
this.showPercentage = a.getBoolean(R.styleable.BootstrapProgressBar_bootstrapshowPercentage, false);
this.userProgress = a.getInt(R.styleable.BootstrapProgressBar_bootstrapProgress, 0);
this.maxProgress = a.getInt(R.styleable.BootstrapProgressBar_bootstrapMaxProgress, 100);
int typeOrdinal = a.getInt(R.styleable.BootstrapProgressBar_bootstrapBrand, -1);
int sizeOrdinal = a.getInt(R.styleable.BootstrapProgressBar_bootstrapSize, -1);
this.bootstrapSize = DefaultBootstrapSize.fromAttributeValue(sizeOrdinal).scaleFactor();
this.bootstrapBrand = DefaultBootstrapBrand.fromAttributeValue(typeOrdinal);
this.drawnProgress = userProgress;
} finally {
a.recycle();
}
textPaint.setColor(bootstrapBrand.defaultTextColor(getContext()));
textPaint.setTextSize((DimenUtils.pixelsFromSpResource(getContext(), R.dimen.bootstrap_button_default_font_size)) * this.bootstrapSize );
updateBootstrapState();
setProgress(this.userProgress);
setMaxProgress(this.maxProgress);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.orrery_main);
ImageView orrery = (ImageView) findViewById(R.id.orrery);
OrreryDrawable myOrreryDrawable = OrreryDrawable.Create();
orrery.setImageDrawable(myOrreryDrawable);
// ================================================================
// 分别控制两种属性的动画
// PropertyValuesHolder earthPositionValues = PropertyValuesHolder
// .ofFloat("EarthPosition", 0, (float) (2 * Math.PI));
// PropertyValuesHolder moonPositionValues =
// PropertyValuesHolder.ofFloat(
// "MoonPosition", 0, (float) (2 * Math.PI * 13));
// ObjectAnimator orreryAnimator =
// ObjectAnimator.ofPropertyValuesHolder(
// myOrreryDrawable, earthPositionValues, moonPositionValues);
// ================================================================
// 使用新的数据结构,同时控制地球和月球
OrreryDrawable.SolarSystemData startSolarSystemData = new OrreryDrawable.SolarSystemData();
startSolarSystemData.rotationEarth = 0;
startSolarSystemData.rotationMoon = 0;
OrreryDrawable.SolarSystemData endSolarSystemData = new OrreryDrawable.SolarSystemData();
endSolarSystemData.rotationEarth = (float) (2 * Math.PI);
endSolarSystemData.rotationMoon = (float) (2 * Math.PI * 13);
// 使用自定义的Evaluator
OrreryEvaluator orreryEvaluator = new OrreryEvaluator();
// ObjectAnimator orreryAnimator = ObjectAnimator.ofObject(
// myOrreryDrawable, "SolarSystemData", orreryEvaluator,
// startSolarSystemData, endSolarSystemData);
// ================================================================
// 尝试一下Keyframe
Keyframe startFrame = Keyframe.ofObject(0, startSolarSystemData);
Keyframe endFrame = Keyframe.ofObject(1, endSolarSystemData);
PropertyValuesHolder solarSystemFrames = PropertyValuesHolder
.ofKeyframe("SolarSystemData", startFrame, endFrame);
solarSystemFrames.setEvaluator(orreryEvaluator);
ObjectAnimator orreryAnimator = ObjectAnimator.ofPropertyValuesHolder(
myOrreryDrawable, solarSystemFrames);
// Default value is 10
Log.i("FrameDelay", "delay: " + ValueAnimator.getFrameDelay());
ValueAnimator.setFrameDelay(50);
orreryAnimator.setDuration(60000);
orreryAnimator.setInterpolator(new LinearInterpolator());
orreryAnimator.setRepeatCount(ValueAnimator.INFINITE);
orreryAnimator.setRepeatMode(ValueAnimator.RESTART);
orreryAnimator.start();
// add the fragment:
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.setCustomAnimations(R.anim.fade_in, android.R.animator.fade_out);
ft.add(R.id.frame, new OrreryInfo());
ft.commit();
}