zoukankan      html  css  js  c++  java
  • android入门:zxing学习笔记(二)

         个人网站:臭蛋 www.choudan.net

      上一篇介绍了zxing扫描二维码的过程,刚开始看这份代码时,不怎么明白,很多细节都不清楚,到后来又了更深的理解后,发现这代码设计的就是好,质量高。整个扫描二维码和一维码的过程是非常迅速的,效率很高。最近发现微博上有个二维坊的ID,发得qr码图形都非常的Q,不知道怎么弄出来的,程序员可以借这个可爱的qr码浪漫下。

         在整个zxing的android代码部分,很重要的两点是main activity 和 camera。在这一篇,就主要介绍下android camera的使用。打开zxing下的Barcode scanner,并会有如下的界面。为了更好的理解camera,先介绍这个界面。

    Barcode Scanner的界面

        刚开始接触到android时,对此界面一点不熟悉。后面认真看了其中的代码,明白了一点点。 这个界面的定义主要在ViewfinderView.java这个类中,这个类继承了View类,实现了自定义的View。View就是对应于屏幕的一个画布,可以在这个屏幕上任意绘制你想要的设计。最重要的重载onDraw函数,在其中实现绘制。就来看下ViewfinderView是如何实现界面上的感觉的。

        画面中一共分为两块:外边半透明的一片,中间全透明的一片。外面半透明的画面是由四个矩形组成。

    1 paint.setColor(resultBitmap != null ? resultColor : maskColor);
    2 canvas.drawRect(0, 0, width, frame.top, paint);
    3 canvas.drawRect(0, frame.top, frame.left, frame.bottom + 1, paint);
    4 canvas.drawRect(frame.right + 1, frame.top, width, frame.bottom + 1, paint);
    5 canvas.drawRect(0, frame.bottom + 1, width, height, paint);

        drawRect函数有五个参数,前四个参数构成两个坐标,组成一个矩形,后面一个画笔相关的。

       中间的全透明一块,也是由四个矩形组成,只是每个矩形很窄,才一两个像素,成了一条直线。

    1 paint.setColor(frameColor);
    2 canvas.drawRect(frame.left, frame.top, frame.right + 1, frame.top + 2, paint);
    3 canvas.drawRect(frame.left, frame.top + 2, frame.left + 2, frame.bottom - 1, paint);
    4 canvas.drawRect(frame.right - 1, frame.top, frame.right + 1, frame.bottom - 1, paint);
    5 canvas.drawRect(frame.left, frame.bottom - 1, frame.right + 1, frame.bottom + 1, paint);

       最中间的一条红色扫描线亦如此。

       onDraw()函数的最后一句是:

    1 postInvalidateDelayed(ANIMATION_DELAY, frame.left, frame.top, frame.right, frame.bottom);

        这一句很关键,postInvalidateDelayed函数主要用来在非UI线程中刷新UI界面,每个ANIMATION_DELAY时间,刷新指定的范围。所以会不停得调用onDraw函数,并在界面上添加绿色的特征点。在刚开始看这份代码时,没明白是如何添加绿色的标记点的。现在再看了一遍,大致明白了。在camera聚焦获取图片后,再使用core中的库进行解析,会得出特征点的坐标,最后通过ViewfinderResultPointCallback类回调,将特征点添加到ViewfinderView中的ArrayList容器中。

    1 public void foundPossibleResultPoint(ResultPoint point) {
    2 viewfinderView.addPossibleResultPoint(point);
    3 }

        这个函数特征点加入到possibleResultPoints中,由于对java不熟悉,不知道 “=” 的赋值对于List来说是浅拷贝,总在想possibleResultPoints对象没有被赋值,如何获取这些特征点了。后面才知道,这个“=”赋值,只是个浅拷贝。若要对这种预定义的集合实现深拷贝,可以使用构造函数,

    如:List<ResultPoint> points = new List<ResultPoint>(possibleResultPoints);

     1   public void addPossibleResultPoint(ResultPoint point) {
    2 List<ResultPoint> points = possibleResultPoints;
    3 synchronized (point) {
    4 points.add(point);
    5 int size = points.size();
    6 if (size > MAX_RESULT_POINTS) {
    7 // trim it
    8 points.subList(0, size - MAX_RESULT_POINTS / 2).clear();
    9 }
    10 }
    11 }

       如果想深入的查看view刷新的过程,具体实现,查看下面这个链接,这个系列文章写的很详细。

       AndroidBluetooth博客:View编程(2): invalidate()再探

  • 相关阅读:
    kibana 设置登录认证
    elasticsearch
    elasticsearch安装ik
    elasticsearch 安装head
    Docker 数据卷之进阶篇
    link快捷方式
    动作方法中 参数,Json
    spring单元测试
    js之cookie操作
    idea快捷键
  • 原文地址:https://www.cnblogs.com/liuan/p/2313488.html
Copyright © 2011-2022 走看看