簡單的android 繪圖類 可應用於地鐵公交路線繪製以及車輛位置跟蹤

/**
 *繪製車站以及車輛位置
 *同一位置存在多輛機車的情況下,車輛卡號上從上往下疊
 *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;
    }
}

 

基本上直接拿過去就能用,剩下的可以自己添加。

一般來說,除了沒有點擊功能,只顯示個路線圖以及車輛位置還是挺好用的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章