自定义带动画的环形图

自定义圆环:两个圆重叠就是圆环,我们可以把半径大的圆形用若干不同颜色的扇形拼接起来,就可以构造一个不同颜色的圆环,贴一下代码(本来写的是有很多文字的,但是手残,点击了F5,又没有保存草稿,所以贴下代码吧,代码里也有注释):

package com.maoyudun.panittest;

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.RelativeLayout;

import java.util.ArrayList;
import java.util.Iterator;

public class MainActivity extends AppCompatActivity
{
    RelativeLayout relativeLayout;
    float x, y;
    int RADIUS = 200;
    int RADIUS1 = 170;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        relativeLayout = findViewById(R.id.relativeLayout);
        /**屏幕可操作区域的中心点坐标*/
        x = getWindowManager().getDefaultDisplay().getWidth();
        y = getWindowManager().getDefaultDisplay().getHeight() - getStatusHeight();
        relativeLayout.addView(new CustomeView(this));
    }

    class CustomeView extends View
    {
        float animatedValue = 0f;
        public CustomeView(Context context)
        {
            super(context);
            /**定义动画*/
            initAnimator();
        }

        @Override
        protected void onDraw(Canvas canvas)
        {
            /**两个圆重叠就是圆环*/
            super.onDraw(canvas);
            Paint paint = new Paint();
            paint.setStyle(Paint.Style.FILL);
            paint.setAntiAlias(true);
            RectF rectF = new RectF(x / 2 - RADIUS, y / 2 - RADIUS, x / 2 + RADIUS, y / 2 + RADIUS);
            int[] colors = {R.color.color1, R.color.color2, R.color.color3, R.color.color4};
            float[] angles = {30, 130, 80, 120};
            float currentAngel = 0;
            for (int i = 0; i < angles.length; i++)
            {
                /**因为animatedValue初始值为0,所以不能在animatedValue的值未发生变化的时候进行画图要不然第一次绘的时候是逆时针绘的(自己模拟一遍for循环里边的逻辑就知道了)*/
                if(Math.min(angles[i] - 1, animatedValue - currentAngel) >= 0)
                {
                    paint.setColor(getResources().getColor(colors[i]));
                    /**当animatedValue小于此次循环需要绘画的角度时,就只绘画animatedValue-currentAngel的角度
                     * 注意:调用重绘的时候,是把之前绘画的内容全部抹了的*/
                    canvas.drawArc(rectF, currentAngel, Math.min(angles[i] - 1, animatedValue - currentAngel), true, paint);
                    currentAngel = currentAngel + angles[i];
                }
            }
            paint.setColor(Color.WHITE);
            canvas.drawCircle(x / 2, y / 2, RADIUS1, paint);
            paint.setColor(Color.GRAY);
            int textHeight = 32;
            paint.setTextSize(textHeight);
            String text = "9999999元";
            float width = paint.measureText(text);
            /**文字的绘制起点在圆心的左边和下边,宽度是文字宽度的一半
             * 高度时位子高度的一般*/
            canvas.drawText(text, x / 2 - width / 2, y / 2 + textHeight / 2, paint);
        }

        private void initAnimator()
        {
            /**anim的值从0到360开始变化
             * ValueAnimator:属性动画,功能强大,可研究性很强*/
            ValueAnimator anim = ValueAnimator.ofFloat(0, 360);
            /**三秒的时间进行动画的展现*/
            anim.setDuration(3000);
            /**设置动画为先加速后减速  还有更多属性 用到时候再说(自己探索吧)*/
            anim.setInterpolator(new AccelerateDecelerateInterpolator());
            anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
            {
                /**anim的值发生变化的时候,把其值赋给animatedValue,并重绘(只调用onDraw函数)*/
                @Override
                public void onAnimationUpdate(ValueAnimator valueAnimator)
                {
                    /**获取到ValueAnimator的value值*/
                    animatedValue = (float) valueAnimator.getAnimatedValue();
                    /**重绘函数*/
                    invalidate();
                }
            });
            anim.start();
        }
    }

    /**获取状态栏高度*/
    private int getStatusHeight()
    {
        int id;
        id = getResources().getIdentifier("status_bar_height", "dimen", "android");
        if(id > 0)
        {
            return getResources().getDimensionPixelSize(id);
        }else
        {
            return 0;
        }
    }
}
项目下载地址:http://download.csdn.net/download/u013908616/10203090

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值