简单的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;
    }
}

 

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

一般来说,除了没有点击功能,只显示个路线图以及车辆位置还是挺好用的。

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