/**
*绘制车站以及车辆位置
*同一位置存在多辆机车的情况下,车辆卡号上从上往下叠
*Created by baitiantian on 2019/10/15.
*/
class LocomotiveLocatingView extends View {
Paint paintLine;//路线
Paint paintPoint;//站点
Paint paintStationText;//车站名
Paint paintLocomotivePoint;//机车点
Paint paintLocomotiveText;//机车名
List<HashMap<String, Object>> listStation = new ArrayList<>();
List<HashMap<String, Object>> listLocomotive = new ArrayList<>();
public LocomotiveLocatingView(Context context) {
super(context);
paintLine = new Paint(); //设置车站路线画笔
paintLine.setColor(Color.parseColor("#0BA194"));
paintLine.setStrokeJoin(Paint.Join.ROUND);
paintLine.setStrokeCap(Paint.Cap.ROUND);
paintLine.setStrokeWidth(10);
paintPoint = new Paint(); //设置车站点画笔
paintPoint.setColor(Color.parseColor("#deb23b"));
paintPoint.setStrokeJoin(Paint.Join.ROUND);
paintPoint.setStrokeCap(Paint.Cap.ROUND);
paintPoint.setStrokeWidth(10);
paintStationText = new Paint();//设置车站字体
paintStationText.setColor(Color.parseColor("#BA800B"));
paintStationText.setStrokeWidth(10);
paintStationText.setTextSize(26);
paintLocomotivePoint = new Paint();//机车点
paintLocomotivePoint.setColor(Color.parseColor("#BA4114"));
paintLocomotivePoint.setStrokeJoin(Paint.Join.ROUND);
paintLocomotivePoint.setStrokeCap(Paint.Cap.ROUND);
paintLocomotivePoint.setStrokeWidth(12);
paintLocomotiveText = new Paint();//设置机车名字体
paintLocomotiveText.setColor(Color.parseColor("#BA4114"));
paintLocomotiveText.setStrokeWidth(10);
paintLocomotiveText.setTextSize(26);
}
//在这里我们将测试canvas提供的绘制图形方法
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.parseColor("#cccccc"));
int stationNum = 0;
stationNum = listStation.size();//车站总数
int i_stationNum = 0;//车站计数
flag:for(int x=0;x<stationNum/12+1;x++){
if(stationNum==i_stationNum){
break ;
}
if(x>0){
canvas.drawLine(100, 300*x+20,
100, 150+300*x-20, paintLine);//补画头站竖线
}
canvas.drawCircle(100, 150+300*x, 15, paintPoint);//车站点
if(listLocomotive.size()>0){
int i1 = 0;
for(int i0=0;i0<listLocomotive.size();i0++){
String s = Objects.requireNonNull(
listLocomotive.get(i0).get("station_id")).toString();
String s1 = Objects.requireNonNull(
listStation.get(i_stationNum).get("id")).toString();
if(s.equals(s1)){
canvas.drawCircle(100, 150+300*x, 15, paintLocomotivePoint);//机车点
Path path_cart = new Path(); //定义一条路径
path_cart.moveTo(50, 180+(20*i1)+(300*x));
path_cart.lineTo(200, 180+(20*i1)+(300*x));
canvas.drawTextOnPath(Objects.requireNonNull(
listLocomotive.get(i0).get("name")).toString(), path_cart,
20, 10, paintLocomotiveText);//如果头站有车的话
i1++;
}
}
}
Path path = new Path(); //定义一条路径
path.moveTo(0, 130+300*x);
path.lineTo(187, 70+300*x);
canvas.drawTextOnPath(Objects.requireNonNull(
listStation.get(i_stationNum).get("name")).toString(), path,
50, 10, paintStationText);//头站名
i_stationNum++;
if(stationNum==i_stationNum){
break ;
}
for(int i=1;i<6;i++){
canvas.drawCircle(100+100*i, 150+300*x,
15, paintPoint);//车站点
if(listLocomotive.size()>0){
int i1 = 0;
for(int i0=0;i0<listLocomotive.size();i0++){
String s = Objects.requireNonNull(
listLocomotive.get(i0).get("station_id")).toString();
String s1 = Objects.requireNonNull(
listStation.get(i_stationNum).get("id")).toString();
if(s.equals(s1)){
canvas.drawCircle(100+100*i, 150+300*x, 15, paintLocomotivePoint);//机车点
Path path_cart = new Path(); //定义一条路径
path_cart.moveTo(50+100*i, 180+(20*i1)+(300*x));
path_cart.lineTo(200+100*i, 180+(20*i1)+(300*x));
canvas.drawTextOnPath(Objects.requireNonNull(
listLocomotive.get(i0).get("name")).toString(), path_cart,
20, 10, paintLocomotiveText);//如果头站有车的话
i1++;
}
}
}
path = new Path(); //定义一条路径
path.moveTo(100*i, 130+300*x);
path.lineTo(100*i+187, 70+300*x);
canvas.drawTextOnPath(Objects.requireNonNull(
listStation.get(i_stationNum).get("name")).toString(), path,
50, 10, paintStationText);//车站名
canvas.drawLine(100*i+20, 150+300*x,
100+100*i-20, 150+300*x, paintLine);
i_stationNum++;
if(stationNum==i_stationNum){
break flag;
}
}
canvas.drawCircle(600, 150+150+300*x,
15, paintPoint);//车站点
if(listLocomotive.size()>0){
int i1 = 0;
for(int i0=0;i0<listLocomotive.size();i0++){
String s = Objects.requireNonNull(
listLocomotive.get(i0).get("station_id")).toString();
String s1 = Objects.requireNonNull(
listStation.get(i_stationNum).get("id")).toString();
if(s.equals(s1)){
canvas.drawCircle(600, 300+300*x, 15, paintLocomotivePoint);//机车点
Path path_cart = new Path(); //定义一条路径
path_cart.moveTo(550, 330+(20*i1)+(300*x));
path_cart.lineTo(650, 330+(20*i1)+(300*x));
canvas.drawTextOnPath(Objects.requireNonNull(
listLocomotive.get(i0).get("name")).toString(), path_cart,
20, 10, paintLocomotiveText);//如果头站有车的话
i1++;
}
}
}
path = new Path(); //定义一条路径
path.moveTo(500, 130+150+300*x);
path.lineTo(687, 70+150+300*x);
canvas.drawTextOnPath(Objects.requireNonNull(
listStation.get(i_stationNum).get("name")).toString(), path,
50, 10, paintStationText);//车站名
canvas.drawLine(600, 150+300*x+20, 600, 150+150+300*x-20, paintLine);
i_stationNum++;
if(stationNum==i_stationNum){
break;
}
for(int i=1;i<6;i++){
canvas.drawCircle(600-100*i, 150+150+300*x,
15, paintPoint);//车站点
if(listLocomotive.size()>0){
int i1 = 0;
for(int i0=0;i0<listLocomotive.size();i0++){
String s = Objects.requireNonNull(
listLocomotive.get(i0).get("station_id")).toString();
String s1 = Objects.requireNonNull(
listStation.get(i_stationNum).get("id")).toString();
if(s.equals(s1)){
canvas.drawCircle(600-100*i, 300+300*x, 15, paintLocomotivePoint);//机车点
Path path_cart = new Path(); //定义一条路径
path_cart.moveTo(550-100*i, 330+(20*i1)+(300*x));
path_cart.lineTo(650-100*i, 330+(20*i1)+(300*x));
canvas.drawTextOnPath(Objects.requireNonNull(
listLocomotive.get(i0).get("name")).toString(), path_cart,
20, 10, paintLocomotiveText);//如果头站有车的话
i1++;
}
}
}
path = new Path(); //定义一条路径
path.moveTo(500-100*i, 130+150+300*x);
path.lineTo(500-100*i+187, 70+150+300*x);
canvas.drawTextOnPath(Objects.requireNonNull(
listStation.get(i_stationNum).get("name")).toString(), path,
50, 10, paintStationText);//车站名
canvas.drawLine(600-100*(i-1)-20, 150+150+300*x, 600-100*i+20, 150+150+300*x, paintLine);
i_stationNum++;
if(stationNum==i_stationNum){
break flag;
}
}
}
}
/*输入车站list*/
public void setStationData(List<HashMap<String, Object>> list){
listStation = list;
}
/*输入机车位置list*/
public void setLocomotiveLocating(List<HashMap<String, Object>> list){
listLocomotive = list;
}
}
基本上直接拿过去就能用,剩下的可以自己添加。
一般来说,除了没有点击功能,只显示个路线图以及车辆位置还是挺好用的。