Android 使用动画类自定义倒计时视图

Android 使用动画类自定义倒计时视图,android,android-layout,Android,Android Layout,我需要创建类似下图的内容: 我需要能够设置一个最大值,让它每秒倒计时,直到它达到0,显示该值,并让进度条也每秒移动 我使用这个库尝试了一系列不同的方法,但最终我不得不使用一个处理程序和单独的线程,在Android的生命周期中,控制线程完全是一场噩梦 这可以使用形状和动画来完成吗?我知道动画进步圈相当简单,但在中间显示这个数字我还没能做到。 编辑 所以我发现这个库有一个setValueAnimated方法(RTFM)。。这似乎可以解决我的问题。不过,我还是有点担心库可能超出了我的需要。要设置文本

我需要创建类似下图的内容:

我需要能够设置一个最大值,让它每秒倒计时,直到它达到0,显示该值,并让进度条也每秒移动

我使用这个库尝试了一系列不同的方法,但最终我不得不使用一个处理程序和单独的线程,在Android的生命周期中,控制线程完全是一场噩梦

这可以使用形状和动画来完成吗?我知道动画进步圈相当简单,但在中间显示这个数字我还没能做到。

编辑


所以我发现这个库有一个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作为目标。。它使动画变得平滑,是的,这很有意义——加速加速插值器。我正在取得一些进展。很好,如果你满意的话,别忘了接受我的回答