Android/java EAN-13 数字码转条形码

我们都知道,条形码其实就是一大串的0101,存储了一个13位数字的信息,现在实现这么一个需求,根据用户输入的12位数字(第13位是校验位,可以根据前12位生成),转为条形码的01串,并画出来。

先看编码规则:https://baike.so.com/doc/2185319-2312258.html  百科里最下面这个例子讲的很清楚了。

自定义一个SurfaceView,只负责接收最终生成的Int集合并描绘出来。条形码里其实有三种rect,白色,黑色,以及黑色加长,分别用012表示。每个rect宽度取surfaceview宽度的百分之一(surfaceview宽度在surfaceCreated中获取),高度取宽度的40倍,加长的取45倍。还需要准备黑白两只画笔。

绘制代码:

    //根据最终生成的数组画图
    public void draw(List<Integer> list){
        Canvas canvas=holder.lockCanvas();
        canvas.drawColor(Color.WHITE);

        for (int i=0;i<list.size();i++){
            int value=list.get(i);
            drawOne(canvas,oneWidth*i,value);
        }
        holder.unlockCanvasAndPost(canvas);
    }

    //画一条竖线或空白
    public void drawOne(Canvas canvas,int x,int value){
        switch (value){
            case 0:
                canvas.drawRect(new Rect(x,0,x+oneWidth,1),paintWhite);
                break;
            case 1:
                canvas.drawRect(new Rect(x,0,x+oneWidth,oneHeight),paintBlack);
                break;
            case 2:
                canvas.drawRect(new Rect(x,0,x+oneWidth,oneLongHeight),paintBlack);
                break;
        }
    }


然后在主界面放一个输入框和一个按钮,直接看点击事件,实际上就是算出整个01串的过程,存在result集合里,最后通知my(自定义surfaceview)绘制就可以了:

public void handle(){
        String s=et.getText().toString();
        int length=s.length();

        if (length!=12){
            Toast.makeText(MainActivity.this,"格式有误",Toast.LENGTH_SHORT).show();
            return;
        }

        int[] datas=new int[12];//输入的12位
        for (int i=0;i<length;i++){
            int a=s.charAt(i)-48;
            datas[i]=a;
        }
        //奇数位和&&偶数位和
        int p=datas[0]+datas[2]+datas[4]+datas[6]+datas[8]+datas[10];
        int q=datas[1]+datas[3]+datas[5]+datas[7]+datas[9]+datas[11];
        //校验位
        int tes =10-((p+3*q)%10);
        if (tes==10){
            tes=0;
        }

        List<Integer> result=new ArrayList<>();
        for (int i=0;i<11;i++){
            result.add(0);
        }
        result.add(2);result.add(0);result.add(2);
        int[] left=front[datas[0]];
        for (int i=0;i<6;i++){
            int[] re;
            if (left[i]==1){//A
                re=A[datas[i+1]];
            } else {//B
                re=B[datas[i+1]];
            }
            for (Integer in:re){
                result.add(in);
            }
        }

        //中间分隔符
        result.add(0);result.add(2);result.add(0);result.add(2);result.add(0);

        for (int i=0;i<5;i++){
            int []re=C[datas[i+7]];
            for (Integer in:re){
                result.add(in);
            }
        }
        //校验位
        int []re=C[tes];
        for (Integer in:re){
            result.add(in);
        }

        //结尾
        result.add(2);result.add(0);result.add(2);

        for (int i=0;i<7;i++){
            result.add(0);
        }

        my.draw(result);
    }



当然了,还需要定义好需要查的表:

    private final int[][] A={{0,0,0,1,1,0,1},{0,0,1,1,0,0,1},{0,0,1,0,0,1,1},{0,1,1,1,1,0,1},{0,1,0,0,0,1,1},
            {0,1,1,0,0,0,1},{0,1,0,1,1,1,1},{0,1,1,1,0,1,1},{0,1,1,0,1,1,1},{0,0,0,1,0,1,1}};
    private final int[][] B={{0,1,0,0,1,1,1},{0,1,1,0,0,1,1},{0,0,1,1,0,1,1},{0,1,0,0,0,0,1},{0,0,1,1,1,0,1},
            {0,1,1,1,0,0,1},{0,0,0,0,1,0,1},{0,0,1,0,0,0,1},{0,0,0,1,0,0,1},{0,0,1,0,1,1,1}};
    private final int[][] C={{1,1,1,0,0,1,0},{1,1,0,0,1,1,0},{1,1,0,1,1,0,0},{1,0,0,0,0,1,0},{1,0,1,1,1,0,0},
            {1,0,0,1,1,1,0},{1,0,1,0,0,0,0},{1,0,0,0,1,0,0},{1,0,0,1,0,0,0},{1,1,1,0,1,0,0}};

    //前置码
    private final int[][] front={{1,1,1,1,1,1},{1,1,2,1,2,2},{1,1,2,2,1,2},{1,1,2,2,2,1},{1,2,1,1,2,2},
            {1,2,2,1,1,2},{1,2,2,2,1,1},{1,2,1,2,1,2},{1,2,1,2,2,1},{1,2,2,1,2,1}};


猜你喜欢

转载自blog.csdn.net/zhang___yong/article/details/79666913