我们都知道,条形码其实就是一大串的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}};