语音条view 白色的一排竖线21个,通过setEffect();方法设置音量,第一个参数是说话的时候当时音量的值,第二个参数是音量的最大值;
在这里插入代码片
package com.example.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import java.util.Random;
public class LineSoundEffectView extends View {
private Paint paint;
// dp转px的工具,自己网上找个
public final int ticksWidth = DensityUtils.dip2px(getContext(), 3f);
public final int dividerWidth = DensityUtils.dip2px(getContext(), 5f);
public final int ticksMaxHeight = DensityUtils.dip2px(getContext(), 30f);
public final int ticksMinHeight = DensityUtils.dip2px(getContext(), 6f);
public final int ticksNumber = 21;
public final int fixOffset = (ticksMaxHeight - ticksMinHeight) / 2;
// 计算总宽度
public final int totalWidth = ticksWidth * ticksNumber + (dividerWidth * ticksNumber - 1);
public LineSoundEffectView(Context context) {
super(context);
init();
}
public LineSoundEffectView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public LineSoundEffectView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
paint = new Paint();
paint.setColor(Color.WHITE);
paint.setAntiAlias(true);
paint.setDither(true);
offsetVertical = fixOffset;
invalidate();
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
private int offsetVertical = 0;
private int totalNum = 21;
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int desiredWidth = totalWidth; // 假设我们想要设置的宽度为200px
int desiredHeight = ticksMaxHeight; // 假设我们想要设置的高度为200px
// 设置实际的宽度和高度
setMeasuredDimension(desiredWidth, desiredHeight);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int i = 0; i < totalNum; i++) {
int topY = offsetVertical;
int bottomY = ticksMaxHeight - offsetVertical < ticksMinHeight ? ticksMinHeight :
ticksMaxHeight - offsetVertical;
if (i < 4) {
topY = fixOffset;
bottomY = ticksMaxHeight - fixOffset;
paint.setAlpha((int) ((i + 1) * 255 / 6f));
} else if (i >= totalNum - 4) {
topY = fixOffset;
bottomY = ticksMaxHeight - fixOffset;
paint.setAlpha((int) ((totalNum - i) * 255 / 5f));
} else {
// random 越大,音波越小
int random = offsetVertical <= fixOffset ? i % 2 == 0 ? Math.abs(i < totalNum / 2 ? totalNum / 2 - i : i - totalNum / 2) : 0:Math.abs(i < totalNum / 2 ? totalNum / 2 - i : i - totalNum / 2)%5;
int i1 = offsetVertical + random > fixOffset ? fixOffset : offsetVertical + random;
topY = i1;<