美文网首页
android自由坐标绘制的研究之超出自动换行等研究笔记

android自由坐标绘制的研究之超出自动换行等研究笔记

作者: 吉凶以情迁 | 来源:发表于2023-04-18 12:00 被阅读0次

    对于怎么去定义 以及怎么自由,之前的写法完全不方便扩展,这次我任然任由用户创建任意行,但是每一个行是一个model,这个model可以指定是否限制最右边,超出是否自动下一行

    而这个bitmap就等于这个打印机纸的宽度,这样计算也不需要了.

    
                        float x = current.x;
                        float y = current.y;
                        String line = "";
                        for (int i = 0; i < current.content.length(); i++) {
                            char c = current.content.charAt(i);
                            Rect bounds = new Rect();
                            fontPaint.getTextBounds(c + "", 0, 1, bounds);//230 test_box_1234的宽度
                            float charWidth = bounds.width();// paint.measureText(String.valueOf(c));
                            if (x + charWidth > current.limitRight) {
                                canvas.drawText(line, 0, y, fontPaint);
                                line = String.valueOf(c);
                                int fontHeight = bounds.bottom - bounds.top;
                                y += fontHeight + current.newLineGap;
    //                            y += fontPaint.getFontSpacing()+ current.newLineGap;
                                x = charWidth;
                            } else {
                                line += c;
                                x += charWidth;
                            }
    
    
    
    
     public static Bitmap genereateBitmap(PrintLabelModel model) {
    
    
            int width = model.width;
            int height = model.height;
    
            //最终生成的图片
            Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setColor(Color.WHITE);
            Canvas canvas = new Canvas(result);
            //先画一整块白色矩形块
            canvas.drawRect(0, 0, result.getWidth(), result.getHeight(), paint);
    
            Paint fontPaint = new Paint();
            fontPaint.setAntiAlias(true);
            fontPaint.setStyle(Paint.Style.FILL);
    
            for (PrintLabelModel.BasePrint info : model.infos) {
                //8 dot=1mm. 1英寸=25.4mm.热
                if (info instanceof PrintLabelModel.BarCode) {
                    PrintLabelModel.BarCode current = (PrintLabelModel.BarCode) info;
                    try {
                        Bitmap bitmap = PrintBitmapUtil.encodeAsBitmap(current.content, BarcodeFormat.CODE_128, current.width, current.height);
                        canvas.drawBitmap(bitmap, info.x, info.y, fontPaint);
                    } catch (WriterException e) {
                        throw new RuntimeException(e);
                    }
    
                } else if (info instanceof PrintLabelModel.QRCode) {
                    PrintLabelModel.QRCode current = (PrintLabelModel.QRCode) info;
                    Bitmap qrCodeBitmap = com.example.print_sdk.util.BitmapUtils.encode2dAsBitmap(current.content, current.size, current.size, 2);
                    canvas.drawBitmap(qrCodeBitmap, info.x, info.y, fontPaint);
                    if (current.showText) {
                    }
    
                } else if (info instanceof PrintLabelModel.Box) {
                    PrintLabelModel.Box current = (PrintLabelModel.Box) info;
                    Paint mypaint = new Paint();
                    mypaint.setAntiAlias(true);
                    mypaint.setStyle(Paint.Style.FILL);
                    mypaint.setColor(Color.BLACK);
                    mypaint.setStyle(Paint.Style.STROKE);
                    mypaint.setStrokeWidth(current.border);
                    float strokeWidth = paint.getStrokeWidth();
                    canvas.drawRect(current.x - (strokeWidth / 2), current.y - (strokeWidth / 2), current.right - (strokeWidth / 2), current.bottom - (strokeWidth / 2), mypaint);
                } else if (info instanceof PrintLabelModel.Text) {
                    PrintLabelModel.Text current = (PrintLabelModel.Text) info;
                    fontPaint.setTextSize(current.fontsize);
                    fontPaint.setColor(Color.BLACK);
                    if (current.limitRight > 0) {
    
    
                        float x = current.x;
                        float y = current.y;
                        String line = "";
                        for (int i = 0; i < current.content.length(); i++) {
                            char c = current.content.charAt(i);
                            Rect bounds = new Rect();
                            fontPaint.getTextBounds(c + "", 0, 1, bounds);//230 test_box_1234的宽度
                            float charWidth = bounds.width();// paint.measureText(String.valueOf(c));
                            if (x + charWidth > current.limitRight) {
                                canvas.drawText(line, 0, y, fontPaint);
                                line = String.valueOf(c);
                                int fontHeight = bounds.bottom - bounds.top;
                                y += fontHeight + current.newLineGap;
    //                            y += fontPaint.getFontSpacing()+ current.newLineGap;
                                x = charWidth;
                            } else {
                                line += c;
                                x += charWidth;
                            }
                        }
                        canvas.drawText(line, 0, y, fontPaint);
                    } else {
                        canvas.drawText(current.content, info.x, info.y, fontPaint);
    
                    }
    
                } else if (info instanceof PrintLabelModel.TextLeftRight) {
                    PrintLabelModel.TextLeftRight current = (PrintLabelModel.TextLeftRight) info;
                    fontPaint.setTextSize(current.fontSize);
                    fontPaint.setColor(Color.BLACK);
                    String content = current.label + ":" + current.content;
    
    
                    if (current.limitRight > 0) {
    
    
                        float x = current.x;
                        float y = current.y;
                        String line = "";
                        for (int i = 0; i < content.length(); i++) {
                            char c = content.charAt(i);
                            float charWidth = fontPaint.measureText(String.valueOf(c));
                            if (x + charWidth > current.limitRight) {
                                canvas.drawText(line, 0, y, fontPaint);
                                line = String.valueOf(c);
                                y += fontPaint.getFontSpacing() + current.newLineGap;
                                x = charWidth;
                            } else {
                                line += c;
                                x += charWidth;
                            }
                        }
                        canvas.drawText(line, 0, y, fontPaint);
                    } else {
                        canvas.drawText(content
                                , info.x, info.y, fontPaint);
    
                    }
    
                } else {
    
                }
            }
    
            paint.setColor(Color.WHITE);
            canvas.save();
            canvas.restore();
            return result;
        }
    
    

    上面还是有点小bug

       x = current.x+charWidth;
    

    这样下一行会延续之前的
    测量两种方法

          fontPaint.getTextBounds(c + "", 0, 1, bounds);//230 test_box_1234的宽度
                            float charWidth = bounds.width();// paint.measureText(String.valueOf(c));
                            if (x + charWidth > current.limitRight) {
                                canvas.drawText(line, 0, y, fontPaint);
                                line = String.valueOf(c);
                                int fontHeight = bounds.bottom - bounds.top;
                                y += fontHeight + current.newLineGap;
    //                            y += fontPaint.getFontSpacing()+ current.newLineGap;
                                x = current.x+charWidth;
                            } else {
                                line += c;
                                x += charWidth;
                            }
    
    
    
      float charWidth = fontPaint.measureText(String.valueOf(c));
                            if (x + charWidth > current.limitRight) {
                                canvas.drawText(line, 0, y, fontPaint);
                                line = String.valueOf(c);
                                y += fontPaint.getFontSpacing() + current.newLineGap;
                                x = current.x+charWidth;
                            } else {
                                line += c;
                                x += charWidth;
                            }
    

    最后完整的如下

    
     public static Bitmap genereateBitmap(PrintLabelModel model) {
    
    
            int width = model.width;
            int height = model.height;
    
            //最终生成的图片
            Bitmap result = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setColor(Color.WHITE);
            Canvas canvas = new Canvas(result);
            //先画一整块白色矩形块
            canvas.drawRect(0, 0, result.getWidth(), result.getHeight(), paint);
    
            Paint fontPaint = new Paint();
            fontPaint.setAntiAlias(true);
            fontPaint.setStyle(Paint.Style.FILL);
    
            for (PrintLabelModel.BasePrint info : model.infos) {
                //8 dot=1mm. 1英寸=25.4mm.热
                if (info instanceof PrintLabelModel.BarCode) {
                    PrintLabelModel.BarCode current = (PrintLabelModel.BarCode) info;
                    try {
                        Bitmap bitmap = PrintBitmapUtil.encodeAsBitmap(current.content, BarcodeFormat.CODE_128, current.width, current.height);
                        canvas.drawBitmap(bitmap, info.x, info.y, fontPaint);
                    } catch (WriterException e) {
                        throw new RuntimeException(e);
                    }
    
                } else if (info instanceof PrintLabelModel.QRCode) {
                    PrintLabelModel.QRCode current = (PrintLabelModel.QRCode) info;
                    Bitmap qrCodeBitmap = com.example.print_sdk.util.BitmapUtils.encode2dAsBitmap(current.content, current.size, current.size, 2);
                    canvas.drawBitmap(qrCodeBitmap, info.x, info.y, fontPaint);
                    if (current.showText) {
                    }
    
                } else if (info instanceof PrintLabelModel.Box) {
                    PrintLabelModel.Box current = (PrintLabelModel.Box) info;
                    Paint mypaint = new Paint();
                    mypaint.setAntiAlias(true);
                    mypaint.setStyle(Paint.Style.FILL);
                    mypaint.setColor(Color.BLACK);
                    mypaint.setStyle(Paint.Style.STROKE);
                    mypaint.setStrokeWidth(current.border);
                    float strokeWidth = paint.getStrokeWidth();
                    canvas.drawRect(current.x - (strokeWidth / 2), current.y - (strokeWidth / 2), current.right - (strokeWidth / 2), current.bottom - (strokeWidth / 2), mypaint);
                } else if (info instanceof PrintLabelModel.Text) {
                    PrintLabelModel.Text current = (PrintLabelModel.Text) info;
                    fontPaint.setTextSize(current.fontsize);
                    fontPaint.setColor(Color.BLACK);
                    if (current.limitRight > 0) {
    
    
                        float x = current.x;
                        float y = current.y;
                        String line = "";
                        for (int i = 0; i < current.content.length(); i++) {
                            char c = current.content.charAt(i);
                            Rect bounds = new Rect();
                            fontPaint.getTextBounds(c + "", 0, 1, bounds);//230 test_box_1234的宽度
                            float charWidth = bounds.width();// paint.measureText(String.valueOf(c));
                            if (x + charWidth > current.limitRight) {
                                canvas.drawText(line, current.x, y, fontPaint);
                                line = String.valueOf(c);
                                int fontHeight = bounds.bottom - bounds.top;
                                y += fontHeight + current.newLineGap;
    //                            y += fontPaint.getFontSpacing()+ current.newLineGap;
                                x = current.x + charWidth;
                            } else {
                                line += c;
                                x += charWidth;
                            }
                        }
                        canvas.drawText(line, current.x, y, fontPaint);
                    } else {
                        canvas.drawText(current.content, info.x, info.y, fontPaint);
    
                    }
    
                } else if (info instanceof PrintLabelModel.TextLeftRight) {
                    PrintLabelModel.TextLeftRight current = (PrintLabelModel.TextLeftRight) info;
                    fontPaint.setTextSize(current.fontSize);
                    fontPaint.setColor(Color.BLACK);
                    String content = current.label + ":" + current.content;
    
    
                    if (current.limitRight > 0) {
    
                        float x = current.x;
                        float y = current.y;
                        String line = "";
                        for (int i = 0; i < content.length(); i++) {
                            char c = content.charAt(i);
                            float charWidth = fontPaint.measureText(String.valueOf(c));
                            if (x + charWidth > current.limitRight) {
                                canvas.drawText(line, current.x, y, fontPaint);//把之前的给绘制掉
                                line = String.valueOf(c);
                                y += fontPaint.getFontSpacing() + current.newLineGap;
                                x = current.x + charWidth;//第二行
                            } else {
                                line += c;
                                x += charWidth;
                            }
                        }
                        //没超过就是绘制第一行,超过就是绘制末尾的
                        canvas.drawText(line, current.x, y, fontPaint);
                    } else {
                        canvas.drawText(content
                                , info.x, info.y, fontPaint);
    
                    }
    
                } else {
    
                }
            }
    
            paint.setColor(Color.WHITE);
            canvas.save();
            canvas.restore();
            return result;
        }
    
    
    

    用法

        PrintLabelModel label = new PrintLabelModel();
            int left=10;
            int txtBaseY = 85;
            int txtIncreatefact = 23;
            int fontSize=15;
            label.height = 320;
            label.width = 480;
       label.infos.add(new PrintLabelModel.QRCode(270, 71, 135, "qrcode", false));
            label.infos.add(new PrintLabelModel.BarCode(8, 20, 360, 45, "1234567890", true,fontSize));
            label.infos.add(new PrintLabelModel.Box(8, 10, 440, 310, 1, true));
            label.infos.add(new PrintLabelModel.TextLeftRight(left, txtBaseY, "P/N", "060.01.150002",fontSize));
            label.infos.add(new PrintLabelModel.TextLeftRight(left, txtBaseY = txtBaseY + txtIncreatefact, "a/b ", "4444444444444",fontSize));
            label.infos.add(new PrintLabelModel.TextLeftRight(left, txtBaseY = txtBaseY + txtIncreatefact, "c/d", "3333XXX",fontSize));
            label.infos.add(new PrintLabelModel.TextLeftRight(left, txtBaseY = txtBaseY + txtIncreatefact, "e/f", "2023-03-09",fontSize));
    
            label.infos.add(new PrintLabelModel.TextLeftRight(left, 15, "xff, "W/Vf<=3.4v,abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()你好世界我的你啊不好滚啥特由泥放写连判",fontSize,380));
    
    
    
            labelList.add(label);
    
    
    

    相关文章

      网友评论

          本文标题:android自由坐标绘制的研究之超出自动换行等研究笔记

          本文链接:https://www.haomeiwen.com/subject/edroldtx.html