Android二维码扫描

版权所有,禁止匿名转载;禁止商业使用。
public static boolean statusFlag = true;
 private int sign;
 /**
  * 刷新界面的时间
  */
 private static final long ANIMATION_DELAY = 10L;
 private static final int OPAQUE = 0xFF;
 /**
  * 四个绿色边角对应的长度
  */
 private int ScreenRate;
 /**
  * 四个绿色边角对应的宽度
  */
 private static final int CORNER_WIDTH = 10;
 /**
  * 扫描框中的中间线的宽度
  */
 private static final int MIDDLE_LINE_WIDTH = 6;
 /**
  * 扫描框中的中间线的与扫描框左右的间隙
  */
 private static final int MIDDLE_LINE_PADDING = 5;
 /**
  * 中间那条线每次刷新移动的距离
  */
 private static final int SPEEN_DISTANCE = 5;
 /**
  * 手机的屏幕密度
  */
 private static float density;
 /**
  * 字体大小
  */
 private static final int TEXT_SIZE = 16;
 /**
  * 字体距离扫描框下面的距离
  */
 private static final int TEXT_PADDING_TOP = 30;
 /**
  * 画笔对象的引用
  */
 private Paint paint;
 /**
  * 中间滑动线的最顶端位置
  */
 private int slideTop;
 /**
  * 中间滑动线的最底端位置
  */
 private int slideBottom;
 private float x;
 private float y;
 private int tuX;
 private int tuY;
 /**
  * 将扫描的二维码拍下来,这里没有这个功能,暂时不考虑
  */
 private Bitmap resultBitmap;
 private final int maskColor;
 private final int resultColor;
 private final int resultPointColor;
 private Collection<ResultPoint> possibleResultPoints;
 private Collection<ResultPoint> lastPossibleResultPoints;
 boolean isFirst;
 public ViewfinderView(Context context, AttributeSet attrs) {
  super(context, attrs);
  density = context.getResources().getDisplayMetrics().density;
  // 将像素转换成dp
  ScreenRate = (int) (20 * density);
  paint = new Paint();
  Resources resources = getResources();
  maskColor = resources.getColor(R.color.viewfinder_mask);
  resultColor = resources.getColor(R.color.result_view);
  resultPointColor = resources.getColor(R.color.possible_result_points);
  possibleResultPoints = new HashSet<ResultPoint>(5);
 }
 @SuppressLint("DrawAllocation")
 @Override
 public void onDraw(Canvas canvas) {
  // 中间的扫描框,你要修改扫描框的大小,去CameraManager里面修改
  Rect frame = CameraManager.get().getFramingRect();
  if (frame == null) {
   return;
  }
  // 初始化中间线滑动的最上边和最下边
  if (!isFirst) {
   isFirst = true;
   slideTop = frame.top;
   slideBottom = frame.bottom;
  }
  // 获取屏幕的宽和高
  int width = canvas.getWidth();
  int height = canvas.getHeight();
  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(OPAQUE);
   canvas.drawBitmap(resultBitmap, frame.left, frame.top, paint);
  } else {
   // 画扫描框边上的角,总共8个部分
   paint.setColor(Color.GREEN);
   canvas.drawRect(frame.left, frame.top, frame.left + ScreenRate,
     frame.top + CORNER_WIDTH, paint);
   canvas.drawRect(frame.left, frame.top, frame.left + CORNER_WIDTH,
     frame.top + ScreenRate, paint);
   canvas.drawRect(frame.right - ScreenRate, frame.top, frame.right,
     frame.top + CORNER_WIDTH, paint);
   canvas.drawRect(frame.right - CORNER_WIDTH, frame.top, frame.right,
     frame.top + ScreenRate, paint);
   canvas.drawRect(frame.left, frame.bottom - CORNER_WIDTH, frame.left
     + ScreenRate, frame.bottom, paint);
   canvas.drawRect(frame.left, frame.bottom - ScreenRate, frame.left
     + CORNER_WIDTH, frame.bottom, paint);
   canvas.drawRect(frame.right - ScreenRate, frame.bottom
     - CORNER_WIDTH, frame.right, frame.bottom, paint);
   canvas.drawRect(frame.right - CORNER_WIDTH, frame.bottom
     - ScreenRate, frame.right, frame.bottom, paint);
   // 绘制中间的线,每次刷新界面,中间的线往下移动SPEEN_DISTANCE
   slideTop += SPEEN_DISTANCE;
   if (slideTop >= frame.bottom) {
    slideTop = frame.top;
   }
   Rect lineRect = new Rect();
   lineRect.left = frame.left;
   lineRect.right = frame.right;
   lineRect.top = slideTop;
   lineRect.bottom = slideTop + 18;
//   中间的线没图片了就随便找了一个图片加上了,大家记得要改哦
   canvas.drawBitmap(((BitmapDrawable) (getResources()
     .getDrawable(R.drawable.weixin))).getBitmap(), null,
     lineRect, paint);
   // 画扫描框下面的字
   paint.setColor(Color.WHITE);
   paint.setTextSize(TEXT_SIZE * density);
   paint.setAlpha(0x40);
   paint.setTypeface(Typeface.create("System", Typeface.BOLD));
   canvas.drawText(getResources().getString(R.string.scan_text),
     frame.left, (float) (frame.top - (float) TEXT_PADDING_TOP
       * density), paint);
   // 画图片
   Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
     R.drawable.deng_09);
   tuX = bitmap.getWidth();
   tuY = bitmap.getHeight();
   x = (canvas.getWidth() / 2) - 70;
   y = (frame.bottom + (float) TEXT_PADDING_TOP * density);
   canvas.drawBitmap(bitmap, x, y, paint);
   canvas.restore();
   Collection<ResultPoint> currentPossible = possibleResultPoints;
   Collection<ResultPoint> currentLast = lastPossibleResultPoints;
   if (currentPossible.isEmpty()) {
    lastPossibleResultPoints = null;
   } else {
    possibleResultPoints = new HashSet<ResultPoint>(5);
    lastPossibleResultPoints = currentPossible;
    paint.setAlpha(OPAQUE);
    paint.setColor(resultPointColor);
    for (ResultPoint point : currentPossible) {
     canvas.drawCircle(frame.left + point.getX(), frame.top
       + point.getY(), 6.0f, paint);
    }
   }
   if (currentLast != null) {
    paint.setAlpha(OPAQUE / 2);
    paint.setColor(resultPointColor);
    for (ResultPoint point : currentLast) {
     canvas.drawCircle(frame.left + point.getX(), frame.top
       + point.getY(), 3.0f, paint);
    }
   }
   // 只刷新扫描框的内容,其他地方不刷新
   postInvalidateDelayed(ANIMATION_DELAY, frame.left, frame.top,
     frame.right, frame.bottom);
  }
 }
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  if (event.getAction() != MotionEvent.ACTION_DOWN) {
   return true;
  }
  if ((x <= event.getX() && event.getX() <= (x + tuX))
    && (event.getY() >= y && event.getY() <= (y + tuY))) {
   if (sign % 2 == 0) {
    CameraManager.get().openF();
   } else {
    CameraManager.get().stopF();
   }
   sign++;
  }
  return false;
 }
 public void drawViewfinder() {
  resultBitmap = null;
  invalidate();
 }
 /**
  * Draw a bitmap with the result points highlighted instead of the live
  * scanning display.
  * 
  * @param barcode
  *            An image of the decoded barcode.
  */
 public void drawResultBitmap(Bitmap barcode) {
  resultBitmap = barcode;
  invalidate();
 }
 public void addPossibleResultPoint(ResultPoint point) {
  possibleResultPoints.add(point);
 }

立即下载


0 0