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便於測試}
}
}
}