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;ilimt-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){
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。