C# Xamarin利用ZXing.Net.Mobile进行扫码的方法

 更新时间:2019年06月05日 11:25:15   作者:kiba518  
这篇文章主要介绍了C# Xamarin利用ZXing.Net.Mobile进行扫码的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

前言

很多人觉得Xamarin的开源少,没法用来开发项目。

但,实际上Xamarin已经有很多开源代码了;只要不是特别特殊的项目,基本上是都可以满足开发。

下面我们来看一下Xamarin中利用开源代码ZXing.Net.Mobile进行扫码。

引用ZXing.Net.Mobile

在Xamarin中进行扫码,需要先引用开源代码ZXing.Net.Mobile。

下面我们先打开Nuget,搜索ZXing.Net.Mobile,如下图:

然后我们点击右侧安装。

接着VisualStudio可能会提示我们这样的错误。

错误 检测到 Xamarin.Android.Support.Compat 存在版本冲突。直接从项目引用包可解决此问题。
SalesApp -> Xamarin.Android.Support.Design 25.4.0.2 -> Xamarin.Android.Support.Compat (= 25.4.0.2)
SalesApp -> ZXing.Net.Mobile 2.4.1 -> Xamarin.Android.Support.v4 25.4.0.1 -> Xamarin.Android.Support.Compat (= 25.4.0.1).

这是因为我们选择安装的ZXing.Net.Mobile依赖的DLL和我们项目的DLL对应不上。

解决办法很简单,选择下右侧ZXing.Net.Mobile的其他版本安装。

----------------------------------------------------------------------------------------------------

但在VisualStudio2017中有个非常坑的地方,就是nuget的引用会将相关dll都组织成一个包,然后一起引用,如下图:

看上去引用更简洁,按理说应该是好事,但这里有个问题就是,你引用的dll并没有被下载到本地。

也就是说,如果你网不好,或者断网,就别想调试了。

所以最终我还是选择把相关dll都下载下来,然后直接引用,相关dll如下图:

使用MobileBarcodeScanner扫码

本项目里,我们使用ZXing.Net.Mobile下的MobileBarcodeScanner类进行扫码。

下面简单介绍下MobileBarcodeScanner的使用方法。

首先,MobileBarcodeScanner类的实例需要调用Scan方法才会进行扫码。

而Scan方法被调用后,会自己打开了一个Activity。

而这个被打开的Activity的UI,就是,他对应的axml也是可以被自定义的。

自定义的方法就是Scan方法被调用前,为MobileBarcodeScanner类的CustomOverlay属性赋值。

有兴趣的同学可以查看下MobileBarcodeScanner的【源代码】,更深入的了解一些。

MobileBarcodeScanner的Scan方法有两个参数。

第一个参数是当前调用扫码的Activity,也可以传Null,传Null的话,MobileBarcodeScanner类里自己找Context为他赋值。

第二个参数是当前扫描的配置属性;为MobileBarcodeScanningOptions类型。

下面我们看调用代码。

View zxingOverlay;

MobileBarcodeScanner scanner;

protected override void OnCreate(Bundle savedInstanceState)

{

  base.OnCreate(savedInstanceState);

  SetContentView(Resource.Layout.MainActivity);

  

  Button btnScan = this.FindControl<Button>("btnScan");

  btnScan.Click += (s, e) =>

  { 

    scanner = new MobileBarcodeScanner(); 

    Task t = new Task(AutoScan);

    t.Start();

  }; 

}

async void AutoScan()

{ 

  scanner.UseCustomOverlay = true;

  zxingOverlay = LayoutInflater.FromContext(this).Inflate(Resource.Layout.ZxingOverlay, null); 

  ImageView ivScanning = zxingOverlay.FindViewById<ImageView>(Resource.Id.ivScanning); 

  Button btnCancelScan = zxingOverlay.FindViewById<Button>(Resource.Id.btnCancelScan);

  btnCancelScan.Click += (s, e) =>

  {

    if (scanner != null)

    {

      scanner.Cancel();

    }

  };

 

  zxingOverlay.Measure(MeasureSpecMode.Unspecified.GetHashCode(), MeasureSpecMode.Unspecified.GetHashCode());

  int width = zxingOverlay.MeasuredWidth;

  int height = zxingOverlay.MeasuredHeight; 

 

  // 从上到下的平移动画

  Animation verticalAnimation = new TranslateAnimation(0, 0, 0, height);

  verticalAnimation.Duration = 3000; // 动画持续时间

  verticalAnimation.RepeatCount = Animation.Infinite; // 无限循环

 

  // 播放动画

  ivScanning.Animation = verticalAnimation;

  verticalAnimation.StartNow();

      

  scanner.CustomOverlay = zxingOverlay;

  var mbs = MobileBarcodeScanningOptions.Default;

  mbs.AssumeGS1 = true;

  mbs.AutoRotate = true;

  mbs.DisableAutofocus = false;

  mbs.PureBarcode = false;

  mbs.TryInverted = true;

  mbs.TryHarder = true;

  mbs.UseCode39ExtendedMode = true;

  mbs.UseFrontCameraIfAvailable = false;

  mbs.UseNativeScanning = true;

 

  var result = await scanner.Scan(this, mbs);

  HandleScanResult(result);

 

} 

