package com.cjj; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; import android.view.View; /** * Created by cjj on 2016/2/20. */ public class SunFaceView extends View { private static final String Tag = SunFaceView.class.getSimpleName(); private static final int DEFAULT_SUN_RADIUS = 12;//太阳的半径 private static final int DEFAULT_EYES_RADIUS = 2;//眼睛的半径 private int mHeight, mWidth; private Paint mCirclePaint;//画圆的画笔 private int mSunRadius;//sun radius private int mEyesRadius = DEFAULT_EYES_RADIUS; private Rect debugRect; private RectF mouthRect; private int mSunColor;//sun color private boolean isDrawFace = true; private int mouthStro = 3; public SunFaceView(Context context) { this(context, null); } public SunFaceView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SunFaceView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { Log.i(Tag, "init"); mSunRadius = changeDp(DEFAULT_SUN_RADIUS); mEyesRadius = changeDp(DEFAULT_EYES_RADIUS); //圆的配置 mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mCirclePaint.setColor(Color.RED); mCirclePaint.setStyle(Paint.Style.FILL); debugRect = new Rect(); mouthRect = new RectF(); } /** * 设置太阳半径 * * @param sunRadius */ public void setSunRadius(int sunRadius) { mSunRadius = changeDp(sunRadius); invalidate(); } /** * 设置眼睛大小 * @param eyesSize */ public void setEyesSize(int eyesSize){ mEyesRadius = changeDp(eyesSize); invalidate(); } /** * 设置嘴巴粗细 * @param mouthStro */ public void setMouthStro(int mouthStro){ this.mouthStro = mouthStro; invalidate(); } /** * 刷新用的效果 * @param sunRadius * @param per */ public void setPerView(int sunRadius ,float per){ sunRadius = changeDp(sunRadius); if(per>=0.8){ isDrawFace = true; }else { isDrawFace = false; } per = Math.min(per,1); float tempRadius = sunRadius*per; mSunRadius = (int) tempRadius; mCirclePaint.setAlpha((int)per*255); invalidate(); } /** * 设置sun color * * @param sunColor */ public void setSunColor(int sunColor) { mSunColor = sunColor; invalidate(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); Log.i(Tag, "w---->" + w + " ------- h----->" + h); mWidth = w; mHeight = h; debugRect.left = mWidth / 2 - mSunRadius; debugRect.right = mWidth / 2 + mSunRadius; debugRect.top = mHeight / 2 - mSunRadius; debugRect.bottom = mHeight / 2 + mSunRadius; mouthRect.left = mWidth / 2 - mSunRadius / 2; mouthRect.right = mWidth / 2 + mSunRadius / 2; mouthRect.top = mHeight / 2 - mSunRadius / 2; mouthRect.bottom = mHeight / 2 + mSunRadius / 2; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { Log.i(Tag, "onMeasure"); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height; if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else { width = mSunRadius * 2 + getPaddingRight() + getPaddingLeft(); } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else { height = mSunRadius * 2 + getPaddingTop() + getPaddingBottom(); } setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawCircle(canvas); mCirclePaint.setStyle(Paint.Style.STROKE); // canvas.drawRect(debugRect, mCirclePaint); // canvas.drawRect(mouthRect, mCirclePaint); } private void drawCircle(Canvas canvas) { mCirclePaint.setColor(mSunColor); mCirclePaint.setStyle(Paint.Style.FILL); canvas.drawCircle(mWidth / 2, mHeight / 2, mSunRadius, mCirclePaint); mCirclePaint.setColor(Color.WHITE); if(isDrawFace) { canvas.save(); canvas.drawCircle(mWidth / 2 - mSunRadius / 2 + mEyesRadius, mHeight / 2 - mSunRadius / 2 + mEyesRadius, mEyesRadius, mCirclePaint); canvas.drawCircle(mWidth / 2 + mSunRadius / 2 - mEyesRadius, mHeight / 2 - mSunRadius / 2 + mEyesRadius, mEyesRadius, mCirclePaint); mCirclePaint.setStyle(Paint.Style.STROKE); mCirclePaint.setStrokeWidth(mouthStro); canvas.drawArc(mouthRect, 20, 140, false, mCirclePaint); canvas.restore(); } } public int changeDp(int value) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, getResources().getDisplayMetrics()); } }