package com.example.hsy.test4surfaceviewcircleanimation; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.View; /** * Created by hsy on 2015/7/23. */ public class WaveView extends View { // 圆环总数 private int mRingsCount = 1; // 记录每一个环的当前半径 private int[] mRingsRadius = new int[mRingsCount]; // 环的宽度 private int mRingWidth = 3; // 每次递增的步长 private int mStep = 2; // 最大半径 private int mMaxRadius = 100; // 最小半径 private int mMinRadius = 10; // 中心位置 private int mCenter = 0; // 画笔 private Paint mPaint; public WaveView(Context context) { super(context); } public WaveView(Context context, AttributeSet attrs) { super(context, attrs); } public WaveView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); init(); } private void init() { // 设置画笔 mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(mRingWidth); // 设置最大最小半径 mMaxRadius = getWidth() / 2; mMinRadius = 150; mCenter = getWidth() / 2; // 设置环数及初始半径 mRingsCount = 2; mRingsRadius = new int[mRingsCount]; mRingsRadius[0] = mMinRadius; mRingsRadius[1] = (mMinRadius + mMaxRadius) / 2; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); for (int i = 0; i < mRingsRadius.length; i++) { drawRing(canvas, i); } updateRadius(); invalidate(); } private void updateRadius() { for (int i = 0; i < mRingsRadius.length; i++) { mRingsRadius[i] += mStep; if (mRingsRadius[i] > mMaxRadius) { mRingsRadius[i] = mMinRadius; } } } private void drawRing(Canvas canvas, int i) { int currentRadius = mRingsRadius[i]; int color = getColor(currentRadius); mPaint.setColor(color); canvas.drawCircle(mCenter, mCenter, currentRadius, mPaint); } private int getColor(int radius) { // 在半径的变化过程中,透明度的变化是:100->0->100 { int total = mMaxRadius - mMinRadius; int halfTotal = total/2; float deltaRadius = radius - mMinRadius; float ratio = 0; if (deltaRadius <halfTotal){ ratio = deltaRadius/halfTotal; }else { ratio = 2.0f - deltaRadius/halfTotal; } int alpha = (int) (255*ratio); return Color.argb(alpha, 255, 137, 3); } // int total = mMaxRadius - mMinRadius; // float ratio = (radius - mMinRadius) * 1.0f / total; // if (ratio < 0) { // ratio = 0; // } // int alpha = (int) ((1.0f - ratio) * 255); // return Color.argb(alpha, 255, 137, 3); } }