自定义圆环:两个圆重叠就是圆环,我们可以把半径大的圆形用若干不同颜色的扇形拼接起来,就可以构造一个不同颜色的圆环,贴一下代码(本来写的是有很多文字的,但是手残,点击了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