博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android上画方框
阅读量:4680 次
发布时间:2019-06-09

本文共 5204 字,大约阅读时间需要 17 分钟。

来自zxing开源码

public Rect getFramingRect() {    if (framingRect == null) {      if (camera == null) {        return null;      }      Point screenResolution = configManager.getScreenResolution();      int width = screenResolution.x * 3 / 4;     /* if (width < MIN_FRAME_WIDTH) {        width = MIN_FRAME_WIDTH;      } else if (width > MAX_FRAME_WIDTH) {        width = MAX_FRAME_WIDTH;      }*/      int height = screenResolution.y * 3 / 4;     /* if (height < MIN_FRAME_HEIGHT) {        height = MIN_FRAME_HEIGHT;      } else if (height > MAX_FRAME_HEIGHT) {        height = MAX_FRAME_HEIGHT;      }*/      int leftOffset = (screenResolution.x - width) / 2;      int topOffset = (screenResolution.y - height) / 2;      framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);      Log.d(TAG, "Calculated framing rect: " + framingRect);    }    return framingRect;  } public Rect getFramingRectInPreview() {    if (framingRectInPreview == null) {      Rect framingRect = getFramingRect();      if (framingRect == null) {        return null;      }      Rect rect = new Rect(framingRect);      Point cameraResolution = configManager.getCameraResolution();      Point screenResolution = configManager.getScreenResolution();      rect.left = rect.left * cameraResolution.x / screenResolution.x;      rect.right = rect.right * cameraResolution.x / screenResolution.x;      rect.top = rect.top * cameraResolution.y / screenResolution.y;      rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;      framingRectInPreview = rect;    }    return framingRectInPreview;  }@Override  public void onDraw(Canvas canvas) {    Rect frame = cameraManager.getFramingRect();    if (frame == null) {      return;    }    int width = canvas.getWidth();    int height = canvas.getHeight();    // Draw the exterior (i.e. outside the framing rect) darkened    paint.setColor(resultBitmap != null ? resultColor : maskColor);    canvas.drawRect(0, 0, width, frame.top, paint);    canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint);    canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1, paint);    canvas.drawRect(0, frame.bottom + 1, width, height, paint);    if (resultBitmap != null) {      // Draw the opaque result bitmap over the scanning rectangle      paint.setAlpha(CURRENT_POINT_OPACITY);      canvas.drawBitmap(resultBitmap, null, frame, paint);    } else {      // Draw a two pixel solid black border inside the framing rect      paint.setColor(frameColor);      canvas.drawRect(frame.left, frame.top, frame.right + 1, frame.top + 2, paint);      canvas.drawRect(frame.left, frame.top + 2, frame.left + 2, frame.bottom - 1, paint);      canvas.drawRect(frame.right - 1, frame.top, frame.right + 1, frame.bottom - 1, paint);      canvas.drawRect(frame.left, frame.bottom - 1, frame.right + 1, frame.bottom + 1, paint);      // Draw a red "laser scanner" line through the middle to show decoding is active      paint.setColor(laserColor);      paint.setAlpha(SCANNER_ALPHA[scannerAlpha]);      scannerAlpha = (scannerAlpha + 1) % SCANNER_ALPHA.length;      int middle = frame.height() / 2 + frame.top;      canvas.drawRect(frame.left + 2, middle - 1, frame.right - 1, middle + 2, paint);            Rect previewFrame = cameraManager.getFramingRectInPreview();      float scaleX = frame.width() / (float) previewFrame.width();      float scaleY = frame.height() / (float) previewFrame.height();      List
currentPossible = possibleResultPoints; List
currentLast = lastPossibleResultPoints; int frameLeft = frame.left; int frameTop = frame.top; if (currentPossible.isEmpty()) { lastPossibleResultPoints = null; } else { possibleResultPoints = new ArrayList
(5); lastPossibleResultPoints = currentPossible; paint.setAlpha(CURRENT_POINT_OPACITY); paint.setColor(resultPointColor); synchronized (currentPossible) { for (ResultPoint point : currentPossible) { canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX), frameTop + (int) (point.getY() * scaleY), POINT_SIZE, paint); } } } if (currentLast != null) { paint.setAlpha(CURRENT_POINT_OPACITY / 2); paint.setColor(resultPointColor); synchronized (currentLast) { float radius = POINT_SIZE / 2.0f; for (ResultPoint point : currentLast) { canvas.drawCircle(frameLeft + (int) (point.getX() * scaleX), frameTop + (int) (point.getY() * scaleY), radius, paint); } } } // Request another update at the animation interval, but only repaint the laser line, // not the entire viewfinder mask. postInvalidateDelayed(ANIMATION_DELAY, frame.left - POINT_SIZE, frame.top - POINT_SIZE, frame.right + POINT_SIZE, frame.bottom + POINT_SIZE); } }

 

运行效果图

 

转载于:https://www.cnblogs.com/userbibi/archive/2012/09/17/2688283.html

你可能感兴趣的文章