C#-Xamarin利用ZXing.Net.Mobile進行掃碼

前言html

不少人以爲Xamarin的開源少,無法用來開發項目。git

但,實際上Xamarin已經有不少開源代碼了;只要不是特別特殊的項目,基本上是均可以知足開發。github

下面咱們來看一下Xamarin中利用開源代碼ZXing.Net.Mobile進行掃碼。sql

引用ZXing.Net.Mobile框架

在Xamarin中進行掃碼,須要先引用開源代碼ZXing.Net.Mobile。async

下面咱們先打開Nuget,搜索ZXing.Net.Mobile,以下圖:ide

而後咱們點擊右側安裝。動畫

接着VisualStudio可能會提示咱們這樣的錯誤。this

錯誤 檢測到 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). spa

這是由於咱們選擇安裝的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上了,歡迎你們下載。

相關文章:

C#-Xamarin的Android項目開發(三)——發佈、部署、打包

C#-Xamarin的Android項目開發(二)——控件應用

C#-Xamarin的Android項目開發(一)——建立項目

Github地址:https://github.com/kiba518/KibaApp

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

注:此文章爲原創,任何形式的轉載都請聯繫做者得到受權並註明出處!
若您以爲這篇文章還不錯,請點擊下方的推薦】,很是感謝!

 

相關文章
相關標籤/搜索