Android 使用动画类自定义倒计时视图
我需要创建类似下图的内容: 我需要能够设置一个最大值,让它每秒倒计时,直到它达到0,显示该值,并让进度条也每秒移动 我使用这个库尝试了一系列不同的方法,但最终我不得不使用一个处理程序和单独的线程,在Android的生命周期中,控制线程完全是一场噩梦 这可以使用形状和动画来完成吗?我知道动画进步圈相当简单,但在中间显示这个数字我还没能做到。 编辑Android 使用动画类自定义倒计时视图,android,android-layout,Android,Android Layout,我需要创建类似下图的内容: 我需要能够设置一个最大值,让它每秒倒计时,直到它达到0,显示该值,并让进度条也每秒移动 我使用这个库尝试了一系列不同的方法,但最终我不得不使用一个处理程序和单独的线程,在Android的生命周期中,控制线程完全是一场噩梦 这可以使用形状和动画来完成吗?我知道动画进步圈相当简单,但在中间显示这个数字我还没能做到。 编辑 所以我发现这个库有一个setValueAnimated方法(RTFM)。。这似乎可以解决我的问题。不过,我还是有点担心库可能超出了我的需要。要设置文本
所以我发现这个库有一个setValueAnimated方法(RTFM)。。这似乎可以解决我的问题。不过,我还是有点担心库可能超出了我的需要。要设置文本动画,您可以执行以下操作:
public static void animateValue(Context context, final TextView textView, int duration,final double start, final double goal) {
if (start != goal) {
ValueAnimator animator = ValueAnimator.ofFloat((float) start, (float) goal);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.setDuration(duration));
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
textView.setText(formatPercentage((float)animation.getAnimatedValue()));
}
});
animator.start();
} else {
textView.setText(formatPercentage(goal));
}
}
public static String formatPercentage(final Float value) {
//TODO do your desiredFormat
}
对于你的进步,比如:
public static void animateProgress(final Context context, final ProgressBar progressBar, int duration, final int start, final int end) {
if (shouldAnimate(context) && start != end) {
ObjectAnimator animation = ObjectAnimator.ofInt(progressBar, "progress", start, end);
animation.setDuration(scaleDuration(context, duration));
animation.setInterpolator(new AccelerateDecelerateInterpolator());
animation.start();
} else {
progressBar.setProgress(end);
}
}
对你来说,你可以这样做:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@android:id/secondaryProgress">
<shape
android:innerRadiusRatio="@integer/progress_bar_circular_inner_ratio"
android:shape="ring"
android:useLevel="true"
android:thicknessRatio="@integer/progress_bar_circular_thickness">
<solid android:color="@color/">
</shape>
</item>
<item android:id="@android:id/progress">
<rotate
android:fromDegrees="270"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="270" >
<shape
android:innerRadiusRatio="@integer/progress_bar_circular_inner_ratio"
android:shape="ring"
android:useLevel="true"
android:thicknessRatio="@integer/progress_bar_circular_thickness">
<gradient
android:startColor="@color/"
android:endColor="@color/"
android:centerColor="@color/"
android:type="sweep" />
</shape>
</rotate>
</item>
</layer-list>
要设置文本动画,可以执行以下操作:
public static void animateValue(Context context, final TextView textView, int duration,final double start, final double goal) {
if (start != goal) {
ValueAnimator animator = ValueAnimator.ofFloat((float) start, (float) goal);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.setDuration(duration));
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
textView.setText(formatPercentage((float)animation.getAnimatedValue()));
}
});
animator.start();
} else {
textView.setText(formatPercentage(goal));
}
}
public static String formatPercentage(final Float value) {
//TODO do your desiredFormat
}
对于你的进步,比如:
public static void animateProgress(final Context context, final ProgressBar progressBar, int duration, final int start, final int end) {
if (shouldAnimate(context) && start != end) {
ObjectAnimator animation = ObjectAnimator.ofInt(progressBar, "progress", start, end);
animation.setDuration(scaleDuration(context, duration));
animation.setInterpolator(new AccelerateDecelerateInterpolator());
animation.start();
} else {
progressBar.setProgress(end);
}
}
对你来说,你可以这样做:
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@android:id/secondaryProgress">
<shape
android:innerRadiusRatio="@integer/progress_bar_circular_inner_ratio"
android:shape="ring"
android:useLevel="true"
android:thicknessRatio="@integer/progress_bar_circular_thickness">
<solid android:color="@color/">
</shape>
</item>
<item android:id="@android:id/progress">
<rotate
android:fromDegrees="270"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="270" >
<shape
android:innerRadiusRatio="@integer/progress_bar_circular_inner_ratio"
android:shape="ring"
android:useLevel="true"
android:thicknessRatio="@integer/progress_bar_circular_thickness">
<gradient
android:startColor="@color/"
android:endColor="@color/"
android:centerColor="@color/"
android:type="sweep" />
</shape>
</rotate>
</item>
</layer-list>
ValueAnimator看起来很有前途。关于从上面创建设计的布局资源有什么想法吗?谢谢你的帮助。我从旋转器开始。。。奇怪的是,动画在开始的4到5秒钟内没有开始,然后它们开始并迅速恢复。如果将其设置为60秒,则其持续时间约为该持续时间,但动画的移动并不一致。我在一个回收视图中使用它是为了它的价值。你有合适的插值器吗?你可以试着把660作为开始,1000作为目标。。它使动画变得平滑,是的,这很有意义——加速加速插值器。我现在正在取得一些进展。很好。如果你满意的话,别忘了接受我的答案。这个动画师看起来很有前途。关于从上面创建设计的布局资源有什么想法吗?谢谢你的帮助。我从旋转器开始。。。奇怪的是,动画在开始的4到5秒钟内没有开始,然后它们开始并迅速恢复。如果将其设置为60秒,则其持续时间约为该持续时间,但动画的移动并不一致。我在一个回收视图中使用它是为了它的价值。你有合适的插值器吗?你可以试着把660作为开始,1000作为目标。。它使动画变得平滑,是的,这很有意义——加速加速插值器。我正在取得一些进展。很好,如果你满意的话,别忘了接受我的回答