android声波定位,一个简单的Android自定义View - 音波波形图
public classWaveView extendsView {publicWaveView(Context context) {super(context);}publicWaveView(Context context,@NullableAttributeSet attrs) {super(context,attrs);init(attrs);}publicWaveView(Context
public classWaveView extendsView {
publicWaveView(Context context) {
super(context);}
publicWaveView(Context context,@NullableAttributeSet attrs) {
super(context,attrs);init(attrs);}
publicWaveView(Context context,@NullableAttributeSet attrs, intdefStyleAttr) {
super(context,attrs,defStyleAttr);init(attrs);}
privateInteger waveType;//波形展示类型private intcenterLineColor= Color.BLACK;private intcenterLineWidth= 1;private intlineColor= Color.GREEN;private intlineWidth= 10;//竖线的宽度private intlineSpace= 30;//竖线之间的间隔宽度public static final intWVTYPE_CENTER_LINE= 0;//竖线从中间开始 向上向下长度相同public static final intWVTYPE_SINGLE= 1;//竖线从底部开始向上计算privateList values;//存放数值private intfullValue= 100;//相对最大值private floatmScale= 0;//传入值转换为有效数值需要使用的比例private intmaxValue= 1;//当前数组中的最大值 该值乘以scale应等于fullValueprivate intmaxLineCount;private booleanhasOver;//值记录是否已完毕Paint paintCenterLine,paintLine;private voidinit(AttributeSet attrs){
finalTypedArray typedArray = getContext().obtainStyledAttributes(attrs,R.styleable.WaveView);waveType= typedArray.getInt(R.styleable.WaveView_wvType,0);centerLineColor= typedArray.getColor(R.styleable.WaveView_wvCenterLineColor,Color.BLACK);centerLineWidth= typedArray.getDimensionPixelSize(R.styleable.WaveView_wvCenterLineWidth,1);lineColor= typedArray.getColor(R.styleable.WaveView_wvLineColor,Color.GREEN);lineWidth= typedArray.getDimensionPixelSize(R.styleable.WaveView_wvLineWidth,10);lineSpace= typedArray.getDimensionPixelSize(R.styleable.WaveView_wvLineSpace,30);paintCenterLine= newPaint();paintCenterLine.setStrokeWidth(centerLineWidth);paintCenterLine.setColor(centerLineColor);paintLine= newPaint();paintLine.setStrokeWidth(lineWidth);paintLine.setAntiAlias(true);paintLine.setColor(lineColor);}
public voidputValue(intvalue){
if(value>maxValue){
maxValue= value;mScale= (float) fullValue/maxValue;}
if(values==null){
values= newArrayList<>();}else{
// values.add(value);// invalidate();}
values.add(value);invalidate();}
public voidsetHasOver(booleanover){
hasOver= over;}
public booleanhasOver(){
returnhasOver;}
private intlastX,moveX;private booleanhasBeenEnd=false;@Overridepublic booleanonTouchEvent(MotionEvent event) {
switch(event.getAction()) {
caseMotionEvent.ACTION_DOWN:
lastX= (int) (event.getRawX());break;caseMotionEvent.ACTION_MOVE:
intx = (int) event.getRawX();//到达边缘时不能向该方向继续移动if(!hasBeenEnd|| (moveX>0&&(lastX-x)<0||(moveX<0&&(lastX-x)>0))) {
moveX+= (lastX-x)*0.7;lastX= x;invalidate();}
break;}
return true;}
@Overrideprotected voidonDraw(Canvas canvas) {
intyCenter = getHeight() / 2;if(maxLineCount==0){
maxLineCount= getWidth()/(lineSpace+lineWidth);}
if(waveType==WVTYPE_CENTER_LINE){
/***************画中线*****************/canvas.drawLine(0,yCenter,getWidth(),yCenter,paintCenterLine);}
/***************画竖线*****************///判断当前数组中的数据是否超出了可画竖线最大条数if(values!=null){
/**找出当前第一条竖线以及偏移量*/intstartIndex = 0;//第一条线intstartOffset = 0;//第一条线的偏移if(!hasOver|| moveX==0){//仍在记录中或未手动滑动过//线条数量超出最大数 只画后面的线if(values.size()>maxLineCount){
startIndex = values.size()-maxLineCount;}
}else{//已结束录值 且x轴有过移动//先得到第一条线原本应该的位置if(values.size()>maxLineCount){
startIndex = values.size()-maxLineCount;}
//计算移动线条数intmoveLineSize = moveX/(lineWidth+lineSpace);startOffset = moveX%(lineWidth+lineSpace);intcurrentIndex = startIndex+moveLineSize;if(currentIndex<0){//到达最左边startIndex = 0;startOffset = 0;hasBeenEnd= true;}else if(currentIndex>=values.size()){
startIndex = values.size()-1;startOffset=0;hasBeenEnd= true;}else{
startIndex = currentIndex;hasBeenEnd= false;}
Log.d("XXXXXXX","move-x:"+moveX+" moveLineSize:"+moveLineSize
+" startIndex:"+startIndex+" startOffset:"+startOffset);}
//画竖线for(inti=startIndex;i
intstartX =0;intendX =0;intstartY =0;intendY =0;intlineHeight = (int) ((((float)values.get(i)*mScale)/fullValue)*getHeight());switch(waveType){
caseWVTYPE_CENTER_LINE:
startX = (i-startIndex)*(lineSpace+lineWidth)+lineWidth/2- startOffset ;endX = startX;startY = (getHeight()-lineHeight)/2;endY = (getHeight()-lineHeight)/2+lineHeight;break;caseWVTYPE_SINGLE:
startX = (i-startIndex)*(lineSpace+lineWidth)+lineWidth/2- startOffset ;endX = startX;startY = getHeight()-lineHeight;endY = getHeight();break;}
canvas.drawLine(startX,startY,endX,endY,paintLine);// Paint pNum = new Paint();// pNum.setColor(Color.RED);// canvas.drawText(""+i,startX,yCenter,pNum);画出竖线index便于测试}
}
}
}
更多推荐
所有评论(0)