`
孙国威
  • 浏览: 11203 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

条码扫描器竖屏工作

 
阅读更多

条码扫描器是非常棒的一个条码扫描工具,开源的,我查查、快拍二维码都是基于ZXing项目开发的,但是扫描时为横屏,而其他的应用大部分都是竖屏的,屏幕横竖对于用户体验比较不方便,如何让ZXing条码扫描竖屏工作呢?下面将我的方法交给大家:

  1. 修改AndroidManifest.xml:
    android:screenOrientation=”portrait”
  2. 修改CameraManager.java的getFramingRectInPreview():
    1.             rect . left  =  rect . left  *  cameraResolution . /  screenResolution . x ;
    2.             rect . right  =  rect . right  *  cameraResolution . /  screenResolution . x ;
    3.             rect . top  =  rect . top  *  cameraResolution . /  screenResolution . y ;
    4.             rect . bottom  =  rect . bottom  *  cameraResolution . /  screenResolution . y ;
  3. 修改CameraConfigurationManager.java中的setDesiredCameraParameters函数,在setZoom(parameters);后增加setDisplayOrientation(camera, 180); 在setDesiredCameraParameters函数外增加
    1.          private   void  setDisplayOrientation ( Camera  camera ,   int  angle )   {
    2.          Method  downPolymorphic ;
    3.          try   {
    4.             downPolymorphic  =  camera . getClass (). getMethod (
    5.                      “setDisplayOrientation” ,   new   Class []   {   int . class   });
    6.              if   ( downPolymorphic  !=   null )
    7.                 downPolymorphic . invoke ( camera ,   new   Object []   {  angle  });
    8.          }   catch   ( Exception  e1 )   {
    9.          }
    10.      }
  4. 修改DecodeHandler.java中的decode函数,将PlanarYUVLuminanceSource source = CameraManager.get().buildLuminanceSource(data, width, height);修改为
    1.          byte []  rotatedData  =   new   byte [ data . length ];
    2.          for   ( int  y  =   0 ;  y  <  height ;  y ++)   {
    3.              for   ( int  x  =   0 ;  x  <  width ;  x ++)
    4.                 rotatedData [ *  height  +  height  -  y  -   1 ]   =  data [ +  y  *  width ];
    5.          }
    6.          int  tmp  =  width ;   // Here we are swapping, that’s the difference to #11
    7.         width  =  height ;
    8.         height  =  tmp ;
    9.          PlanarYUVLuminanceSource  source  =   CameraManager . get (). buildLuminanceSource ( rotatedData ,  width ,  height );
到此问题已经解决,非常好,只是有一个问题:兼容性,我现在只确定了在我的M9上完美运行。但是我用的ZXing的版本是1.7的,对于之前的版本来讲当 手机扫描时,手机描绘的可能点与实际有偏差,所以需要修改ViewfinderView.java的onDraw函数,在 Collection<ResultPoint> currentPossible = possibleResultPoints;前增加

 

  1.              Rect  previewFrame  =   CameraManager . get (). getFramingRectInPreview ();
  2.              float  scaleX  =  frame . width ()   /   ( float )  previewFrame . width ();
  3.              float  scaleY  =  frame . height ()   /   ( float )  previewFrame . height ();
将本函数中下边的两个for语句中的canvas.drawCircle(frame.left + point.getX(), frame.top + point.getY(), 6.0f, paint);修改为canvas.drawCircle(frame.left + (int) (point.getX() * scaleX), frame.top + (int) (point.getY() * scaleY), 3.0f, paint);注意,是修改两个位置的for语句。
如果您还想将扫描的框变大一些,请修改CameraManager.java中的getFramingRect函数,将framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);修改为framingRect = new Rect(0, topOffset, leftOffset * 2 + width, topOffset + height);这种修改方法会将扫描框的左右两边与屏幕相平。
但是黑色的边框对于用户好像也不太好辨认,所以我又修改了边框的颜色,将ViewfinderView.java文件中的 paint.setColor(frameColor);修改为paint.setColor(laserColor);,这样就修改成了与扫描中间的一 样的颜色,下面贴个图吧!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics