Android自定义view实现车载可调整轨迹线
本文实例为大家分享了Android自定义view完成车载可调整轨迹线的具体代码,供大家参考,具体内容如下
同事做的view,拿过来做个记录。
/** * */ packagecom.text.myviewdemo.view; importorg.apache.http.conn.routing.RouteInfo.LayerType; importandroid.content.Context; importandroid.graphics.Canvas; importandroid.graphics.Color; importandroid.graphics.DashPathEffect; importandroid.graphics.Paint; importandroid.graphics.PorterDuff; importandroid.graphics.PorterDuffXfermode; importandroid.graphics.Xfermode; importandroid.graphics.PorterDuff.Mode; importandroid.util.AttributeSet; importandroid.util.Log; importandroid.view.MotionEvent; importandroid.view.View; /** *@authorchenhanrong * */ publicclassCCViewextendsViewimplementsandroid.view.View.OnClickListener{ privatePaintpaint; privatefloat[]line_r,line_l,line_1,line_2,line_3,line_t; //privatefloatline1YL,line1YR,line2YL,line2YR,line3YL,line3YR; publicContextcontext; privatefloatradiu; privatebooleanshowPoint=false; privatebooleancmP1=false; privatebooleancmP2=false; privatebooleancmP3=false; privatebooleancmP4=false; privatebooleancmP5=false; privatebooleancmP6=false; privatebooleancmP7=false; privatebooleancmP8=false; privatebooleancmP9=false; privatebooleancmP10=false; privatebooleanisfirst=true; privatebooleanisMove=false; publicfinalstaticintD_LEFT=0; publicfinalstaticintD_RIGHT=1; publicfinalstaticintTYPE_MIN=0; publicfinalstaticintTYPE_MAX=1; publicCCView(Contextcontext){ this(context,null); } publicCCView(Contextcontext,AttributeSetattrs){ this(context,attrs,0); } publicCCView(Contextcontext,AttributeSetattrs,intdefStyleAttr){ super(context,attrs,defStyleAttr); this.context=context; init(); } /** *初始化控件 */ privatevoidinit(){ paint=newPaint(); /** *去锯齿 */ paint.setAntiAlias(true); /** *设置paint的颜色 */ paint.setColor(Color.RED); /** *设置paint的style */ paint.setStyle(Paint.Style.FILL); /** *设置paint的外框宽度 */ paint.setStrokeWidth(10); setOnClickListener(this); setOnTouchListener(newOnTouchListener(){ @Override publicbooleanonTouch(Viewv,MotionEventevent){ returnfalse; } }); setLayerType(LAYER_TYPE_HARDWARE,paint); radiu=20f; } @Override protectedvoidonDraw(Canvascanvas){ super.onDraw(canvas); canvas.drawColor(0x00000000,PorterDuff.Mode.CLEAR); //paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.DST_OVER)); if(isfirst){ line_l=newfloat[]{getWidth()/4,getHeight()/4,getWidth()/8,getHeight()}; line_r=newfloat[]{3*getWidth()/4,getHeight()/4,7*getWidth()/8,getHeight()}; line_1=newfloat[]{getPointX(line_l,line_l[1]*2f),line_l[1]*2f,getPointX(line_r,line_r[1]*2f),line_r[1]*2f}; line_2=newfloat[]{getPointX(line_l,line_l[1]*2.5f),line_l[1]*2.5f,getPointX(line_r,line_r[1]*2.5f),line_r[1]*2.5f}; line_3=newfloat[]{getPointX(line_l,line_l[1]*3f),line_l[1]*3f,getPointX(line_r,line_r[1]*3f),line_r[1]*3f}; isfirst=false; } intcanvasWidth=canvas.getWidth(); intcanvasHeight=canvas.getHeight(); intlayerId=canvas.saveLayer(0,0,canvasWidth,canvasHeight,null,Canvas.ALL_SAVE_FLAG); //paint.setXfermode(newPorterDuffXfermode(Mode.DST_OVER)); line_t=newfloat[]{getPointX(line_l,line_l[1]),line_l[1],getPointX(line_r,line_r[1]),line_r[1]}; if(showPoint){ //四条横线 canvas.drawLines(line_t,paint); paint.setPathEffect(newDashPathEffect(newfloat[]{20,5},0)); canvas.drawLines(line_1,paint); paint.setColor(Color.GREEN); canvas.drawLines(line_2,paint); paint.setColor(Color.YELLOW); canvas.drawLines(line_3,paint); paint.setColor(Color.RED); paint.setPathEffect(null); //左右两边线 canvas.drawLines(line_l,paint); canvas.drawLines(line_r,paint); //中间三条横线交点 canvas.drawCircle(line_1[0],line_1[1],radiu,paint); canvas.drawCircle(line_1[2],line_1[3],radiu,paint); paint.setColor(Color.GREEN); canvas.drawCircle(line_2[0],line_2[1],radiu,paint); canvas.drawCircle(line_2[2],line_2[3],radiu,paint); paint.setColor(Color.YELLOW); canvas.drawCircle(line_3[0],line_3[1],radiu,paint); canvas.drawCircle(line_3[2],line_3[3],radiu,paint); paint.setColor(Color.RED); //左右四点 canvas.drawCircle(line_l[0],line_l[1],radiu,paint); canvas.drawCircle(line_l[2],line_l[3],radiu,paint); canvas.drawCircle(line_r[0],line_r[1],radiu,paint); canvas.drawCircle(line_r[2],line_r[3],radiu,paint); }else{ floatlf=getDashLineLength(D_LEFT); floatrf=getDashLineLength(D_RIGHT); canvas.drawLines(line_t,paint); paint.setPathEffect(newDashPathEffect(newfloat[]{20,5},0)); canvas.drawLine(line_1[0],line_1[1],lf,getPointY(line_1,lf),paint); canvas.drawLine(rf,getPointY(line_1,rf),line_1[2],line_1[3],paint); paint.setColor(Color.GREEN); canvas.drawLine(line_2[0],line_2[1],lf,getPointY(line_2,lf),paint); canvas.drawLine(rf,getPointY(line_2,rf),line_2[2],line_2[3],paint); paint.setColor(Color.YELLOW); canvas.drawLine(line_3[0],line_3[1],lf,getPointY(line_3,lf),paint); canvas.drawLine(rf,getPointY(line_3,rf),line_3[2],line_3[3],paint); paint.setPathEffect(null); paint.setColor(Color.RED); //左右两边线 canvas.drawLines(line_l,paint); canvas.drawLines(line_r,paint); canvas.drawCircle(line_l[0],line_l[1],paint.getStrokeWidth()/2,paint); canvas.drawCircle(line_r[0],line_r[1],paint.getStrokeWidth()/2,paint); } //paint.setStyle(Paint.Style.STROKE); paint.setColor(Color.RED); paint.setPathEffect(null); paint.setXfermode(null); canvas.restoreToCount(layerId); } /** *获取坐标x *@paramline直线坐标系 *@paramyy点 *@return */ privatefloatgetPointX(float[]line,floaty){ floatx=0; //Log.d("chr","line====>"+line.length+":::y====>"+y); floatx1=line[0]; floaty1=line[1]; floatx2=line[2]; floaty2=line[3]; x=((y-y1)/(y2-y1))*(x2-x1)+x1; returnx; } /** *获取坐标y *@paramline:直线坐标系 *@paramx:x点 *@return */ privatefloatgetPointY(float[]line,floatx){ floaty=0; //Log.d("chr","line====>"+line.length+":::y====>"+y); floatx1=line[0]; floaty1=line[1]; floatx2=line[2]; floaty2=line[3]; y=((x-x1)/(x2-x1))*(y2-y1)+y1; returny; } /** *获取点应该移动到的Y坐标 *@paramline:线段坐标 *@paramy:滑动时的y坐标 *@return */ privatefloatgetMoveY(float[]line,floaty){ if(y<=line[1]+radiu){ y=line[1]+radiu*2.0f; } if(y>=line[3]-radiu*2.0f){ y=line[3]-radiu*2.0f; } returny; } /** * *@paramdirection获取虚线长度 *@return */ privatefloatgetDashLineLength(intdirection){ floatlength=0; inta=20; switch(direction){ caseD_LEFT: length=line_t[0]+(line_t[2]-line_t[0])/a; break; caseD_RIGHT: length=line_t[0]+(a-1)*(line_t[2]-line_t[0])/a; break; } returnlength; } /** *获取最小值 *@return */ privatefloatgetMinPoint(floatpoint[]){ floatmin=point[0]; for(inti=0;ipoint[i]){ min=point[i]; } } returnmin; } /** *获取最大值 *@return */ privatefloatgetMaxPoint(floatpoint[]){ floatmax=point[0]; for(inti=0;i limt-radiu*2.0f){ y=limt-radiu*2.0f; } } if(type==TYPE_MAX){ floatlimt2=getMaxPoint(point); if(y "+x+"::::y===>"+y); if(x<=(line_l[0]+radiu*2.0f) &&x>=(line_l[0]-radiu*2.0f) &&y>=(line_l[1]-radiu*2.0f) &&y<=(line_l[1]+radiu*2.0f)){ cmP1=true; } elseif(x<=(line_r[0]+radiu*2.0f) &&x>=(line_r[0]-radiu*2.0f) &&y>=(line_r[1]-radiu*2.0f) &&y<=(line_r[1]+radiu*2.0f)){ cmP2=true; }elseif(x<=(line_l[2]+radiu*2.0f) &&x>=(line_l[2]-radiu*2.0f) &&y>=(line_l[3]-radiu*2.0f) &&y<=(line_l[3]+radiu*2.0f)){ cmP3=true; }elseif(x<=(line_r[2]+radiu*2.0f) &&x>=(line_r[2]-radiu*2.0f) &&y>=(line_r[3]-radiu*2.0f) &&y<=(line_r[3]+radiu*2.0f)){ cmP4=true; }elseif(x<=(line_1[0]+radiu*2.0f) &&x>=(line_1[0]-radiu*2.0f) &&y>=(line_1[1]-radiu*2.0f) &&y<=(line_1[1]+radiu*2.0f)){ cmP5=true; }elseif(x<=(line_1[2]+radiu*2.0f) &&x>=(line_1[2]-radiu*2.0f) &&y>=(line_1[3]-radiu*2.0f) &&y<=(line_1[3]+radiu*2.0f)){ cmP6=true; }elseif(x<=(line_2[0]+radiu*2.0f) &&x>=(line_2[0]-radiu*2.0f) &&y>=(line_2[1]-radiu*2.0f) &&y<=(line_2[1]+radiu*2.0f)){ cmP7=true; }elseif(x<=(line_2[2]+radiu*2.0f) &&x>=(line_2[2]-radiu*2.0f) &&y>=(line_2[3]-radiu*2.0f) &&y<=(line_2[3]+radiu*2.0f)){ cmP8=true; }elseif(x<=(line_3[0]+radiu*2.0f) &&x>=(line_3[0]-radiu*2.0f) &&y>=(line_3[1]-radiu*2.0f) &&y<=(line_3[1]+radiu*2.0f)){ cmP9=true; }elseif(x<=(line_3[2]+radiu*2.0f) &&x>=(line_3[2]-radiu*2.0f) &&y>=(line_3[3]-radiu*2.0f) &&y<=(line_3[3]+radiu*2.0f)){ cmP10=true; } } break; caseMotionEvent.ACTION_MOVE: float[]point_L=newfloat[]{line_1[1],line_2[1],line_3[1]}; float[]point_R=newfloat[]{line_1[3],line_2[3],line_3[3]}; if(cmP1){ isMove=true; line_l[0]=x; line_l[1]=getLimtMoveY(point_L,y,TYPE_MIN); line_1[0]=getPointX(line_l,line_1[1]); line_2[0]=getPointX(line_l,line_2[1]); line_3[0]=getPointX(line_l,line_3[1]); }elseif(cmP2){ isMove=true; line_r[0]=x; line_r[1]=getLimtMoveY(point_R,y,TYPE_MIN); line_1[2]=getPointX(line_r,line_1[3]); line_2[2]=getPointX(line_r,line_2[3]); line_3[2]=getPointX(line_r,line_3[3]); }elseif(cmP3){ isMove=true; line_l[2]=x; line_l[3]=getLimtMoveY(point_L,y,TYPE_MAX); line_1[0]=getPointX(line_l,line_1[1]); line_2[0]=getPointX(line_l,line_2[1]); line_3[0]=getPointX(line_l,line_3[1]); }elseif(cmP4){ isMove=true; line_r[2]=x; line_r[3]=getLimtMoveY(point_R,y,TYPE_MAX); line_1[2]=getPointX(line_r,line_1[3]); line_2[2]=getPointX(line_r,line_2[3]); line_3[2]=getPointX(line_r,line_3[3]); }elseif(cmP5){ isMove=true; y=getMoveY(line_l,y); line_1[0]=getPointX(line_l,y); line_1[1]=y; }elseif(cmP6){ isMove=true; y=getMoveY(line_r,y); line_1[2]=getPointX(line_r,y); line_1[3]=y; }elseif(cmP7){ isMove=true; y=getMoveY(line_l,y); line_2[0]=getPointX(line_l,y); line_2[1]=y; }elseif(cmP8){ isMove=true; y=getMoveY(line_r,y); line_2[2]=getPointX(line_r,y); line_2[3]=y; }elseif(cmP9){ isMove=true; y=getMoveY(line_l,y); line_3[0]=getPointX(line_l,y); line_3[1]=y; }elseif(cmP10){ isMove=true; y=getMoveY(line_r,y); line_3[2]=getPointX(line_r,y); line_3[3]=y; } invalidate(); break; caseMotionEvent.ACTION_UP: cmP1=false; cmP2=false; cmP3=false; cmP4=false; cmP5=false; cmP6=false; cmP7=false; cmP8=false; cmP9=false; cmP10=false; if(!isMove) showPoint=!showPoint; invalidate(); break; } returnsuper.onTouchEvent(event); } @Override publicvoidonClick(Viewv){ } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。