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便于测试}

}

}

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