void HandleScanResult(ZXing.Result result)

{

  if (result != null && !string.IsNullOrEmpty(result.Text))

  {

    if (result.Text != null && result.Text.Trim().Length > 5)

    {

      this.RunOnUi(() => { this.ShowToast(result.Text); });

 

    }

    else

    {

      this.RunOnUi(() => { this.ShowToast("扫描无数据"); });

    }

  }

  else

  {

    this.RunOnUi(() => { this.ShowToast("扫描取消"); });

  }

  scanner.Cancel(); 

}

如上代码所示,我们把项目中写好的ZxingOverlay.axml赋值给了MobileBarcodeScanner的CustomOverlay属性。

并且在赋值前,我们为页面内的btnCancelScan按钮定义了取消事件;同时还定义了一个扫描动画。

因为定义动画时,页面还没加载出来,所以要取高度进行动画移动的话,需要先进行下预测。

代码中调用了Measure方法进行预测,然后再取出预测的高度和宽度MeasuredHeight,MeasuredWidth进行动画操作。

----------------------------------------------------------------------------------------------------

最终扫描界面如下图所示:

到此扫码使用就介绍完了。

框架代码已经传到Github上了,欢迎大家下载。Github地址:https://github.com/kiba518/KibaApp

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#开发的人脸左右相似度计算软件源码分析

    C#开发的人脸左右相似度计算软件源码分析

    这篇文章主要介绍了C#开发的人脸左右相似度计算软件,较为详细的分析了相似度计算的相关原理与具体实现技巧,需要的朋友可以参考下
    2015-04-04
  • C#实现对字符串中特定词出现次数的计数过程

    C#实现对字符串中特定词出现次数的计数过程

    LINQ(Language-Integrated Query)是C#和VB.NET中强大的查询语言,它可以用来查询集合、SQL数据库、XML文档等,在C#中,我们可以使用LINQ来简化对字符串中特定单词出现次数的计数过程,需要的朋友可以参考下
    2024-08-08
  • WPF实现动画效果的入门教程

    WPF实现动画效果的入门教程

    WPF是一种用于创建Windows客户端应用程序的UI框架,它让我们能够创建丰富的图形界面,包括各种各样的动画效果,下面我们就来看看如何利用wpf实现简单的动画效果吧
    2023-09-09
  • C#利用System.Threading.Thread.Sleep即时输出信息的详解

    C#利用System.Threading.Thread.Sleep即时输出信息的详解

    本篇文章是对C#利用System.Threading.Thread.Sleep即时输出信息进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C#使用CefSharp自定义缓存实现

    C#使用CefSharp自定义缓存实现

    本文介绍了如何使用C#和CefSharp自定义缓存实现减少Web应用程序的网络请求,提高应用程序性能。首先,本文讲解了CefSharp的基本知识和使用方法。然后,详细阐述了在CefSharp中实现自定义缓存的步骤和技巧。最后,通过实例演示了如何使用自定义缓存功能获取并展示网页数据
    2023-04-04
  • 为何Linq的Distinct实在是不给力

    为何Linq的Distinct实在是不给力

    本篇文章对Linq的Distinct进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 深入浅析C#泛型类型

    深入浅析C#泛型类型

    这篇文章主要介绍C#泛型类型,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • Visual Studio C#创建windows服务程序

    Visual Studio C#创建windows服务程序

    用Visual C#创建Windows服务不是一件困难的事,本文就将指导你一步一步创建一个Windows服务并使用它,本文主要介绍了Visual Studio C#创建windows服务程序,感兴趣的可以了解一下
    2024-01-01
  • C#实现复制数据库 C#将A数据库数据转到B数据库

    C#实现复制数据库 C#将A数据库数据转到B数据库

    这篇文章主要为大家详细介绍了C#复制数据库,将数据库数据转到另一个数据库,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • c#委托学习示例分享

    c#委托学习示例分享

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性,下面是c#委托示例
    2014-03-03

最新评论