package com.common.commonlib.view; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.View; import androidx.annotation.Nullable; import com.common.commonlib.R; /** * mic自定义View * * @author miracle * @since 2021/8/2 */ public class MikeView extends View { //进度条格数 private final int COUNT = 16; //宽、高、间隔、进度条居上距离 private int mVoiceRectW = 1; private int mVoiceRectH = 10; private int mInterval = 3; private int mVoiceRectMarginTop = 83; //mic 文字 进度条 背景 private Paint mImagePaint; private Paint mVoiceRectPaint; private Paint mBackgroundPaint; private Bitmap mVoiceRecording;//mic图片 //屏幕宽高 private int SCREEN_HEIGHT = 0; private int SCREEN_WIDTH = 0; private int mVoiceRectStart = 0, mDescriptionW = 0;//进度条开始左边位置、文字长度 private int mCurrentPosition = 0;//当前位置 private int mBackgroundRound = 3;//背景圆角 private int mImageW = 42;//新mic图片宽 private int mImageH = 42;//新mic图片高 private int mMarginTop = 25, mTextMarginBottom = 11;//mic图片居上距离 文字居底部距离 public MikeView(Context context) { this(context, null); } public MikeView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public MikeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { DisplayMetrics dm = getResources().getDisplayMetrics(); mImageW = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mImageW, dm); mImageH = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mImageH, dm); mMarginTop = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mMarginTop, dm); mTextMarginBottom = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mTextMarginBottom, dm); mVoiceRectW = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mVoiceRectW, dm); mVoiceRectH = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mVoiceRectH, dm); mInterval = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mInterval, dm); mVoiceRectMarginTop = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mVoiceRectMarginTop, dm); mBackgroundRound = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mBackgroundRound, dm); mImagePaint = new Paint(); mVoiceRectPaint = new Paint(); mVoiceRectPaint.setColor(Color.WHITE); mBackgroundPaint = new Paint(); mBackgroundPaint.setColor(Color.TRANSPARENT);//背景颜色 mVoiceRecording = BitmapFactory.decodeResource(getResources(), R.drawable.mike); mVoiceRecording = scaleBitmap(mVoiceRecording, mImageW, mImageH); setWillNotDraw(false); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (SCREEN_HEIGHT == 0 || SCREEN_WIDTH == 0) { SCREEN_HEIGHT = getHeight(); SCREEN_WIDTH = getWidth(); } if (mVoiceRectStart <= 0) { mVoiceRectStart = SCREEN_WIDTH / 2 - (COUNT * mVoiceRectW + (COUNT - 1) * mInterval) / 2; } canvas.drawRoundRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, mBackgroundRound, mBackgroundRound, mBackgroundPaint);//画灰色背景和圆角 canvas.drawBitmap(mVoiceRecording, SCREEN_WIDTH / 2 - mVoiceRecording.getWidth() / 2, mMarginTop, mImagePaint);//画mic图片 //画前几个是白色 后几个是灰色 for (int i = 0; i < COUNT; i++) { if (i < mCurrentPosition) { mVoiceRectPaint.setColor(Color.WHITE); } else { mVoiceRectPaint.setColor(Color.parseColor("#73FFFFFF")); } canvas.drawRect(i * mVoiceRectW + (i * mInterval) + mVoiceRectStart, mVoiceRectMarginTop, i * mVoiceRectW + (i * mInterval) + mVoiceRectW + mVoiceRectStart, mVoiceRectMarginTop + mVoiceRectH, mVoiceRectPaint); } } public void setIndex(int p) { if (p < 0) { p = 0; } if (p >= COUNT) { p = COUNT - 1; } mCurrentPosition = p; postInvalidate(); } public void setIndex(double percent) { int p = (int) (COUNT * percent); setIndex(p); } /** * bitmap 缩放 * * @param origin 源 * @param newWidth 宽 * @param newHeight 高 * @return bitmap */ private Bitmap scaleBitmap(Bitmap origin, int newWidth, int newHeight) { if (origin == null) { return null; } int height = origin.getHeight(); int width = origin.getWidth(); float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight);// 使用后乘 Bitmap newBM = Bitmap.createBitmap(origin, 0, 0, width, height, matrix, false); if (!origin.isRecycled()) { origin.recycle(); } return newBM; } }