自定义ViewGroup实现进度动态更新效果

自定义ViewGroup实现进度动态更新效果,效果图如下:


package com.example.think.myapplication;


import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.animation.AccelerateInterpolator;
import android.widget.LinearLayout;


/**
 * 投票进度显示容器
 * @author [email protected]
 */
public class VoteGroup extends LinearLayout {
    private float cProgress; // 当前进度
    private Paint mPaint; // 背景色画笔
    private long mDuration = 1500; // 动画持续时间


    private final int MAX_ALPHA = 155; // 最大透明阀值
    private final int MAX_PROGRESS = 100; // 最大进度值


    public VoteGroup(Context context) {
        this(context, null);
    }


    public VoteGroup(Context context, AttributeSet attrs) {
        this(context, attrs, -1);
    }


    public VoteGroup(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mPaint = new Paint();
    }


    /**
     * 设置动画时间
     * @param duration 毫秒
     */
    public void setDuration(int duration)
    {
        mDuration = duration;
    }


    /**
     * 非动画显示进度
     * @param progress 进度
     * @param color 颜色值
     */
    public void setProgress(float progress, int color)
    {
        setProgress(progress, color, false);
    }


    /**
     * 是否使用动画方式显示进度
     * @param progress 进度
     * @param color 颜色值
     * @param animated 是否使用动画
     */
    public void setProgress(float progress, int color, boolean animated)
    {
        mPaint.setColor(color);
        if (animated)
        {
            ValueAnimator animator = ValueAnimator.ofFloat(0f, progress);
            animator.setDuration(mDuration);
            animator.setInterpolator(new AccelerateInterpolator());
            animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    invalidate((float)animation.getAnimatedValue());
                }
            });
            animator.start();;
        }
        else
        {
            invalidate(progress);
        }
    }


    /**
     * 刷新视图
     * @param progress 进度
     */
    private void invalidate(float progress)
    {
        if (progress > MAX_PROGRESS)
        {
            progress = MAX_PROGRESS;
        }
        cProgress = progress;
        /**
         * 设置透明度
         * @see #MAX_ALPHA
         */
        int alpha = (int)((cProgress / MAX_PROGRESS) * MAX_ALPHA);
        mPaint.setAlpha(alpha);
        invalidate();
    }


    /**
     * 绘制完children之后根据进度绘制自身
     * @param canvas
     */
    @Override
    protected void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);
        canvas.drawRect(0, 0, getMeasuredWidth() * cProgress / MAX_PROGRESS, getMeasuredHeight(), mPaint);
    }
}

你可能感兴趣的:(自定义ViewGroup实现进度动态更新效果)