/**
*繪製車站以及車輛位置
*同一位置存在多輛機車的情況下,車輛卡號上從上往下疊
*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;
}
}
基本上直接拿過去就能用,剩下的可以自己添加。
一般來說,除了沒有點擊功能,只顯示個路線圖以及車輛位置還是挺好用的。