/**
|
* Copyright (C) 2017 Baidu Inc. All rights reserved.
|
*/
|
package com.example.datalibrary.view;
|
|
import android.content.Context;
|
import android.graphics.Bitmap;
|
import android.graphics.BitmapFactory;
|
import android.graphics.Canvas;
|
import android.graphics.Color;
|
import android.graphics.Paint;
|
import android.graphics.PorterDuff;
|
import android.graphics.PorterDuffXfermode;
|
import android.graphics.Rect;
|
import android.graphics.RectF;
|
import android.text.TextUtils;
|
import android.util.AttributeSet;
|
import android.view.View;
|
|
import com.example.datalibrary.utils.DensityUtils;
|
|
|
/**
|
* 人脸检测区域View
|
*/
|
public class FaceRoundProView extends View {
|
/*圆相当于占短边的3/5*/
|
public static final float WIDTH_SPACE_RATIO = 0.3f;
|
public static final float HEIGHT_RATIO = 0.1f;
|
|
public static final int COLOR_BG = Color.parseColor("#121212");
|
|
private Paint mBGPaint;
|
private Paint mFaceRoundPaint;
|
private Paint mBitmapPaint;
|
private Paint mTextPaint;
|
private Paint mProgPaint; // 绘制画笔
|
|
private float mX;
|
private float mY;
|
private float mR;
|
|
private Bitmap mBitmap;
|
private String mTipText;
|
|
private boolean isDrawProgress;
|
public FaceRoundProView(Context context, AttributeSet attrs) {
|
super(context, attrs);
|
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
|
|
mBGPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
mBGPaint.setColor(COLOR_BG);
|
mBGPaint.setStyle(Paint.Style.FILL);
|
mBGPaint.setAntiAlias(true);
|
mBGPaint.setDither(true);
|
|
mFaceRoundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
// mFaceRoundPaint.setColor(COLOR_ROUND);
|
mFaceRoundPaint.setStyle(Paint.Style.FILL);
|
mFaceRoundPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
|
mFaceRoundPaint.setAntiAlias(true);
|
mFaceRoundPaint.setDither(true);
|
|
// 初始化进度圆环画笔
|
mProgPaint = new Paint();
|
mProgPaint.setStyle(Paint.Style.STROKE); // 只描边,不填充
|
mProgPaint.setStrokeCap(Paint.Cap.ROUND); // 设置圆角
|
mProgPaint.setAntiAlias(true); // 设置抗锯齿
|
mProgPaint.setDither(true); // 设置抖动
|
mProgPaint.setStrokeWidth(22);
|
mProgPaint.setColor(Color.parseColor("#00BAF2"));
|
|
mBitmapPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
mBitmapPaint.setColor(Color.RED);
|
mBitmapPaint.setStrokeWidth(3);
|
mBitmapPaint.setAntiAlias(true);
|
mBitmapPaint.setDither(true);
|
|
mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
mTextPaint.setColor(Color.WHITE);
|
mTextPaint.setTextSize(DensityUtils.dip2px(getContext(), 22));
|
mTextPaint.setTextAlign(Paint.Align.CENTER);
|
mTextPaint.setAntiAlias(true);
|
mTextPaint.setDither(true);
|
}
|
|
public float getRound() {
|
return mR;
|
}
|
|
public void setBitmapSource(int source , boolean isDrawProgress) {
|
mBitmap = BitmapFactory.decodeResource(getResources(), source);
|
this.isDrawProgress = isDrawProgress;
|
invalidate();
|
}
|
|
public void setTipText(String tipText) {
|
mTipText = tipText;
|
if (!TextUtils.isEmpty(tipText)) {
|
invalidate();
|
}
|
}
|
|
@Override
|
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
float canvasWidth = right - left;
|
float canvasHeight = bottom - top;
|
if (canvasWidth >= canvasHeight) {
|
// 横屏显示器
|
float x = canvasWidth / 2;
|
float y = (canvasHeight / 2) - ((canvasHeight / 2) * HEIGHT_RATIO);
|
float r = canvasHeight * WIDTH_SPACE_RATIO;
|
mX = x;
|
mY = y;
|
mR = r;
|
} else {
|
// 竖屏显示器
|
float x = canvasWidth / 2;
|
float y = canvasHeight / 2;
|
float r = canvasWidth / 3;
|
|
mX = x;
|
mY = y;
|
mR = r;
|
}
|
}
|
|
|
@Override
|
public void onDraw(Canvas canvas) {
|
super.onDraw(canvas);
|
// 遮罩
|
canvas.drawColor(Color.TRANSPARENT);
|
canvas.drawPaint(mBGPaint);
|
canvas.drawCircle(mX, mY, mR, mFaceRoundPaint);
|
// 画图片
|
if (mBitmap != null) {
|
Rect src = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight()); // 原图片
|
Rect dst = new Rect((int) (mX - mR - 30), (int) (mY - mR - 30),
|
(int) (mX + mR + 30), (int) (mY + mR + 30)); // 目标图片
|
canvas.drawBitmap(mBitmap, src, dst, mBitmapPaint);
|
}
|
// 画文字
|
if (!TextUtils.isEmpty(mTipText)) {
|
float instance = getBottom() - getTop() - mY;
|
if (516 > instance) { // 516为效果图尺寸间距,33为字体高度的一半
|
canvas.drawText(mTipText, mX, mY + instance - 33, mTextPaint);
|
} else {
|
canvas.drawText(mTipText, mX, mY + 516, mTextPaint);
|
}
|
}
|
if (isDrawProgress){
|
RectF mRectF = new RectF((int) (mX - mR - 25), (int) (mY - mR - 25),
|
(int) (mX + mR + 25), (int) (mY + mR + 25));
|
canvas.drawArc(mRectF, 275, 360 * 75 / 100,
|
false, mProgPaint);
|
}
|
|
}
|
private static int dip2px(Context context, float dpValue) {
|
final float scale = context.getResources().getDisplayMetrics().density;
|
return (int) (dpValue * scale + 0.5f);
|
}
|
|
}
|